1 #@ MODIF N_ASSD Noyau DATE 25/10/2011 AUTEUR COURTOIS M.COURTOIS
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE COURTOIS M.COURTOIS
4 # CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2011 EDF R&D WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
10 # (AT YOUR OPTION) ANY LATER VERSION.
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
19 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
26 from N_utils import import_object
27 from N_info import message, SUPERV
31 Classe de base pour definir des types de structures de donnees ASTER
32 equivalent d un concept ASTER
36 def __init__(self, etape=None, sd=None, reg='oui'):
38 reg est un paramètre qui vaut oui ou non :
39 - si oui (défaut) : on enregistre la SD auprès du JDC
40 - si non : on ne l'enregistre pas
46 self.parent = etape.parent
48 self.parent = CONTEXT.get_current_step()
50 self.jdc = self.parent.get_jdc_root()
57 self.id = self.parent.reg_sd(self)
59 self.id = self.parent.o_register(self)
60 # permet de savoir si le concept a été calculé (1) ou non (0)
62 # permet de savoir si le catalogue de SD a déjà été supprimé (1) ou non (0)
64 # attributs pour le Catalogue de Structure de Données Jeveux
65 # "self.cata_sdj" est un attribut de classe
66 #XXX si on nomme ces attributs _sdj/_class_sdj, pb en poursuite :
67 #XXX dans rebuild_sd, self n'a pas ces attributs qui ne sont donc
68 #XXX pas recopiés... !?
69 self.ptr_class_sdj = None
73 """Retourne le catalogue de SD associé au concept."""
74 if self.ptr_sdj is None:
75 cata_sdj = getattr(self, 'cata_sdj', None)
76 assert cata_sdj, "L'attribut 'cata_sdj' doit être défini pour la classe %s" \
77 % self.__class__.__name__
78 assert self.nom, "L'attribut 'nom' n'a pas été renseigné !"
79 if self.ptr_class_sdj is None:
80 self.ptr_class_sdj = import_object(cata_sdj)
81 self.ptr_sdj = self.ptr_class_sdj(nomj=self.nom)
85 """Suppression du catalogue de SD."""
86 if self.ptr_sdj is not None:
87 self.ptr_sdj.supprime(True)
89 self.ptr_class_sdj = None
91 sdj = property(_get_sdj, None, _del_sdj)
94 def __getitem__(self,key):
95 return self.etape[key]
97 def set_name(self, nom):
98 """Positionne le nom de self (et appelle sd_init)
102 def change_type(self, new_type):
103 """Type connu a posteriori (type CO)."""
104 self.__class__ = new_type
108 Retourne le nom de self, éventuellement en le demandant au JDC
112 self.nom = self.parent.get_name(self) or self.id
115 if self.nom.find('sansnom') != -1 or self.nom == '':
121 Cassage des boucles de références pour destruction du JDC
129 def supprime_sd(self):
130 """Supprime la partie du catalogue de SD."""
131 # 'del self.sdj' appellerait la méthode '_get_sdj()'...
135 message.debug(SUPERV, "__del__ ASSD %s <%s>", getattr(self, 'nom', 'unknown'), self)
137 def accept(self,visitor):
139 Cette methode permet de parcourir l'arborescence des objets
140 en utilisant le pattern VISITEUR
142 visitor.visitASSD(self)
144 def __getstate__(self):
146 Cette methode permet de pickler les objets ASSD
147 Ceci est possible car on coupe les liens avec les objets
148 parent, etape et jdc qui conduiraient à pickler de nombreux
149 objets inutiles ou non picklables.
150 En sortie, l'objet n'est plus tout à fait le même !
152 d = self.__dict__.copy()
153 for key in ('parent', 'etape', 'jdc'):
161 def accessible(self):
162 """Dit si on peut acceder aux "valeurs" (jeveux) de l'ASSD.
164 if CONTEXT.debug: print '| accessible ?', self.nom
165 is_accessible = CONTEXT.get_current_step().sd_accessible()
166 if CONTEXT.debug: print ' `- is_accessible =', repr(is_accessible)
171 """Conserver uniquement pour la compatibilite avec le catalogue v9 dans eficas."""
173 if not hasattr(self, 'jdc') or self.jdc == None:
176 val = self.jdc.par_lot
179 def rebuild_sd(self):
180 """Conserver uniquement pour la compatibilite avec le catalogue v10 dans eficas."""
184 def __convert__(cls, valeur):
185 # On accepte les vraies ASSD et les objets 'entier' et 'reel'
186 # qui font tout pour se faire passer pour de vrais entiers/réels.
187 if isinstance(valeur, ASSD) or type(valeur) in (int, float):
189 raise ValueError("On attend un objet concept.")
190 __convert__ = classmethod(__convert__)
193 class not_checked(ASSD):
194 def __convert__(cls, valeur):
196 __convert__ = classmethod(__convert__)