1 #@ MODIF V_ETAPE Validation DATE 26/06/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 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 if hasattr(self,'valid'):
65 old_valid = self.valid
68 # on teste si demandé la structure de donnée (par défaut)
70 if self.sd != None :pass
71 # Ce test parait superflu. Il est sur que si sd existe il s'agit du concept produit
72 # Quelle pourrait etre la raison qui ferait que sd n existe pas ???
73 #if self.jdc.get_sdprod(self.sd.nom) == None :
75 # self.cr.fatal('Le concept '+self.sd.nom+" n'existe pas")
78 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
80 # on teste, si elle existe, le nom de la sd (sa longueur doit etre <= 8 caractères)
82 # la SD existe déjà : on regarde son nom
83 if self.sd.nom != None :
84 if len(self.sd.nom) > 8 and self.jdc.definition.code == 'ASTER' :
86 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
88 if string.find(self.sd.nom,'sansnom') != -1 :
89 # la SD est 'sansnom' : --> erreur
91 self.cr.fatal("Pas de nom pour le concept retourné")
93 elif string.find(self.sd.nom,'SD_') != -1 :
94 # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
96 self.cr.fatal("Pas de nom pour le concept retourné")
98 # on teste les enfants
99 for child in self.mc_liste :
100 if not child.isvalid():
103 # on teste les règles de self
104 text_erreurs,test_regles = self.verif_regles()
106 if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
108 if self.reste_val != {}:
110 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
112 if sd == 'oui' and valid:
113 valid = self.update_sdprod(cr)
115 self.state = 'unchanged'
117 if old_valid != self.valid : self.init_modif_up()
120 def update_sdprod(self,cr='non'):
122 Cette méthode met à jour le concept produit en fonction des conditions initiales :
124 1- Il n'y a pas de concept retourné (self.definition.sd_prod == None)
126 2- Le concept retourné n existait pas (self.sd == None)
128 3- Le concept retourné existait. On change alors son type ou on le supprime
130 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
132 sd_prod=self.definition.sd_prod
133 if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
134 d=self.cree_dict_valeurs(self.mc_liste)
136 sd_prod= apply(sd_prod,(),d)
138 # Erreur pendant le calcul du type retourné
139 if CONTEXT.debug:traceback.print_exc()
142 l=traceback.format_exception(sys.exc_info()[0],
145 self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
147 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
150 if AsType(self.reuse) != sd_prod:
151 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
153 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
154 # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
156 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
158 if valid:self.sd=self.reuse
160 if sd_prod == None:# Pas de concept retourné
161 # Que faut il faire de l eventuel ancien sd ?
165 # Un sd existe deja, on change son type
166 self.sd.__class__=sd_prod
168 # Le sd n existait pas , on ne le crée pas
169 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
171 if self.definition.reentrant == 'o':
172 if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
174 #self.reuse = self.sd
180 Methode pour generation d un rapport de validite
182 self.cr=self.CR(debut='Etape : '+self.nom \
183 + ' ligne : '+`self.appel[0]`\
184 + ' fichier : '+`self.appel[1]`,
185 fin = 'Fin Etape : '+self.nom)
186 self.state = 'modified'
188 self.isvalid(cr='oui')
189 except AsException,e:
190 if CONTEXT.debug : traceback.print_exc()
191 self.cr.fatal(string.join(('Etape :',self.nom,
192 'ligne :',`self.appel[0]`,
193 'fichier :',`self.appel[1]`,str(e))))
194 for child in self.mc_liste:
195 self.cr.add(child.report())