1 #@ MODIF V_ETAPE Validation DATE 07/09/2009 AUTEUR COURTOIS M.COURTOIS
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE COURTOIS M.COURTOIS
4 # CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
10 # (AT YOUR OPTION) ANY LATER VERSION.
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
19 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
22 # ======================================================================
26 Ce module contient la classe mixin ETAPE qui porte les méthodes
27 nécessaires pour réaliser la validation d'un objet de type ETAPE
30 Une classe mixin porte principalement des traitements et est
31 utilisée par héritage multiple pour composer les traitements.
34 import string,types,sys
39 from Noyau.N_Exception import AsException
40 from Noyau.N_utils import AsType
42 class ETAPE(V_MCCOMPO.MCCOMPO):
46 def valid_child(self):
47 """ Cette methode teste la validite des mots cles de l'etape """
48 for child in self.mc_liste :
49 if not child.isvalid():
53 def valid_regles(self,cr):
54 """ Cette methode teste la validite des regles de l'etape """
55 text_erreurs,test_regles = self.verif_regles()
57 if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
61 def valid_sdnom(self,cr):
62 """ Cette methode teste la validite du nom du concept produit par l'etape """
64 if self.sd.nom != None :
65 if self.jdc and self.jdc.definition.code == 'ASTER' and len(self.sd.nom) > 8 :
66 # le nom de la sd doit avoir une longueur <= 8 caractères pour ASTER
68 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
70 if string.find(self.sd.nom,'sansnom') != -1 :
71 # la SD est 'sansnom' : --> erreur
73 self.cr.fatal("Pas de nom pour le concept retourné")
75 elif string.find(self.sd.nom,'SD_') != -1 :
76 # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
78 self.cr.fatal("Pas de nom pour le concept retourné")
83 if hasattr(self,'valid'):
89 def set_valid(self,valid):
90 old_valid=self.get_valid()
92 self.state = 'unchanged'
93 if not old_valid or old_valid != self.valid :
96 def isvalid(self,sd='oui',cr='non'):
98 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
99 peut etre appelée selon plusieurs modes en fonction de la valeur
102 Si cr vaut oui elle crée en plus un compte-rendu.
104 Cette méthode a plusieurs fonctions :
106 - mettre à jour l'état de self (update)
108 - retourner un indicateur de validité 0=non, 1=oui
110 - produire un compte-rendu : self.cr
113 if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
114 if self.state == 'unchanged' :
117 valid=self.valid_child()
118 valid=valid * self.valid_regles(cr)
120 if self.reste_val != {}:
122 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
126 # Dans ce cas, on ne teste qu'une validité partielle (sans tests sur le concept produit)
127 # Conséquence : on ne change pas l'état ni l'attribut valid, on retourne simplement
128 # l'indicateur de validité valid
131 if self.definition.reentrant == 'n' and self.reuse:
132 # Il ne peut y avoir de concept reutilise avec un OPER non reentrant
133 if cr == 'oui' : self.cr.fatal('Operateur non reentrant : ne pas utiliser reuse ')
137 # Le concept produit n'existe pas => erreur
138 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
141 valid = valid * self.valid_sdnom(cr)
144 valid = self.update_sdprod(cr)
146 self.set_valid(valid)
150 def update_sdprod(self,cr='non'):
152 Cette méthode met à jour le concept produit en fonction des conditions initiales :
154 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None)
156 2. Le concept retourné n existait pas (self.sd == None)
158 3. Le concept retourné existait. On change alors son type ou on le supprime
160 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
162 sd_prod=self.definition.sd_prod
163 if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
164 d=self.cree_dict_valeurs(self.mc_liste)
166 sd_prod= apply(sd_prod,(),d)
168 # Erreur pendant le calcul du type retourné
169 if CONTEXT.debug:traceback.print_exc()
172 l=traceback.format_exception(sys.exc_info()[0],
175 self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
177 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
180 if AsType(self.reuse) != sd_prod:
181 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
184 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
185 # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
187 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
189 if valid:self.sd=self.reuse
191 if sd_prod == None:# Pas de concept retourné
192 # Que faut il faire de l eventuel ancien sd ?
196 # Un sd existe deja, on change son type
197 if CONTEXT.debug:print "changement de type:",self.sd,sd_prod
198 if self.sd.__class__ != sd_prod:
199 self.sd.change_type(sd_prod)
201 # Le sd n existait pas , on ne le crée pas
202 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
204 if self.definition.reentrant == 'o':
205 if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
212 Methode pour generation d un rapport de validite
214 self.cr=self.CR(debut='Etape : '+self.nom \
215 + ' ligne : '+`self.appel[0]`\
216 + ' fichier : '+`self.appel[1]`,
217 fin = 'Fin Etape : '+self.nom)
218 self.state = 'modified'
220 self.isvalid(cr='oui')
221 except AsException,e:
222 if CONTEXT.debug : traceback.print_exc()
223 self.cr.fatal(string.join(('Etape :',self.nom,
224 'ligne :',`self.appel[0]`,
225 'fichier :',`self.appel[1]`,str(e))))
226 for child in self.mc_liste:
227 self.cr.add(child.report())