]> SALOME platform Git repositories - tools/eficas.git/blob - Validation/V_ETAPE.py
Salome HOME
Version Aster 6.3.14
[tools/eficas.git] / Validation / V_ETAPE.py
1 #@ MODIF V_ETAPE Validation  DATE 26/06/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         if hasattr(self,'valid'):
65           old_valid = self.valid
66         else:
67           old_valid = None
68         # on teste si demandé la structure de donnée (par défaut)
69         if sd == 'oui':
70           if self.sd != None :pass
71             # Ce test parait superflu. Il est sur que si sd existe il s'agit du concept produit
72             # Quelle pourrait etre la raison qui ferait que sd n existe pas ???
73             #if self.jdc.get_sdprod(self.sd.nom) == None :
74             #  if cr == 'oui' :
75             #    self.cr.fatal('Le concept '+self.sd.nom+" n'existe pas")
76             #  valid = 0
77           else :
78             if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
79             valid = 0
80         # on teste, si elle existe, le nom de la sd (sa longueur doit etre <= 8 caractères)
81         if self.sd != None :
82           # la SD existe déjà : on regarde son nom
83           if self.sd.nom != None :
84             if len(self.sd.nom) > 8 and self.jdc.definition.code == 'ASTER' :
85               if cr == 'oui' :
86                 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
87               valid = 0
88             if string.find(self.sd.nom,'sansnom') != -1 :
89               # la SD est 'sansnom' : --> erreur
90               if cr == 'oui' :
91                 self.cr.fatal("Pas de nom pour le concept retourné")
92               valid = 0
93             elif string.find(self.sd.nom,'SD_') != -1 :
94               # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
95               if cr == 'oui' :
96                 self.cr.fatal("Pas de nom pour le concept retourné")
97               valid = 0
98         # on teste les enfants
99         for child in self.mc_liste :
100           if not child.isvalid():
101             valid = 0
102             break
103         # on teste les règles de self
104         text_erreurs,test_regles = self.verif_regles()
105         if not test_regles :
106           if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
107           valid = 0
108         if self.reste_val != {}:
109           if cr == 'oui' :
110             self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
111           valid=0
112         if sd == 'oui' and valid:
113           valid = self.update_sdprod(cr)
114         self.valid = valid
115         self.state = 'unchanged'
116         if old_valid:
117           if old_valid != self.valid : self.init_modif_up()
118         return self.valid
119
120    def update_sdprod(self,cr='non'):
121       """ 
122            Cette méthode met à jour le concept produit en fonction des conditions initiales :
123
124             1- Il n'y a pas de concept retourné (self.definition.sd_prod == None)
125
126             2- Le concept retourné n existait pas (self.sd == None)
127
128             3- Le concept retourné existait. On change alors son type ou on le supprime
129
130            En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
131       """
132       sd_prod=self.definition.sd_prod
133       if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
134         d=self.cree_dict_valeurs(self.mc_liste)
135         try:
136           sd_prod= apply(sd_prod,(),d)
137         except:
138           # Erreur pendant le calcul du type retourné
139           if CONTEXT.debug:traceback.print_exc()
140           self.sd=None
141           if cr == 'oui' : 
142              l=traceback.format_exception(sys.exc_info()[0],
143                                            sys.exc_info()[1],
144                                            sys.exc_info()[2])
145              self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
146           return 0
147       # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
148       valid=1
149       if self.reuse:
150         if AsType(self.reuse) != sd_prod:
151           if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
152           valid= 0
153         if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
154           # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
155           if cr == 'oui' : 
156              self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
157           valid= 0
158         if valid:self.sd=self.reuse
159       else:
160         if sd_prod == None:# Pas de concept retourné
161           # Que faut il faire de l eventuel ancien sd ?
162           self.sd = None
163         else:
164           if self.sd: 
165              # Un sd existe deja, on change son type
166              self.sd.__class__=sd_prod
167           else: 
168              # Le sd n existait pas , on ne le crée pas
169              if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
170              valid=0 
171         if self.definition.reentrant == 'o':
172            if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
173            valid=0 
174            #self.reuse = self.sd
175       return valid
176
177
178    def report(self):
179       """ 
180           Methode pour generation d un rapport de validite
181       """
182       self.cr=self.CR(debut='Etape : '+self.nom \
183                 + '    ligne : '+`self.appel[0]`\
184                 + '    fichier : '+`self.appel[1]`,
185                  fin = 'Fin Etape : '+self.nom)
186       self.state = 'modified'
187       try:
188         self.isvalid(cr='oui')
189       except AsException,e:
190         if CONTEXT.debug : traceback.print_exc()
191         self.cr.fatal(string.join(('Etape :',self.nom,
192                               'ligne :',`self.appel[0]`,
193                               'fichier :',`self.appel[1]`,str(e))))
194       for child in self.mc_liste:
195         self.cr.add(child.report())
196       return self.cr
197