Salome HOME
premiere version
[tools/eficas.git] / Validation / V_MCCOMPO.py
1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21
22 """
23    Ce module contient la classe  de base MCCOMPO qui sert à factoriser
24    les traitements des objets composites de type OBJECT
25 """
26 # Modules Python
27 import os
28 import traceback
29
30 # Modules EFICAS
31 from Noyau import N_CR
32 from Noyau.N_Exception import AsException
33 from Noyau.strfunc import ufmt, to_unicode
34
35 class MCCOMPO:
36    """
37        L'attribut mc_liste a été créé par une classe dérivée de la
38        classe MCCOMPO du Noyau
39    """
40
41    CR=N_CR.CR
42
43    def __init__(self):
44       self.state = 'undetermined'
45       # défini dans les classes dérivées
46       self.txt_nat = ''
47
48    def init_modif_up(self):
49       """
50          Propage l'état modifié au parent s'il existe et n'est pas l'objet
51          lui-meme
52       """
53       if self.parent and self.parent != self :
54         self.parent.state = 'modified'
55
56    def report(self):
57       """
58           Génère le rapport de validation de self
59       """
60       self.cr=self.CR()
61       self.cr.debut = self.txt_nat+self.nom
62       self.cr.fin = u"Fin "+self.txt_nat+self.nom
63       for child in self.mc_liste:
64         self.cr.add(child.report())
65       self.state = 'modified'
66       try:
67         self.isvalid(cr='oui')
68       except AsException,e:
69         if CONTEXT.debug : traceback.print_exc()
70         self.cr.fatal(' '.join((self.txt_nat, self.nom, str(e))))
71       return self.cr
72
73    def verif_regles(self):
74       """
75          A partir du dictionnaire des mots-clés présents, vérifie si les règles
76          de self sont valides ou non.
77
78          Retourne une chaine et un booléen :
79
80            - texte = la chaine contient le message d'erreur de la (les) règle(s) violée(s) ('' si aucune)
81
82            - testglob = booléen 1 si toutes les règles OK, 0 sinon
83       """
84       # On verifie les regles avec les defauts affectés
85       dictionnaire = self.dict_mc_presents(restreint='non')
86       texte = ['']
87       testglob = 1
88       for r in self.definition.regles:
89         erreurs,test = r.verif(dictionnaire)
90         testglob = testglob*test
91         if erreurs != '':
92             texte.append(to_unicode(erreurs))
93       texte = os.linesep.join(texte)
94       return texte, testglob
95
96    def dict_mc_presents(self,restreint='non'):
97       """
98           Retourne le dictionnaire {mocle : objet} construit à partir de self.mc_liste
99           Si restreint == 'non' : on ajoute tous les mots-clés simples du catalogue qui ont
100           une valeur par défaut
101           Si restreint == 'oui' : on ne prend que les mots-clés effectivement entrés par
102           l'utilisateur (cas de la vérification des règles)
103       """
104       dico={}
105       # on ajoute les couples {nom mot-clé:objet mot-clé} effectivement présents
106       for v in self.mc_liste:
107         if v == None : continue
108         k=v.nom
109         dico[k]=v
110       if restreint == 'oui' : return dico
111       # Si restreint != 'oui',
112       # on ajoute les couples {nom mot-clé:objet mot-clé} des mots-clés simples
113       # possibles pour peu qu'ils aient une valeur par défaut
114       for k,v in self.definition.entites.items():
115         if v.label != 'SIMP' : continue
116         if not v.defaut : continue
117         if not dico.has_key(k):
118           dico[k]=v(nom=k,val=None,parent=self)
119       #on ajoute l'objet detenteur de regles pour des validations plus sophistiquees (a manipuler avec precaution)
120       dico["self"]=self
121       return dico
122
123
124