Salome HOME
legere difference ds VARIABLES_TO_BE...
[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 a factoriser
25    les traitements des objets composites de type OBJECT
26 """
27 from __future__ import print_function
28 # Modules Python
29 from __future__ import absolute_import
30 try :
31   from builtins import str
32   from builtins import object
33 except : pass
34
35 import os
36 import traceback
37
38 # Modules EFICAS
39 from Noyau import MAXSIZE, MAXSIZE_MSGCHK
40 from Noyau import N_CR
41 from Noyau.N_Exception import AsException
42
43
44 class MCCOMPO(object):
45
46     """
47         L'attribut mc_liste a ete cree par une classe derivee de la
48         classe MCCOMPO du Noyau
49     """
50
51     CR = N_CR.CR
52
53     def __init__(self):
54         self.state = 'undetermined'
55         # defini dans les classes derivees
56         self.txt_nat = ''
57
58     def init_modif_up(self):
59         """
60            Propage l'etat modifie au parent s'il existe et n'est pas l'objet
61            lui-meme
62         """
63         if self.parent and self.parent != self:
64             self.parent.state = 'modified'
65
66     def report(self):
67         """
68             Genere le rapport de validation de self
69         """
70         self.cr = self.CR()
71         self.cr.debut = self.txt_nat + self.nom
72         self.cr.fin = "END " + self.txt_nat + self.nom
73         i = 0
74         for child in self.mc_liste:
75             i += 1
76             if i > MAXSIZE:
77                 print(MAXSIZE_MSGCHK.format(MAXSIZE, len(self.mc_liste)))
78                 break
79             self.cr.add(child.report())
80         self.state = 'modified'
81         try:
82             self.isvalid(cr='oui')
83         except AsException as e:
84             if CONTEXT.debug:
85                 traceback.print_exc()
86             self.cr.fatal(' '.join((self.txt_nat, self.nom, str(e))))
87         return self.cr
88
89     def verif_regles(self):
90         """
91            A partir du dictionnaire des mots-cles presents, verifie si les regles
92            de self sont valides ou non.
93
94            Retourne une chaine et un booleen :
95
96              - texte = la chaine contient le message d'erreur de la (les) regle(s) violee(s) ('' si aucune)
97
98              - testglob = booleen 1 si toutes les regles OK, 0 sinon
99         """
100         # On verifie les regles avec les defauts affectes
101         dictionnaire = self.dict_mc_presents(restreint='non')
102         texte = ['']
103         testglob = 1
104         for r in self.definition.regles:
105             erreurs, test = r.verif(dictionnaire)
106             testglob = testglob * test
107             if erreurs != '':
108                 texte.append(str(erreurs))
109         texte = os.linesep.join(texte)
110         return texte, testglob
111
112     def dict_mc_presents(self, restreint='non'):
113         """
114             Retourne le dictionnaire {mocle : objet} construit a partir de self.mc_liste
115             Si restreint == 'non' : on ajoute tous les mots-cles simples du catalogue qui ont
116             une valeur par defaut
117             Si restreint == 'oui' : on ne prend que les mots-cles effectivement entres par
118             l'utilisateur (cas de la verification des regles)
119         """
120         dico = {}
121         # on ajoute les couples {nom mot-cle:objet mot-cle} effectivement
122         # presents
123         for v in self.mc_liste:
124             if v == None:
125                 continue
126             k = v.nom
127             dico[k] = v
128         if restreint == 'oui':
129             return dico
130         # Si restreint != 'oui',
131         # on ajoute les couples {nom mot-cle:objet mot-cle} des mots-cles simples
132         # possibles pour peu qu'ils aient une valeur par defaut
133         for k, v in list(self.definition.entites.items()):
134             if v.label != 'SIMP':
135                 continue
136             if not v.defaut:
137                 continue
138             if not k in dico :
139                 dico[k] = v(nom=k, val=None, parent=self)
140         # on ajoute l'objet detenteur de regles pour des validations plus
141         # sophistiquees (a manipuler avec precaution)
142         dico["self"] = self
143         return dico