2 # ======================================================================
3 # Copyright (C) 2007-2021 EDF R&D
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
23 Ce module contient la classe mixin MACRO_ETAPE qui porte les methodes
24 necessaires pour realiser la validation d'un objet de type MACRO_ETAPE
27 Une classe mixin porte principalement des traitements et est
28 utilisee par heritage multiple pour composer les traitements.
30 from __future__ import print_function
31 from __future__ import absolute_import
38 from . import V_MCCOMPO
40 from Noyau.N_Exception import AsException
41 from Noyau.N_utils import AsType
44 class MACRO_ETAPE(V_ETAPE.ETAPE):
49 def isValid(self, sd='oui', cr='non'):
51 Methode pour verifier la validite de l'objet ETAPE. Cette methode
52 peut etre appelee selon plusieurs modes en fonction de la valeur
55 Si cr vaut oui elle cree en plus un compte-rendu.
57 Cette methode a plusieurs fonctions :
59 - mettre a jour l'etat de self (update)
61 - retourner un indicateur de validite 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 typeSDProd
77 # if c.etape is self.parent:
79 # le concept est propriete de l'etape parent
80 # Il n'a pas ete transforme par typeSDProd
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("Macro-commande mal definie : le concept n'a pas ete type par un appel a typeSDProd pour %s" % c.nom)
88 valid = valid * self.validChild()
89 valid = valid * self.validRegles(cr)
91 if self.reste_val != {}:
94 "unknown keyword : %s" %','.join(list(self.reste_val.keys())))
98 # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'etat de self
99 # on retourne simplement l'indicateur valid
103 valid = valid * self.validSdnom(cr)
105 if self.definition.reentrant == 'n' and self.reuse:
106 # Il ne peut y avoir de concept reutilise avec une MACRO non
108 if cr == 'oui': self.cr.fatal(
109 'Macro-commande non reentrante : ne pas utiliser reuse')
113 valid = self.updateSdprod(cr)
115 # Si la macro comprend des etapes internes, on teste leur validite
116 for e in self.etapes:
125 def updateSdprod(self, cr='non'):
127 Cette methode met a jour le concept produit en fonction des conditions initiales :
129 1. Il n'y a pas de concept retourne (self.definition.sd_prod == None)
131 2. Le concept retourne n existait pas (self.sd == None)
133 3. Le concept retourne existait. On change alors son type ou on le supprime
135 En cas d'erreur (exception) on retourne un indicateur de validite de 0 sinon de 1
137 sd_prod = self.definition.sd_prod
138 # On memorise le type retourne dans l attribut typret
140 if type(sd_prod) == types.FunctionType:
141 # Type de concept retourne calcule
142 d = self.creeDictValeurs(self.mcListe)
144 # la sd_prod d'une macro a l'objet lui meme en premier argument
145 # contrairement a une ETAPE ou PROC_ETAPE
146 # Comme sd_prod peut invoquer la methode typeSDProd qui ajoute
147 # les concepts produits dans self.sdprods, il faut le mettre a
150 sd_prod = sd_prod(*(self,), **d)
152 # Erreur pendant le calcul du type retourne
154 traceback.print_exc()
157 l = traceback.format_exception(sys.exc_info()[0],
160 self.cr.fatal( 'Impossible d affecter un type au resultat\n%s' % ' '.join(l[2:]))
162 # on teste maintenant si la SD est reutilisee ou s'il faut la
166 # Un concept reutilise a ete specifie
167 if AsType(self.reuse) != sd_prod:
170 'Type de concept reutilise incompatible avec type produit')
173 if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
174 # Le nom de la variable de retour (self.sdnom) doit etre le
175 # meme que celui du concept reutilise (self.reuse.nom)
177 self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' % (self.reuse.nom, self.sdnom))
182 # Cas d'un concept non reutilise
183 if sd_prod == None: # Pas de concept retourne
184 # Que faut il faire de l eventuel ancien sd ?
188 # Un sd existe deja, on change son type
190 print(("changement de type:", self.sd, sd_prod))
191 if self.sd.__class__ != sd_prod:
192 self.sd.changeType(sd_prod)
193 self.typret = sd_prod
195 # Le sd n existait pas , on ne le cree pas
196 self.typret = sd_prod
198 self.cr.fatal("Concept retourne non defini")
200 if self.definition.reentrant == 'o':
203 'Commande obligatoirement reentrante : specifier reuse=concept')
209 Methode pour la generation d un rapport de validation
211 V_ETAPE.ETAPE.report(self)
212 for e in self.etapes:
213 self.cr.add(e.report())