Salome HOME
CCAR: correction d'un probleme de mise a jour de contexte lors d'une insertion
[tools/eficas.git] / Noyau / N_BLOC.py
1 #@ MODIF N_BLOC Noyau  DATE 14/09/2004   AUTEUR MCOURTOI M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
9 # (AT YOUR OPTION) ANY LATER VERSION.                                 
10 #
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
15 #
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
19 #                                                                       
20 #                                                                       
21 # ======================================================================
22
23
24 """ 
25     Ce module contient la classe de definition BLOC
26     qui permet de spécifier les caractéristiques des blocs de mots clés 
27 """
28
29 import types,string,sys
30 import traceback
31
32 import N_ENTITE
33 import N_MCBLOC
34 from N_Exception import AsException
35
36 class BLOC(N_ENTITE.ENTITE):
37    """
38     Classe pour definir un bloc de mots-cles
39
40     Cette classe a deux attributs de classe :
41
42     - class_instance qui indique la classe qui devra etre utilisée 
43             pour créer l'objet qui servira à controler la conformité d'un 
44             bloc de mots-clés avec sa définition
45
46     - label qui indique la nature de l'objet de définition (ici, BLOC)
47
48    """
49    class_instance = N_MCBLOC.MCBLOC
50    label = 'BLOC'
51
52    def __init__(self,fr="",ang="",docu="",regles=(),statut='f',condition=None,
53                      **args):
54      
55       """
56           Un bloc est caractérisé par les attributs suivants :
57
58           - fr   : chaine de caractere commentaire pour aide en ligne (en francais)
59
60           - ang : chaine de caractere commentaire pour aide en ligne (en anglais)
61
62           - regles : liste d'objets de type REGLE pour vérifier la cohérence des sous-objets
63
64           - statut : obligatoire ('o') ou facultatif ('f')
65
66           - condition : chaine de caractère evaluable par l'interpreteur Python
67
68           - entites : dictionnaire contenant les sous-objets de self (mots-clés). La clé du dictionnaire 
69                      est le nom du mot-clé et la valeur l'objet de définition correspondant. Cet attribut
70                      est initialisé avec l'argument args de la méthode __init__
71
72       """
73       # Initialisation des attributs
74       self.fr=fr
75       self.ang=ang
76       self.docu=docu
77       if type(regles)== types.TupleType:
78           self.regles=regles
79       else:
80           self.regles=(regles,)
81       self.statut=statut
82       self.condition=condition
83       self.entites=args
84       self.affecter_parente()
85
86    def __call__(self,val,nom,parent=None):
87       """
88           Construit un objet MCBLOC a partir de sa definition (self)
89           de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent)
90       """
91       return self.class_instance(nom=nom,definition=self,val=val,parent=parent)
92
93    def verif_cata(self):
94       """
95          Cette méthode vérifie si les attributs de définition sont valides.
96          Les éventuels messages d'erreur sont écrits dans l'objet compte-rendu (self.cr).
97       """
98       if type(self.fr) != types.StringType :
99         self.cr.fatal("L'attribut 'fr' doit etre une chaine de caractères : %s" %`self.fr`)
100       if type(self.docu) != types.StringType :
101         self.cr.fatal("L'attribut 'docu' doit etre une chaine de caractères : %s" %`self.docu`)
102       if type(self.regles) != types.TupleType :
103         self.cr.fatal("L'attribut 'regles' doit etre un tuple : %s" %`self.regles` )
104       if self.statut not in ['f','o'] :
105         self.cr.fatal("L'attribut 'statut' doit valoir 'o' ou 'f' : %s" %`self.statut` )
106       if self.condition != None :
107         if type(self.condition) != types.StringType :
108           self.cr.fatal("L'attribut 'condition' doit etre une chaine de caractères : %s" %`self.condition`)
109       else:
110         self.cr.fatal("La condition ne doit pas valoir None !")
111       self.verif_cata_regles()
112
113    def verif_presence(self,dict,globs):
114       """
115          Cette méthode vérifie si le dictionnaire passé en argument (dict)
116          est susceptible de contenir un bloc de mots-clés conforme à la 
117          définition qu'il porte.
118
119          Si la réponse est oui, la méthode retourne 1
120
121          Si la réponse est non, la méthode retourne 0
122  
123          Le dictionnaire dict a pour clés les noms des mots-clés et pour valeurs
124          les valeurs des mots-clés
125       """
126       # On recopie le dictionnaire pour protéger l'original 
127       dico=dict.copy()
128       if self.condition != None :
129         try:
130           test = eval(self.condition,globs,dico)
131           return test
132         except NameError:
133           # erreur 'normale' : un mot-clé n'est pas présent et on veut l'évaluer dans la condition
134           if CONTEXT.debug:
135              l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
136              print "WARNING : Erreur a l'evaluation de la condition "+string.join(l)
137           return 0
138         except SyntaxError:
139           # le texte de la condition n'est pas du Python correct --> faute de catalogue
140           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
141           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
142                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
143         except:
144           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
145           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
146                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
147       else :
148         return 0
149