1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
25 from Noyau.N_CR import CR
28 def __init__(self,modules_cata):
29 self.modules_cata = modules_cata # tuple de modules...
31 self.state='undetermined'
32 self.entites_attributs = {}
33 self.entites_fils = []
34 self.build_entites_attributs()
35 self.build_entites_fils()
37 def build_entites_attributs(self):
40 def build_entites_fils(self):
41 niv_types = Accas.NIVEAU(nom="types",label="Liste des types")
42 niv_commandes = Accas.NIVEAU(nom="commandes",label="Liste des commandes")
43 self.entites_fils.append(make_commande_cata(niv_types,self))
44 self.entites_fils.append(make_commande_cata(niv_commandes,self))
45 for module_cata in self.modules_cata:
46 for e in dir(module_cata):
47 obj = getattr(module_cata,e)
49 self.entites_fils[1].register(make_commande_cata(obj,self.entites_fils[1]))
50 elif type(obj) == types.ClassType:
51 if issubclass(obj,Accas.ASSD):
52 self.entites_fils[0].register(TYPE_CATA(obj))
55 self.state = 'modified'
59 Methode pour generation d un rapport de validite
62 self.cr.debut="DEBUT CR validation : "
63 self.cr.fin="FIN CR validation :"
64 self.state = 'modified'
65 self.isvalid(cr='oui')
66 for fils in self.entites_fils[1].entites :
67 self.cr.add(fils.report())
70 def isvalid(self,cr='non'):
71 if self.state != 'unchanged':
73 for fils in self.entites_fils[1].entites_fils:
74 if not fils.isvalid():
78 self.state='unchanged'
81 def make_commande_cata(objet,pere):
82 if isinstance(objet,Accas.OPER):
83 return OPER_CATA(objet,pere,objet.nom)
84 elif isinstance(objet,Accas.PROC):
85 return PROC_CATA(objet,pere,objet.nom)
86 elif isinstance(objet,Accas.MACRO):
87 return MACRO_CATA(objet,pere,objet.nom)
88 elif isinstance(objet,Accas.FORM):
89 return MACRO_CATA(objet,pere,objet.nom)
90 elif isinstance(objet,Accas.NIVEAU):
91 return NIVEAU_CATA(objet,pere,objet.nom)
93 print "Erreur dans make_commande_cata : on cherche à évaluer un objet non référencé ",objet
95 def make_mc_cata(objet,pere,nom=''):
96 if isinstance(objet,Accas.BLOC):
97 return BLOC_CATA(objet,pere,nom)
98 elif isinstance(objet,Accas.FACT):
99 return FACT_CATA(objet,pere,nom)
100 elif isinstance(objet,Accas.SIMP):
101 return SIMP_CATA(objet,pere,nom)
103 print "Erreur dans make_mc_cata : on cherche à évaluer un objet non référencé ",objet
106 def __init__(self,objet):
108 self.nom = objet.__name__
110 def isvalid(self,cr='non'):
113 def get_valeur_attribut(self,nom_attr):
114 if nom_attr == 'nom':return self.nom
120 def __init__(self,objet,pere,nom):
125 self.state='undetermined'
126 self.entites_fils = []
127 self.entites_attributs = {}
128 self.build_entites_attributs()
129 self.build_entites_fils()
133 s=self.__class__.__name__+' : '+self.nom
136 def build_entites_attributs(self):
137 for attribut in self.attributs:
138 if hasattr(self.objet,attribut):
139 self.entites_attributs[attribut]=ATTR_CATA(attribut,getattr(self.objet,attribut))
141 if self.attributs_defauts.has_key(attribut):
142 self.entites_attributs[attribut]=ATTR_CATA(attribut,self.attributs_defauts[attribut])
144 self.entites_attributs[attribut]=ATTR_CATA(attribut,None)
146 def build_entites_fils(self):
147 for k,v in self.objet.entites.items():
148 self.entites_fils.append(make_mc_cata(v,self,nom=k))
150 def get_valeur_attribut(self,nom_attr):
151 if nom_attr in self.entites_attributs.keys():
152 return self.entites_attributs[nom_attr].valeur
153 elif nom_attr in self.attributs_defauts.keys():
154 return self.attributs_defauts[nom_attr]
155 elif nom_attr == 'domaine_validité':
156 if self.entites_attributs['into'].valeur != None :
161 def isvalid(self,cr='non'):
162 if self.state =='unchanged':
166 if hasattr(self,'valid'):
167 old_valid = self.valid
170 # on teste self lui-meme
171 if self.nom == '' or self.nom == None : valid=0
172 # on teste les attributs
173 for attribut in self.entites_attributs.values():
174 if not attribut.isvalid() : valid =0
177 for fils in self.entites_fils:
178 if not fils.isvalid(): valid = 0
181 self.state = 'unchanged'
183 if old_valid != self.valid : self.init_modif_up()
186 def init_modif_up(self):
187 self.pere.state='modified'
191 self.cr.debut="Debut "+self.__class__.__name__+' : '+self.nom
192 self.cr.fin = "Fin "+self.__class__.__name__+' : '+self.nom
193 self.isvalid(cr='oui')
194 for attribut in self.entites_attributs.values():
195 self.cr.add(attribut.report())
196 for fils in self.entites_fils :
197 self.cr.add(fils.report())
200 def set_valeur_attribut(self,nom_attr,valeur):
202 Affecte la valeur 'valeur' à l'attribut de nom 'nom-attr'
204 # il faudra être prudent sur les changements de nom : interdire de changer
205 # le nom d'un mot-clé qui serait utilisé dans une règle ???
206 self.entites_attributs[nom_attr].valeur = valeur
208 def addentite(self,name,pos):
210 Permet d'ajouter un nouveau fils a self
213 if name == 'new_simp':
214 objet = Accas.SIMP(typ=('bidon',))
215 objet_cata = make_mc_cata(objet,self)
216 self.entites_fils.insert(pos,objet_cata)
219 def init_modif(self):
220 self.state = 'modified'
221 if hasattr(self,'pere'):
222 self.pere.init_modif()
224 def verif_nom(self,cr='non'):
226 Méthode appelée par EFICAS et ACCAS
227 Booléenne : retourne 1 si l'attribut nom est valide, 0 sinon
229 if self.entites_attributs['nom'].valeur == '':
230 if cr == 'oui' : self.cr.fatal("L'objet de type %s n'est pas nommé" %self.__class__.__name__)
234 def verif_defaut(self,cr='non'):
236 Méthode de vérification de validité du défaut
238 defaut = self.get_valeur_attribut('defaut')
239 if self.get_valeur_attribut('domaine_validite') == 'discret' :
240 if defaut not in self.get_valeur_attribut('into'):
241 if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas autorisée" %str(defaut))
245 if defaut == None : return 1
246 typ = self.get_valeur_attribut('type')
249 if type(defaut) == types.StringType : return 1
250 val_min = self.get_valeur_attribut('val_min')
251 val_max = self.get_valeur_attribut('val_max')
252 # on attend un reel ?
254 if type(defaut) == types.StringType:
256 nb = string.atof(defaut)
263 if val_min != '**' : test = (nb >= val_min)
264 if val_max != '**' : test = test*(nb <= val_max)
266 # on attend un entier ?
268 if type(defaut)==types.StringType:
270 nb = string.atoi(defaut)
277 if val_min != '**' : test = (nb >= val_min)
278 if val_max != '**' : test = test*(nb <= val_max)
280 # si on passe par là, c'est que l'on n'a pas su évaluer defaut
281 if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas une valeur permise" %str(defaut))
284 def verif_val_min(self,cr='non'):
286 Méthode de vérification de val_min.
287 Booléenne : retourne 1 si val_min est valide, 0 sinon
289 val_min = self.get_valeur_attribut('val_min')
291 if cr == 'oui' : self.cr.fatal('val_min ne peut valoir None')
293 if val_min == '**': return 1
294 # val_min doit à ce stade être :
295 # - soit un entier ou un réel
296 # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
297 if type(val_min) == types.StringType :
299 val_min = string.atoi(val_min)
302 val_min = string.atof(val_min)
304 if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_min))
306 # A ce stade, val_min doit être un entier ou un réel : on vérifie ...
307 if type(val_min) not in (types.IntType,types.FloatType) :
308 if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_min))
310 # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
311 val_max = self.get_valeur_attribut('val_max')
312 if val_max == '**' or val_min < val_max : return 1
313 # erreur : val_min est supérieur à val_max !!!
314 if cr == 'oui' : self.cr.fatal("%s n'est pas inférieur à %s" %(str(val_min),str(val_max)))
317 def verif_val_max(self,cr='non'):
319 Méthode de vérification de val_max.
320 Booléenne : retourne 1 si val_max est valide, 0 sinon
322 val_max = self.get_valeur_attribut('val_max')
324 if cr == 'oui' : self.cr.fatal('val_max ne peut valoir None')
326 if val_max == '**': return 1
327 # val_max doit à ce stade être :
328 # - soit un entier ou un réel
329 # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
330 if type(val_max) == types.StringType :
332 val_max = string.atoi(val_max)
335 val_max = string.atof(val_max)
337 if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_max))
339 # A ce stade, val_max doit être un entier ou un réel : on vérifie ...
340 if type(val_max) not in (types.IntType,types.FloatType) :
341 if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_max))
343 # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
344 val_min = self.get_valeur_attribut('val_min')
345 if val_min == '**' or val_min < val_max : return 1
346 # erreur : val_min est supérieur à val_max !!!
347 if cr == 'oui' : self.cr.fatal("%s n'est pas supérieur à %s" %(str(val_max),str(val_min)))
350 class OPER_CATA(OBJET_CATA):
351 attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
353 class PROC_CATA(OBJET_CATA):
354 attributs = ['ang','docu','fr','niveau','nom','op','op_init','regles','repetable']
356 class MACRO_CATA(OBJET_CATA):
357 attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
359 class BLOC_CATA(OBJET_CATA):
360 attributs = ['ang','condition','docu','fr','nom','regles']
362 class FACT_CATA(OBJET_CATA):
363 attributs=['ang','defaut','docu','fr','max','min','nom','regles','statut']
365 class SIMP_CATA(OBJET_CATA):
366 attributs=['ang','defaut','docu','fr','homo','into','max','min','nom','position','statut','type','val_min','val_max']
367 attributs_defauts={'ang':'','defaut':None,'fr':'','homo':1,'into':None,'max':1,'min':1,'nom' : '','position':'local',
368 'regles':None,'statut':'f','type':None,'val_min':'**','val_max':'**','docu':''}
370 def build_entites_fils(self):
373 def isvalid(self,cr='non'):
375 Mde appelpar l'externe (EFICAS et ACCAS).
376 Boolne : retourne 1 si l'objet est valide, 0 sinon
378 if self.state == 'unchanged':
382 valid = valid*self.verif_nom(cr=cr)
383 valid = valid*self.verif_defaut(cr=cr)
384 valid = valid*self.verif_val_min(cr=cr)*self.verif_val_max(cr=cr)
385 if hasattr(self,'valid'):
386 old_valid = self.valid
390 self.state='unchanged'
392 if old_valid != self.valid : self.init_modif_up()
395 class NIVEAU_CATA(OBJET_CATA):
396 def __init__(self,objet,pere,nom):
399 self.state = 'undetermined'
403 self.entites_attributs = {}
405 def register(self,fils):
407 Enregistre la commande 굡pe :
408 - si editmode = 0 : on est en mode relecture d'un fichier de commandes
409 auquel cas on ajoute etape a fin de la liste self.etapes
410 - si editmode = 1 : on est en mode ajout d'굡pe depuis eficas auquel cas
411 cette mode ne fait rien, c'est addentité enregistre etape ࡬a bonne place
414 self.entites_fils.append(fils)
416 def unregister(self,etape):
417 self.entites_fils.remove(etape)
419 def isvalid(self,cr='non'):
420 """ Mode boolne qui retourne 0 si le niveau est invalide, 1 sinon """
421 if self.state == 'unchanged':
425 if len(self.entites_fils) == 0:
426 #valid = self.Accas.valide_vide
429 for commande in self.entites_fils :
430 if hasattr(commande,'isvalid'):
431 if not commande.isvalid() :
435 print str(commande)," n'a pas de methode isvalid"
436 if hasattr(self,'valid'):
437 old_valid = self.valid
441 self.state='unchanged'
443 if old_valid != self.valid : self.init_modif_up()
447 class ATTR_CATA(OBJET_CATA):
448 def __init__(self,nom,valeur=None):
452 self.state='undetermined'
453 self.entites_attributs={}
456 def isvalid(self,cr='non'):
460 return isinstance(cmd,Accas.OPER) or isinstance(cmd,Accas.PROC) or isinstance(cmd,Accas.MACRO) or isinstance(cmd,Accas.FORM)