2 # person_in_charge: mathieu.courtois at edf.fr
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2015 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 # ======================================================================
24 Ce module contient la classe mixin MACRO_ETAPE qui porte les méthodes
25 nécessaires pour réaliser la validation d'un objet de type MACRO_ETAPE
28 Une classe mixin porte principalement des traitements et est
29 utilisée par héritage multiple pour composer les traitements.
39 from Noyau.N_Exception import AsException
40 from Noyau.N_utils import AsType
41 from Noyau.strfunc import ufmt
44 class MACRO_ETAPE(V_ETAPE.ETAPE):
49 def isvalid(self, sd='oui', cr='non'):
51 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
52 peut etre appelée selon plusieurs modes en fonction de la valeur
55 Si cr vaut oui elle crée en plus un compte-rendu.
57 Cette méthode a plusieurs fonctions :
59 - mettre à jour l'état de self (update)
61 - retourner un indicateur de validité 0=non, 1=oui
63 - produire un compte-rendu : self.cr
67 print "ETAPE.isvalid ", self.nom
68 if self.state == 'unchanged':
72 # On marque les concepts CO pour verification ulterieure de leur
75 # On verifie que les concepts CO sont bien passes par type_sdprod
77 # if c.etape is self.parent:
79 # le concept est propriete de l'etape parent
80 # Il n'a pas ete transforme par type_sdprod
81 # Cette situation est interdite
82 # Pb: La macro-commande a passe le concept a une commande
83 # (macro ?) mal definie
85 self.cr.fatal(_(u"Macro-commande mal définie : le concept n'a pas été typé par "
86 u"un appel à type_sdprod pour %s"), c.nom)
89 valid = valid * self.valid_child()
90 valid = valid * self.valid_regles(cr)
92 if self.reste_val != {}:
95 _(u"Mots clés inconnus : %s"), ','.join(self.reste_val.keys()))
99 # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'état de self
100 # on retourne simplement l'indicateur valid
104 valid = valid * self.valid_sdnom(cr)
106 if self.definition.reentrant == 'n' and self.reuse:
107 # Il ne peut y avoir de concept reutilise avec une MACRO non
111 _(u'Macro-commande non réentrante : ne pas utiliser reuse'))
115 valid = self.update_sdprod(cr)
117 # Si la macro comprend des etapes internes, on teste leur validite
118 for e in self.etapes:
123 self.set_valid(valid)
127 def update_sdprod(self, cr='non'):
129 Cette méthode met à jour le concept produit en fonction des conditions initiales :
131 1. Il n'y a pas de concept retourné (self.definition.sd_prod == None)
133 2. Le concept retourné n existait pas (self.sd == None)
135 3. Le concept retourné existait. On change alors son type ou on le supprime
137 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
139 sd_prod = self.definition.sd_prod
140 # On memorise le type retourné dans l attribut typret
142 if type(sd_prod) == types.FunctionType:
143 # Type de concept retourné calculé
144 d = self.cree_dict_valeurs(self.mc_liste)
146 # la sd_prod d'une macro a l'objet lui meme en premier argument
147 # contrairement à une ETAPE ou PROC_ETAPE
148 # Comme sd_prod peut invoquer la méthode type_sdprod qui ajoute
149 # les concepts produits dans self.sdprods, il faut le mettre à
152 sd_prod = apply(sd_prod, (self,), d)
154 # Erreur pendant le calcul du type retourné
156 traceback.print_exc()
159 l = traceback.format_exception(sys.exc_info()[0],
163 _(u'Impossible d affecter un type au résultat\n%s'), ' '.join(l[2:]))
165 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la
169 # Un concept reutilise a ete specifie
170 if AsType(self.reuse) != sd_prod:
173 _(u'Type de concept réutilisé incompatible avec type produit'))
176 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
177 # Le nom de la variable de retour (self.sdnom) doit etre le
178 # meme que celui du concept reutilise (self.reuse.nom)
180 self.cr.fatal(_(u'Concept réutilisé : le nom de la variable de '
181 u'retour devrait être %s et non %s'),
182 self.reuse.nom, self.sdnom)
187 # Cas d'un concept non reutilise
188 if sd_prod == None: # Pas de concept retourné
189 # Que faut il faire de l eventuel ancien sd ?
193 # Un sd existe deja, on change son type
195 print "changement de type:", self.sd, sd_prod
196 if self.sd.__class__ != sd_prod:
197 self.sd.change_type(sd_prod)
198 self.typret = sd_prod
200 # Le sd n existait pas , on ne le crée pas
201 self.typret = sd_prod
203 self.cr.fatal(_(u"Concept retourné non défini"))
205 if self.definition.reentrant == 'o':
208 _(u'Commande obligatoirement réentrante : spécifier reuse=concept'))
214 Methode pour la generation d un rapport de validation
216 V_ETAPE.ETAPE.report(self)
217 for e in self.etapes:
218 self.cr.add(e.report())