Salome HOME
CCAR: mise a niveau du noyau avec Aster 6.3.20 (Noyau, Validation, Macro, Cata)
[tools/eficas.git] / Validation / V_ETAPE.py
1 #@ MODIF V_ETAPE Validation  DATE 09/10/2002   AUTEUR DURAND C.DURAND 
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  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.                                 
9 #
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.                            
14 #
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.      
18 #                                                                       
19 #                                                                       
20 # ======================================================================
21 """
22    Ce module contient la classe mixin ETAPE qui porte les méthodes
23    nécessaires pour réaliser la validation d'un objet de type ETAPE
24    dérivé de OBJECT.
25
26    Une classe mixin porte principalement des traitements et est
27    utilisée par héritage multiple pour composer les traitements.
28 """
29 # Modules Python
30 import string,types,sys
31 import traceback
32
33 # Modules EFICAS
34 import V_MCCOMPO
35 from Noyau.N_Exception import AsException
36 from Noyau.N_utils import AsType
37
38 class ETAPE(V_MCCOMPO.MCCOMPO):
39    """
40    """
41
42    def isvalid(self,sd='oui',cr='non'):
43       """ 
44          Methode pour verifier la validité de l'objet ETAPE. Cette méthode
45          peut etre appelée selon plusieurs modes en fonction de la valeur
46          de sd et de cr.
47
48          Si cr vaut oui elle crée en plus un compte-rendu.
49
50          Cette méthode a plusieurs fonctions :
51
52           - mettre à jour l'état de self (update)
53
54           - retourner un indicateur de validité 0=non, 1=oui
55
56           - produire un compte-rendu : self.cr
57
58       """
59       if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
60       if self.state == 'unchanged' :
61         return self.valid
62       else:
63         valid = 1
64         # on teste les enfants
65         for child in self.mc_liste :
66           if not child.isvalid():
67             valid = 0
68             break
69         # on teste les règles de self
70         text_erreurs,test_regles = self.verif_regles()
71         if not test_regles :
72           if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
73           valid = 0
74         if self.reste_val != {}:
75           if cr == 'oui' :
76             self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
77           valid=0
78         if sd == "non":
79           # Dans ce cas, on ne teste qu'une validité partielle (sans tests sur le concept produit)
80           # Conséquence : on ne change pas l'état ni l'attribut valid, on retourne simplement
81           # l'indicateur de validité valid
82           return valid
83         #
84         # On complète les tests avec ceux sur le concept produit
85         #
86         if hasattr(self,'valid'):
87           old_valid = self.valid
88         else:
89           old_valid = None
90
91         if self.sd == None:
92           # Le concept produit n'existe pas => erreur
93           if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
94           valid = 0
95         else:
96           # on teste, si elle existe, le nom de la sd (sa longueur doit etre <= 8 caractères)
97           # la SD existe déjà : on regarde son nom
98           if self.sd.nom != None :
99             if len(self.sd.nom) > 8 and self.jdc.definition.code == 'ASTER' :
100               if cr == 'oui' :
101                 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
102               valid = 0
103             if string.find(self.sd.nom,'sansnom') != -1 :
104               # la SD est 'sansnom' : --> erreur
105               if cr == 'oui' :
106                 self.cr.fatal("Pas de nom pour le concept retourné")
107               valid = 0
108             elif string.find(self.sd.nom,'SD_') != -1 :
109               # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
110               if cr == 'oui' :
111                 self.cr.fatal("Pas de nom pour le concept retourné")
112               valid = 0
113         if valid:
114           valid = self.update_sdprod(cr)
115         self.valid = valid
116         self.state = 'unchanged'
117         if old_valid:
118           if old_valid != self.valid : self.init_modif_up()
119         return self.valid
120
121    def update_sdprod(self,cr='non'):
122       """ 
123            Cette méthode met à jour le concept produit en fonction des conditions initiales :
124
125             1- Il n'y a pas de concept retourné (self.definition.sd_prod == None)
126
127             2- Le concept retourné n existait pas (self.sd == None)
128
129             3- Le concept retourné existait. On change alors son type ou on le supprime
130
131            En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
132       """
133       sd_prod=self.definition.sd_prod
134       if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
135         d=self.cree_dict_valeurs(self.mc_liste)
136         try:
137           sd_prod= apply(sd_prod,(),d)
138         except:
139           # Erreur pendant le calcul du type retourné
140           if CONTEXT.debug:traceback.print_exc()
141           self.sd=None
142           if cr == 'oui' : 
143              l=traceback.format_exception(sys.exc_info()[0],
144                                            sys.exc_info()[1],
145                                            sys.exc_info()[2])
146              self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
147           return 0
148       # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
149       valid=1
150       if self.reuse:
151         if AsType(self.reuse) != sd_prod:
152           if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
153           valid= 0
154         if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
155           # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
156           if cr == 'oui' : 
157              self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
158           valid= 0
159         if valid:self.sd=self.reuse
160       else:
161         if sd_prod == None:# Pas de concept retourné
162           # Que faut il faire de l eventuel ancien sd ?
163           self.sd = None
164         else:
165           if self.sd: 
166              # Un sd existe deja, on change son type
167              self.sd.__class__=sd_prod
168           else: 
169              # Le sd n existait pas , on ne le crée pas
170              if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
171              valid=0 
172         if self.definition.reentrant == 'o':
173            if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
174            valid=0 
175            #self.reuse = self.sd
176       return valid
177
178
179    def report(self):
180       """ 
181           Methode pour generation d un rapport de validite
182       """
183       self.cr=self.CR(debut='Etape : '+self.nom \
184                 + '    ligne : '+`self.appel[0]`\
185                 + '    fichier : '+`self.appel[1]`,
186                  fin = 'Fin Etape : '+self.nom)
187       self.state = 'modified'
188       try:
189         self.isvalid(cr='oui')
190       except AsException,e:
191         if CONTEXT.debug : traceback.print_exc()
192         self.cr.fatal(string.join(('Etape :',self.nom,
193                               'ligne :',`self.appel[0]`,
194                               'fichier :',`self.appel[1]`,str(e))))
195       for child in self.mc_liste:
196         self.cr.add(child.report())
197       return self.cr
198