1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
26 from Noyau.N_CR import CR
29 def __init__(self,modules_cata):
30 self.modules_cata = modules_cata # tuple de modules...
32 self.state='undetermined'
33 self.entites_attributs = {}
34 self.entites_fils = []
35 self.build_entites_attributs()
36 self.build_entites_fils()
38 def build_entites_attributs(self):
41 def build_entites_fils(self):
42 niv_types = Accas.NIVEAU(nom="types",label="Liste des types")
43 niv_commandes = Accas.NIVEAU(nom="commandes",label="Liste des commandes")
44 self.entites_fils.append(make_commande_cata(niv_types,self))
45 self.entites_fils.append(make_commande_cata(niv_commandes,self))
46 for module_cata in self.modules_cata:
47 for e in dir(module_cata):
48 obj = getattr(module_cata,e)
50 self.entites_fils[1].register(make_commande_cata(obj,self.entites_fils[1]))
51 elif type(obj) == types.ClassType:
52 if issubclass(obj,Accas.ASSD):
53 self.entites_fils[0].register(TYPE_CATA(obj))
56 self.state = 'modified'
60 Methode pour generation d un rapport de validite
63 self.cr.debut="DEBUT CR validation : "
64 self.cr.fin="FIN CR validation :"
65 self.state = 'modified'
66 self.isvalid(cr='oui')
67 for fils in self.entites_fils[1].entites :
68 self.cr.add(fils.report())
71 def isvalid(self,cr='non'):
72 if self.state != 'unchanged':
74 for fils in self.entites_fils[1].entites_fils:
75 if not fils.isvalid():
79 self.state='unchanged'
82 def make_commande_cata(objet,pere):
83 if isinstance(objet,Accas.OPER):
84 return OPER_CATA(objet,pere,objet.nom)
85 elif isinstance(objet,Accas.PROC):
86 return PROC_CATA(objet,pere,objet.nom)
87 elif isinstance(objet,Accas.MACRO):
88 return MACRO_CATA(objet,pere,objet.nom)
89 elif isinstance(objet,Accas.FORM):
90 return MACRO_CATA(objet,pere,objet.nom)
91 elif isinstance(objet,Accas.NIVEAU):
92 return NIVEAU_CATA(objet,pere,objet.nom)
94 print "Erreur dans make_commande_cata : on cherche à évaluer un objet non référencé ",objet
96 def make_mc_cata(objet,pere,nom=''):
97 if isinstance(objet,Accas.BLOC):
98 return BLOC_CATA(objet,pere,nom)
99 elif isinstance(objet,Accas.FACT):
100 return FACT_CATA(objet,pere,nom)
101 elif isinstance(objet,Accas.SIMP):
102 return SIMP_CATA(objet,pere,nom)
104 print "Erreur dans make_mc_cata : on cherche à évaluer un objet non référencé ",objet
107 def __init__(self,objet):
109 self.nom = objet.__name__
111 def isvalid(self,cr='non'):
114 def get_valeur_attribut(self,nom_attr):
115 if nom_attr == 'nom':return self.nom
121 def __init__(self,objet,pere,nom):
126 self.state='undetermined'
127 self.entites_fils = []
128 self.entites_attributs = {}
129 self.build_entites_attributs()
130 self.build_entites_fils()
134 s=self.__class__.__name__+' : '+self.nom
137 def build_entites_attributs(self):
138 for attribut in self.attributs:
139 if hasattr(self.objet,attribut):
140 self.entites_attributs[attribut]=ATTR_CATA(attribut,getattr(self.objet,attribut))
142 if self.attributs_defauts.has_key(attribut):
143 self.entites_attributs[attribut]=ATTR_CATA(attribut,self.attributs_defauts[attribut])
145 self.entites_attributs[attribut]=ATTR_CATA(attribut,None)
147 def build_entites_fils(self):
148 for k,v in self.objet.entites.items():
149 self.entites_fils.append(make_mc_cata(v,self,nom=k))
151 def get_valeur_attribut(self,nom_attr):
152 if nom_attr in self.entites_attributs.keys():
153 return self.entites_attributs[nom_attr].valeur
154 elif nom_attr in self.attributs_defauts.keys():
155 return self.attributs_defauts[nom_attr]
156 elif nom_attr == 'domaine_validité':
157 if self.entites_attributs['into'].valeur != None :
162 def isvalid(self,cr='non'):
163 if self.state =='unchanged':
167 if hasattr(self,'valid'):
168 old_valid = self.valid
171 # on teste self lui-meme
172 if self.nom == '' or self.nom == None : valid=0
173 # on teste les attributs
174 for attribut in self.entites_attributs.values():
175 if not attribut.isvalid() : valid =0
178 for fils in self.entites_fils:
179 if not fils.isvalid(): valid = 0
182 self.state = 'unchanged'
184 if old_valid != self.valid : self.init_modif_up()
187 def init_modif_up(self):
188 self.pere.state='modified'
192 self.cr.debut="Debut "+self.__class__.__name__+' : '+self.nom
193 self.cr.fin = "Fin "+self.__class__.__name__+' : '+self.nom
194 self.isvalid(cr='oui')
195 for attribut in self.entites_attributs.values():
196 self.cr.add(attribut.report())
197 for fils in self.entites_fils :
198 self.cr.add(fils.report())
201 def set_valeur_attribut(self,nom_attr,valeur):
203 Affecte la valeur 'valeur' à l'attribut de nom 'nom-attr'
205 # il faudra être prudent sur les changements de nom : interdire de changer
206 # le nom d'un mot-clé qui serait utilisé dans une règle ???
207 self.entites_attributs[nom_attr].valeur = valeur
209 def addentite(self,name,pos):
211 Permet d'ajouter un nouveau fils a self
214 if name == 'new_simp':
215 objet = Accas.SIMP(typ=('bidon',))
216 objet_cata = make_mc_cata(objet,self)
217 self.entites_fils.insert(pos,objet_cata)
220 def init_modif(self):
221 self.state = 'modified'
222 if hasattr(self,'pere'):
223 self.pere.init_modif()
225 def verif_nom(self,cr='non'):
227 Méthode appelée par EFICAS et ACCAS
228 Booléenne : retourne 1 si l'attribut nom est valide, 0 sinon
230 if self.entites_attributs['nom'].valeur == '':
231 if cr == 'oui' : self.cr.fatal("L'objet de type %s n'est pas nommé" %self.__class__.__name__)
235 def verif_defaut(self,cr='non'):
237 Méthode de vérification de validité du défaut
239 defaut = self.get_valeur_attribut('defaut')
240 if self.get_valeur_attribut('domaine_validite') == 'discret' :
241 if defaut not in self.get_valeur_attribut('into'):
242 if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas autorisée" %str(defaut))
246 if defaut == None : return 1
247 typ = self.get_valeur_attribut('type')
250 if type(defaut) == types.StringType : return 1
251 val_min = self.get_valeur_attribut('val_min')
252 val_max = self.get_valeur_attribut('val_max')
253 # on attend un reel ?
255 if type(defaut) == types.StringType:
257 nb = string.atof(defaut)
264 if val_min != '**' : test = (nb >= val_min)
265 if val_max != '**' : test = test*(nb <= val_max)
267 # on attend un entier ?
269 if type(defaut)==types.StringType:
271 nb = string.atoi(defaut)
278 if val_min != '**' : test = (nb >= val_min)
279 if val_max != '**' : test = test*(nb <= val_max)
281 # si on passe par là, c'est que l'on n'a pas su évaluer defaut
282 if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas une valeur permise" %str(defaut))
285 def verif_val_min(self,cr='non'):
287 Méthode de vérification de val_min.
288 Booléenne : retourne 1 si val_min est valide, 0 sinon
290 val_min = self.get_valeur_attribut('val_min')
292 if cr == 'oui' : self.cr.fatal('val_min ne peut valoir None')
294 if val_min == '**': return 1
295 # val_min doit à ce stade être :
296 # - soit un entier ou un réel
297 # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
298 if type(val_min) == types.StringType :
300 val_min = string.atoi(val_min)
303 val_min = string.atof(val_min)
305 if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_min))
307 # A ce stade, val_min doit être un entier ou un réel : on vérifie ...
308 if type(val_min) not in (types.IntType,types.FloatType) :
309 if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_min))
311 # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
312 val_max = self.get_valeur_attribut('val_max')
313 if val_max == '**' or val_min < val_max : return 1
314 # erreur : val_min est supérieur à val_max !!!
315 if cr == 'oui' : self.cr.fatal("%s n'est pas inférieur à %s" %(str(val_min),str(val_max)))
318 def verif_val_max(self,cr='non'):
320 Méthode de vérification de val_max.
321 Booléenne : retourne 1 si val_max est valide, 0 sinon
323 val_max = self.get_valeur_attribut('val_max')
325 if cr == 'oui' : self.cr.fatal('val_max ne peut valoir None')
327 if val_max == '**': return 1
328 # val_max doit à ce stade être :
329 # - soit un entier ou un réel
330 # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
331 if type(val_max) == types.StringType :
333 val_max = string.atoi(val_max)
336 val_max = string.atof(val_max)
338 if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_max))
340 # A ce stade, val_max doit être un entier ou un réel : on vérifie ...
341 if type(val_max) not in (types.IntType,types.FloatType) :
342 if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_max))
344 # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
345 val_min = self.get_valeur_attribut('val_min')
346 if val_min == '**' or val_min < val_max : return 1
347 # erreur : val_min est supérieur à val_max !!!
348 if cr == 'oui' : self.cr.fatal("%s n'est pas supérieur à %s" %(str(val_max),str(val_min)))
351 class OPER_CATA(OBJET_CATA):
352 attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
354 class PROC_CATA(OBJET_CATA):
355 attributs = ['ang','docu','fr','niveau','nom','op','op_init','regles','repetable']
357 class MACRO_CATA(OBJET_CATA):
358 attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
360 class BLOC_CATA(OBJET_CATA):
361 attributs = ['ang','condition','docu','fr','nom','regles']
363 class FACT_CATA(OBJET_CATA):
364 attributs=['ang','defaut','docu','fr','max','min','nom','regles','statut']
366 class SIMP_CATA(OBJET_CATA):
367 attributs=['ang','defaut','docu','fr','homo','into','max','min','nom','position','statut','type','val_min','val_max']
368 attributs_defauts={'ang':'','defaut':None,'fr':'','homo':1,'into':None,'max':1,'min':1,'nom' : '','position':'local',
369 'regles':None,'statut':'f','type':None,'val_min':'**','val_max':'**','docu':''}
371 def build_entites_fils(self):
374 def isvalid(self,cr='non'):
376 Mde appelpar l'externe (EFICAS et ACCAS).
377 Boolne : retourne 1 si l'objet est valide, 0 sinon
379 if self.state == 'unchanged':
383 valid = valid*self.verif_nom(cr=cr)
384 valid = valid*self.verif_defaut(cr=cr)
385 valid = valid*self.verif_val_min(cr=cr)*self.verif_val_max(cr=cr)
386 if hasattr(self,'valid'):
387 old_valid = self.valid
391 self.state='unchanged'
393 if old_valid != self.valid : self.init_modif_up()
396 class NIVEAU_CATA(OBJET_CATA):
397 def __init__(self,objet,pere,nom):
400 self.state = 'undetermined'
404 self.entites_attributs = {}
406 def register(self,fils):
408 Enregistre la commande 굡pe :
409 - si editmode = 0 : on est en mode relecture d'un fichier de commandes
410 auquel cas on ajoute etape a fin de la liste self.etapes
411 - si editmode = 1 : on est en mode ajout d'굡pe depuis eficas auquel cas
412 cette mode ne fait rien, c'est addentité enregistre etape ࡬a bonne place
415 self.entites_fils.append(fils)
417 def unregister(self,etape):
418 self.entites_fils.remove(etape)
420 def isvalid(self,cr='non'):
421 """ Mode boolne qui retourne 0 si le niveau est invalide, 1 sinon """
422 if self.state == 'unchanged':
426 if len(self.entites_fils) == 0:
427 #valid = self.Accas.valide_vide
430 for commande in self.entites_fils :
431 if hasattr(commande,'isvalid'):
432 if not commande.isvalid() :
436 print str(commande)," n'a pas de methode isvalid"
437 if hasattr(self,'valid'):
438 old_valid = self.valid
442 self.state='unchanged'
444 if old_valid != self.valid : self.init_modif_up()
448 class ATTR_CATA(OBJET_CATA):
449 def __init__(self,nom,valeur=None):
453 self.state='undetermined'
454 self.entites_attributs={}
457 def isvalid(self,cr='non'):
461 return isinstance(cmd,Accas.OPER) or isinstance(cmd,Accas.PROC) or isinstance(cmd,Accas.MACRO) or isinstance(cmd,Accas.FORM)