Salome HOME
AY a ajouté l'interception de l'exception levée lorsque la chaine passée
[tools/eficas.git] / Validation / V_MACRO_ETAPE.py
index b0531a12c25ed673f7cb813a5a59eacaf86ae941..d2b175fff0ed2b1e003233b734d3b5f34fc5ef02 100644 (file)
@@ -1,3 +1,23 @@
+#@ MODIF V_MACRO_ETAPE Validation  DATE 09/10/2002   AUTEUR DURAND C.DURAND 
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
+# (AT YOUR OPTION) ANY LATER VERSION.                                 
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
+#                                                                       
+#                                                                       
+# ======================================================================
 """
    Ce module contient la classe mixin MACRO_ETAPE qui porte les méthodes
    nécessaires pour réaliser la validation d'un objet de type MACRO_ETAPE
@@ -7,7 +27,7 @@
    utilisée par héritage multiple pour composer les traitements.
 """
 # Modules Python
-import string,types
+import string,types,sys
 import traceback
 
 # Modules EFICAS
@@ -42,11 +62,29 @@ class MACRO_ETAPE(V_ETAPE.ETAPE):
         return self.valid
       else:
         valid = 1
+        # on teste les mots cles de la commande
+        for child in self.mc_liste :
+          if not child.isvalid():
+            valid = 0
+            break
+        # on teste les règles de la commande
+        text_erreurs,test_regles = self.verif_regles()
+        if not test_regles :
+          if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
+          valid = 0
+        if self.reste_val != {}:
+          if cr == 'oui' :
+            self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
+          valid=0
+        if sd == "non":
+           # Dans ce cas, on ne calcule qu'une validite partielle, on ne modifie pas l'état de self
+           # on retourne simplement l'indicateur valid
+           return valid
         if hasattr(self,'valid'):
           old_valid = self.valid
         else:
           old_valid = None
-        # on teste, si elle existe, le nom de la sd (sa longueur doit être <= 8 caractères)
+        # on teste, si elle existe, le nom de la sd (sa longueur doit etre <= 8 caractères)
         if self.sd != None :
           # la SD existe déjà : on regarde son nom
           if self.sd.get_name() != None :
@@ -64,21 +102,7 @@ class MACRO_ETAPE(V_ETAPE.ETAPE):
               if cr == 'oui' :
                 self.cr.fatal("Pas de nom pour le concept retourné")
               valid = 0
-        # on teste les enfants
-        for child in self.mc_liste :
-          if not child.isvalid():
-            valid = 0
-            break
-        # on teste les règles de self
-        text_erreurs,test_regles = self.verif_regles()
-        if not test_regles :
-          if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
-          valid = 0
-        if self.reste_val != {}:
-          if cr == 'oui' :
-            self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
-          valid=0
-        if sd == 'oui' and valid:
+        if valid:
           valid = self.update_sdprod(cr)
         # Si la macro comprend des etapes internes, on teste leur validite
         for e in self.etapes:
@@ -120,15 +144,25 @@ class MACRO_ETAPE(V_ETAPE.ETAPE):
           # Erreur pendant le calcul du type retourné
           if CONTEXT.debug:traceback.print_exc()
           self.sd=None
-          if cr == 'oui' : self.cr.fatal('Impossible d affecter un type au résultat')
+          if cr == 'oui' : 
+             l=traceback.format_exception(sys.exc_info()[0],
+                                           sys.exc_info()[1],
+                                           sys.exc_info()[2])
+             self.cr.fatal('Impossible d affecter un type au résultat\n'+string.join(l[2:]))
           return 0
       # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
+      valid=1
       if self.reuse:
+        # Un concept reutilise a ete specifie
         if AsType(self.reuse) != sd_prod:
           if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
-          return 0
-        self.sd=self.reuse
-        return 1
+          valid=0
+        if self.sdnom[0] != '_' and self.reuse.nom != self.sdnom:
+          # Le nom de la variable de retour (self.sdnom) doit etre le meme que celui du concept reutilise (self.reuse.nom)
+          if cr == 'oui' :
+             self.cr.fatal('Concept reutilise : le nom de la variable de retour devrait etre %s et non %s' %(self.reuse.nom,self.sdnom))
+          valid= 0
+        if valid:self.sd=self.reuse
       else:
         if sd_prod == None:# Pas de concept retourné
           # Que faut il faire de l eventuel ancien sd ?
@@ -142,10 +176,12 @@ class MACRO_ETAPE(V_ETAPE.ETAPE):
             # Le sd n existait pas , on ne le crée pas
             self.typret=sd_prod
             if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
-            return 0
+            valid=0 
         if self.definition.reentrant == 'o':
-          self.reuse = self.sd
-        return 1
+           if cr == 'oui' : self.cr.fatal('Commande obligatoirement reentrante : specifier reuse=concept')
+           valid=0
+           #self.reuse = self.sd
+      return valid
 
    def report(self):
       """