1 #@ MODIF V_ETAPE Validation DATE 16/05/2007 AUTEUR COURTOIS M.COURTOIS
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
21 # ======================================================================
25 Ce module contient la classe mixin ETAPE qui porte les méthodes
26 nécessaires pour réaliser la validation d'un objet de type ETAPE
29 Une classe mixin porte principalement des traitements et est
30 utilisée par héritage multiple pour composer les traitements.
33 import string,types,sys
38 from Noyau.N_Exception import AsException
39 from Noyau.N_utils import AsType
41 class ETAPE(V_MCCOMPO.MCCOMPO):
45 def valid_child(self):
46 """ Cette methode teste la validite des mots cles de l'etape """
47 for child in self.mc_liste :
48 if not child.isvalid():
52 def valid_regles(self,cr):
53 """ Cette methode teste la validite des regles de l'etape """
54 text_erreurs,test_regles = self.verif_regles()
56 if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
60 def valid_sdnom(self,cr):
61 """ Cette methode teste la validite du nom du concept produit par l'etape """
63 if self.sd.nom != None :
64 if self.jdc and self.jdc.definition.code == 'ASTER' and len(self.sd.nom) > 8 :
65 # le nom de la sd doit avoir une longueur <= 8 caractères pour ASTER
67 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
69 if string.find(self.sd.nom,'sansnom') != -1 :
70 # la SD est 'sansnom' : --> erreur
72 self.cr.fatal("Pas de nom pour le concept retourné")
74 elif string.find(self.sd.nom,'SD_') != -1 :
75 # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
77 self.cr.fatal("Pas de nom pour le concept retourné")
82 if hasattr(self,'valid'):
88 def set_valid(self,valid):
89 old_valid=self.get_valid()
91 self.state = 'unchanged'
92 if not old_valid or old_valid != self.valid :
95 def isvalid(self,sd='oui',cr='non'):
97 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
98 peut etre appelée selon plusieurs modes en fonction de la valeur
101 Si cr vaut oui elle crée en plus un compte-rendu.
103 Cette méthode a plusieurs fonctions :
105 - mettre à jour l'état de self (update)
107 - retourner un indicateur de validité 0=non, 1=oui
109 - produire un compte-rendu : self.cr
112 if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
113 if self.state == 'unchanged' :
116 valid=self.valid_child()
117 valid=valid * self.valid_regles(cr)
119 if self.reste_val != {}:
121 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
125 # Dans ce cas, on ne teste qu'une validité partielle (sans tests sur le concept produit)
126 # Conséquence : on ne change pas l'état ni l'attribut valid, on retourne simplement
127 # l'indicateur de validité valid
130 if self.definition.reentrant == 'n' and self.reuse:
131 # Il ne peut y avoir de concept reutilise avec un OPER non reentrant
132 if cr == 'oui' : self.cr.fatal('Operateur non reentrant : ne pas utiliser reuse ')
136 # Le concept produit n'existe pas => erreur
137 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
140 valid = valid * self.valid_sdnom(cr)
143 valid = self.update_sdprod(cr)
145 self.set_valid(valid)
149 def update_sdprod(self,cr='non'):
151 Cette méthode met à jour le concept produit en fonction des conditions initiales :
153 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None)
155 2. Le concept retourné n existait pas (self.sd == None)
157 3. Le concept retourné existait. On change alors son type ou on le supprime
159 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
161 sd_prod=self.definition.sd_prod
162 if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
163 d=self.cree_dict_valeurs(self.mc_liste)
165 sd_prod= apply(sd_prod,(),d)
167 # Erreur pendant le calcul du type retourné
168 if CONTEXT.debug:traceback.print_exc()
171 l=traceback.format_exception(sys.exc_info()[0],
174 self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
176 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
179 if AsType(self.reuse) != sd_prod:
180 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
183 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
184 # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
186 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
188 if valid:self.sd=self.reuse
190 if sd_prod == None:# Pas de concept retourné
191 # Que faut il faire de l eventuel ancien sd ?
195 # Un sd existe deja, on change son type
196 if CONTEXT.debug:print "changement de type:",self.sd,sd_prod
197 if self.sd.__class__ != sd_prod:
198 self.sd.change_type(sd_prod)
200 # Le sd n existait pas , on ne le crée pas
201 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
203 if self.definition.reentrant == 'o':
204 if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
211 Methode pour generation d un rapport de validite
213 self.cr=self.CR(debut='Etape : '+self.nom \
214 + ' ligne : '+`self.appel[0]`\
215 + ' fichier : '+`self.appel[1]`,
216 fin = 'Fin Etape : '+self.nom)
217 self.state = 'modified'
219 self.isvalid(cr='oui')
220 except AsException,e:
221 if CONTEXT.debug : traceback.print_exc()
222 self.cr.fatal(string.join(('Etape :',self.nom,
223 'ligne :',`self.appel[0]`,
224 'fichier :',`self.appel[1]`,str(e))))
225 for child in self.mc_liste:
226 self.cr.add(child.report())