Salome HOME
gestion des listes et label sur 2
[tools/eficas.git] / Validation / V_MCCOMPO.py
1 # coding=utf-8
2 # person_in_charge: mathieu.courtois at edf.fr
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2015  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
23 """
24    Ce module contient la classe  de base MCCOMPO qui sert à factoriser
25    les traitements des objets composites de type OBJECT
26 """
27 # Modules Python
28 import os
29 import traceback
30
31 # Modules EFICAS
32 from Noyau import MAXSIZE, MAXSIZE_MSGCHK
33 from Noyau import N_CR
34 from Noyau.N_Exception import AsException
35 from Noyau.strfunc import ufmt, to_unicode
36
37
38 class MCCOMPO:
39
40     """
41         L'attribut mc_liste a été créé par une classe dérivée de la
42         classe MCCOMPO du Noyau
43     """
44
45     CR = N_CR.CR
46
47     def __init__(self):
48         self.state = 'undetermined'
49         # défini dans les classes dérivées
50         self.txt_nat = ''
51
52     def init_modif_up(self):
53         """
54            Propage l'état modifié au parent s'il existe et n'est pas l'objet
55            lui-meme
56         """
57         if self.parent and self.parent != self:
58             self.parent.state = 'modified'
59
60     def report(self):
61         """
62             Génère le rapport de validation de self
63         """
64         self.cr = self.CR()
65         self.cr.debut = self.txt_nat + self.nom
66         self.cr.fin = u"Fin " + self.txt_nat + self.nom
67         i = 0
68         for child in self.mc_liste:
69             i += 1
70             if i > MAXSIZE:
71                 print(MAXSIZE_MSGCHK.format(MAXSIZE, len(self.mc_liste)))
72                 break
73             self.cr.add(child.report())
74         self.state = 'modified'
75         try:
76             self.isvalid(cr='oui')
77         except AsException, e:
78             if CONTEXT.debug:
79                 traceback.print_exc()
80             self.cr.fatal(' '.join((self.txt_nat, self.nom, str(e))))
81         return self.cr
82
83     def verif_regles(self):
84         """
85            A partir du dictionnaire des mots-clés présents, vérifie si les règles
86            de self sont valides ou non.
87
88            Retourne une chaine et un booléen :
89
90              - texte = la chaine contient le message d'erreur de la (les) règle(s) violée(s) ('' si aucune)
91
92              - testglob = booléen 1 si toutes les règles OK, 0 sinon
93         """
94         # On verifie les regles avec les defauts affectés
95         dictionnaire = self.dict_mc_presents(restreint='non')
96         texte = ['']
97         testglob = 1
98         for r in self.definition.regles:
99             erreurs, test = r.verif(dictionnaire)
100             testglob = testglob * test
101             if erreurs != '':
102                 texte.append(to_unicode(erreurs))
103         texte = os.linesep.join(texte)
104         return texte, testglob
105
106     def dict_mc_presents(self, restreint='non'):
107         """
108             Retourne le dictionnaire {mocle : objet} construit à partir de self.mc_liste
109             Si restreint == 'non' : on ajoute tous les mots-clés simples du catalogue qui ont
110             une valeur par défaut
111             Si restreint == 'oui' : on ne prend que les mots-clés effectivement entrés par
112             l'utilisateur (cas de la vérification des règles)
113         """
114         dico = {}
115         # on ajoute les couples {nom mot-clé:objet mot-clé} effectivement
116         # présents
117         for v in self.mc_liste:
118             if v == None:
119                 continue
120             k = v.nom
121             dico[k] = v
122         if restreint == 'oui':
123             return dico
124         # Si restreint != 'oui',
125         # on ajoute les couples {nom mot-clé:objet mot-clé} des mots-clés simples
126         # possibles pour peu qu'ils aient une valeur par défaut
127         for k, v in self.definition.entites.items():
128             if v.label != 'SIMP':
129                 continue
130             if not v.defaut:
131                 continue
132             if not dico.has_key(k):
133                 dico[k] = v(nom=k, val=None, parent=self)
134         # on ajoute l'objet detenteur de regles pour des validations plus
135         # sophistiquees (a manipuler avec precaution)
136         dico["self"] = self
137         return dico