1 #@ MODIF V_ETAPE Validation DATE 06/01/2003 AUTEUR ASSIRE A.ASSIRE
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 ETAPE qui porte les méthodes
23 nécessaires pour réaliser la validation d'un objet de type 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
35 from Noyau.N_Exception import AsException
36 from Noyau.N_utils import AsType
38 class ETAPE(V_MCCOMPO.MCCOMPO):
42 def isvalid(self,sd='oui',cr='non'):
44 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
45 peut etre appelée selon plusieurs modes en fonction de la valeur
48 Si cr vaut oui elle crée en plus un compte-rendu.
50 Cette méthode a plusieurs fonctions :
52 - mettre à jour l'état de self (update)
54 - retourner un indicateur de validité 0=non, 1=oui
56 - produire un compte-rendu : self.cr
59 if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
60 if self.state == 'unchanged' :
64 # on teste les enfants
65 for child in self.mc_liste :
66 if not child.isvalid():
69 # on teste les règles de self
70 text_erreurs,test_regles = self.verif_regles()
72 if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
74 if self.reste_val != {}:
76 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
79 # Dans ce cas, on ne teste qu'une validité partielle (sans tests sur le concept produit)
80 # Conséquence : on ne change pas l'état ni l'attribut valid, on retourne simplement
81 # l'indicateur de validité valid
84 # On complète les tests avec ceux sur le concept produit
86 if hasattr(self,'valid'):
87 old_valid = self.valid
92 # Le concept produit n'existe pas => erreur
93 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
96 # on teste, si elle existe, le nom de la sd (sa longueur doit etre <= 8 caractères)
97 # la SD existe déjà : on regarde son nom
98 if self.sd.nom != None :
99 if len(self.sd.nom) > 8 and self.jdc.definition.code == 'ASTER' :
101 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
103 if string.find(self.sd.nom,'sansnom') != -1 :
104 # la SD est 'sansnom' : --> erreur
106 self.cr.fatal("Pas de nom pour le concept retourné")
108 elif string.find(self.sd.nom,'SD_') != -1 :
109 # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
111 self.cr.fatal("Pas de nom pour le concept retourné")
114 valid = self.update_sdprod(cr)
116 self.state = 'unchanged'
118 if old_valid != self.valid : self.init_modif_up()
121 def update_sdprod(self,cr='non'):
123 Cette méthode met à jour le concept produit en fonction des conditions initiales :
125 1- Il n'y a pas de concept retourné (self.definition.sd_prod == None)
127 2- Le concept retourné n existait pas (self.sd == None)
129 3- Le concept retourné existait. On change alors son type ou on le supprime
131 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
133 sd_prod=self.definition.sd_prod
134 if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
135 d=self.cree_dict_valeurs(self.mc_liste)
137 sd_prod= apply(sd_prod,(),d)
139 # Erreur pendant le calcul du type retourné
140 if CONTEXT.debug:traceback.print_exc()
143 l=traceback.format_exception(sys.exc_info()[0],
146 self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
148 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
151 if AsType(self.reuse) != sd_prod:
152 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
155 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
156 # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
158 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
160 if valid:self.sd=self.reuse
162 if sd_prod == None:# Pas de concept retourné
163 # Que faut il faire de l eventuel ancien sd ?
167 # Un sd existe deja, on change son type
168 self.sd.__class__=sd_prod
170 # Le sd n existait pas , on ne le crée pas
171 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
173 if self.definition.reentrant == 'o':
174 if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
176 #self.reuse = self.sd
182 Methode pour generation d un rapport de validite
184 self.cr=self.CR(debut='Etape : '+self.nom \
185 + ' ligne : '+`self.appel[0]`\
186 + ' fichier : '+`self.appel[1]`,
187 fin = 'Fin Etape : '+self.nom)
188 self.state = 'modified'
190 self.isvalid(cr='oui')
191 except AsException,e:
192 if CONTEXT.debug : traceback.print_exc()
193 self.cr.fatal(string.join(('Etape :',self.nom,
194 'ligne :',`self.appel[0]`,
195 'fichier :',`self.appel[1]`,str(e))))
196 for child in self.mc_liste:
197 self.cr.add(child.report())