1 #@ MODIF V_MACRO_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 MACRO_ETAPE qui porte les méthodes
27 nécessaires pour réaliser la validation d'un objet de type MACRO_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
40 from Noyau.N_Exception import AsException
41 from Noyau.N_utils import AsType
43 class MACRO_ETAPE(V_ETAPE.ETAPE):
47 def isvalid(self,sd='oui',cr='non'):
49 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
50 peut etre appelée selon plusieurs modes en fonction de la valeur
53 Si cr vaut oui elle crée en plus un compte-rendu.
55 Cette méthode a plusieurs fonctions :
57 - mettre à jour l'état de self (update)
59 - retourner un indicateur de validité 0=non, 1=oui
61 - produire un compte-rendu : self.cr
64 if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
65 if self.state == 'unchanged' :
69 # On marque les concepts CO pour verification ulterieure de leur bonne utilisation
71 # On verifie que les concepts CO sont bien passes par type_sdprod
73 if c.etape is self.parent:
74 # le concept est propriete de l'etape parent
75 # Il n'a pas ete transforme par type_sdprod
76 # Cette situation est interdite
77 # Pb: La macro-commande a passe le concept a une commande (macro ?) mal definie
79 self.cr.fatal("Macro-commande mal definie : manque probablement appel a type_sdprod pour %s" % c.nom)
82 valid=valid * self.valid_child()
83 valid=valid * self.valid_regles(cr)
85 if self.reste_val != {}:
87 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
91 # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'état de self
92 # on retourne simplement l'indicateur valid
96 valid = valid * self.valid_sdnom(cr)
98 if self.definition.reentrant == 'n' and self.reuse:
99 # Il ne peut y avoir de concept reutilise avec une MACRO non reentrante
100 if cr == 'oui' : self.cr.fatal('Macro-commande non reentrante : ne pas utiliser reuse ')
104 valid = self.update_sdprod(cr)
106 # Si la macro comprend des etapes internes, on teste leur validite
107 for e in self.etapes:
112 self.set_valid(valid)
116 def update_sdprod(self,cr='non'):
118 Cette méthode met à jour le concept produit en fonction des conditions initiales :
120 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None)
122 2. Le concept retourné n existait pas (self.sd == None)
124 3. Le concept retourné existait. On change alors son type ou on le supprime
126 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
128 sd_prod=self.definition.sd_prod
129 # On memorise le type retourné dans l attribut typret
131 if type(sd_prod) == types.FunctionType:
132 # Type de concept retourné calculé
133 d=self.cree_dict_valeurs(self.mc_liste)
135 # la sd_prod d'une macro a l'objet lui meme en premier argument
136 # contrairement à une ETAPE ou PROC_ETAPE
137 # Comme sd_prod peut invoquer la méthode type_sdprod qui ajoute
138 # les concepts produits dans self.sdprods, il faut le mettre à zéro
140 sd_prod= apply(sd_prod,(self,),d)
142 # Erreur pendant le calcul du type retourné
143 if CONTEXT.debug:traceback.print_exc()
146 l=traceback.format_exception(sys.exc_info()[0],
149 self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
151 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
154 # Un concept reutilise a ete specifie
155 if AsType(self.reuse) != sd_prod:
156 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
159 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
160 # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
162 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
164 if valid:self.sd=self.reuse
166 #Cas d'un concept non reutilise
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 if CONTEXT.debug:print "changement de type:",self.sd,sd_prod
174 if self.sd.__class__ != sd_prod:
175 self.sd.change_type(sd_prod)
178 # Le sd n existait pas , on ne le crée pas
180 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
182 if self.definition.reentrant == 'o':
183 if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
189 Methode pour la generation d un rapport de validation
191 V_ETAPE.ETAPE.report(self)
192 for e in self.etapes :
193 self.cr.add(e.report())