1 #@ MODIF V_MACRO_ETAPE Validation DATE 09/10/2002 AUTEUR DURAND C.DURAND
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 # ======================================================================
22 Ce module contient la classe mixin MACRO_ETAPE qui porte les méthodes
23 nécessaires pour réaliser la validation d'un objet de type MACRO_ETAPE
26 Une classe mixin porte principalement des traitements et est
27 utilisée par héritage multiple pour composer les traitements.
30 import string,types,sys
36 from Noyau.N_Exception import AsException
37 from Noyau.N_utils import AsType
39 class MACRO_ETAPE(V_ETAPE.ETAPE):
43 def isvalid(self,sd='oui',cr='non'):
45 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
46 peut etre appelée selon plusieurs modes en fonction de la valeur
49 Si cr vaut oui elle crée en plus un compte-rendu.
51 Cette méthode a plusieurs fonctions :
53 - mettre à jour l'état de self (update)
55 - retourner un indicateur de validité 0=non, 1=oui
57 - produire un compte-rendu : self.cr
60 if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
61 if self.state == 'unchanged' :
65 # on teste les mots cles de la commande
66 for child in self.mc_liste :
67 if not child.isvalid():
70 # on teste les règles de la commande
71 text_erreurs,test_regles = self.verif_regles()
73 if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
75 if self.reste_val != {}:
77 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
80 # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'état de self
81 # on retourne simplement l'indicateur valid
83 if hasattr(self,'valid'):
84 old_valid = self.valid
87 # on teste, si elle existe, le nom de la sd (sa longueur doit etre <= 8 caractères)
89 # la SD existe déjà : on regarde son nom
90 if self.sd.get_name() != None :
91 if len(self.sd.nom) > 8 :
93 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
95 if string.find(self.sd.nom,'sansnom') != -1 :
96 # la SD est 'sansnom' : --> erreur
98 self.cr.fatal("Pas de nom pour le concept retourné")
100 elif string.find(self.sd.nom,'SD_') != -1 :
101 # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
103 self.cr.fatal("Pas de nom pour le concept retourné")
106 valid = self.update_sdprod(cr)
107 # Si la macro comprend des etapes internes, on teste leur validite
108 for e in self.etapes:
113 self.state = 'unchanged'
115 if old_valid != self.valid : self.init_modif_up()
118 def update_sdprod(self,cr='non'):
120 Cette méthode met à jour le concept produit en fonction des conditions initiales :
122 1- Il n'y a pas de concept retourné (self.definition.sd_prod == None)
124 2- Le concept retourné n existait pas (self.sd == None)
126 3- Le concept retourné existait. On change alors son type ou on le supprime
128 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
130 sd_prod=self.definition.sd_prod
131 # On memorise le type retourné dans l attribut typret
133 if type(sd_prod) == types.FunctionType:
134 # Type de concept retourné calculé
135 d=self.cree_dict_valeurs(self.mc_liste)
137 # la sd_prod d'une macro a l'objet lui meme en premier argument
138 # contrairement à une ETAPE ou PROC_ETAPE
139 # Comme sd_prod peut invoquer la méthode type_sdprod qui ajoute
140 # les concepts produits dans self.sdprods, il faut le mettre à zéro
142 sd_prod= apply(sd_prod,(self,),d)
144 # Erreur pendant le calcul du type retourné
145 if CONTEXT.debug:traceback.print_exc()
148 l=traceback.format_exception(sys.exc_info()[0],
151 self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
153 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
156 # Un concept reutilise a ete specifie
157 if AsType(self.reuse) != sd_prod:
158 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
160 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
161 # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
163 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
165 if valid:self.sd=self.reuse
167 if sd_prod == None:# Pas de concept retourné
168 # Que faut il faire de l eventuel ancien sd ?
172 # Un sd existe deja, on change son type
173 self.sd.__class__=sd_prod
176 # Le sd n existait pas , on ne le crée pas
178 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
180 if self.definition.reentrant == 'o':
181 if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
183 #self.reuse = self.sd
188 Methode pour la generation d un rapport de validation
190 V_ETAPE.ETAPE.report(self)
191 for e in self.etapes :
192 self.cr.add(e.report())