Salome HOME
1er mise en coherence avec la 7_6
[tools/eficas.git] / Validation / V_MCSIMP.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    Ce module contient la classe mixin MCSIMP qui porte les méthodes
24    nécessaires pour réaliser la validation d'un objet de type MCSIMP
25    dérivé de OBJECT.
26
27    Une classe mixin porte principalement des traitements et est
28    utilisée par héritage multiple pour composer les traitements.
29 """
30 # Modules Python
31 import traceback
32
33 # Modules EFICAS
34 from Noyau import N_CR
35 from Noyau.N_Exception import AsException
36 from Noyau.N_VALIDATOR import ValError, TypeProtocol, CardProtocol, IntoProtocol
37 from Noyau.N_VALIDATOR import listProto
38 from Noyau.strfunc import ufmt
39
40
41 class MCSIMP:
42
43     """
44        COMMENTAIRE CCAR:
45        Cette classe est quasiment identique à la classe originale d'EFICAS
46        a part quelques changements cosmétiques et des chagements pour la
47        faire fonctionner de facon plus autonome par rapport à l'environnement
48        EFICAS
49
50        A mon avis, il faudrait aller plus loin et réduire les dépendances
51        amont au strict nécessaire.
52
53            - Est il indispensable de faire l'évaluation de la valeur dans le contexte
54              du jdc dans cette classe.
55
56            - Ne pourrait on pas doter les objets en présence des méthodes suffisantes
57              pour éviter les tests un peu particuliers sur GEOM, PARAMETRE et autres. J'ai
58              d'ailleurs modifié la classe pour éviter l'import de GEOM
59     """
60
61     CR = N_CR.CR
62
63     def __init__(self):
64         self.state = 'undetermined'
65         self.typeProto = TypeProtocol("type", typ=self.definition.type)
66         self.intoProto = IntoProtocol(
67             "into", into=self.definition.into, val_min=self.definition.val_min, val_max=self.definition.val_max)
68         self.cardProto = CardProtocol(
69             "card", min=self.definition.min, max=self.definition.max)
70
71     def get_valid(self):
72         if hasattr(self, 'valid'):
73             return self.valid
74         else:
75             self.valid = None
76             return None
77
78     def set_valid(self, valid):
79         old_valid = self.get_valid()
80         self.valid = valid
81         self.state = 'unchanged'
82         if not old_valid or old_valid != self.valid:
83             self.init_modif_up()
84
85     def isvalid(self, cr='non'):
86         """
87            Cette méthode retourne un indicateur de validité de l'objet de type MCSIMP
88
89              - 0 si l'objet est invalide
90              - 1 si l'objet est valide
91
92            Le paramètre cr permet de paramétrer le traitement. Si cr == 'oui'
93            la méthode construit également un comte-rendu de validation
94            dans self.cr qui doit avoir été créé préalablement.
95         """
96         if self.state == 'unchanged':
97             return self.valid
98         else:
99             valid = 1
100             v = self.valeur
101             #  verification presence
102             if self.isoblig() and v == None:
103                 if cr == 'oui':
104                     self.cr.fatal(
105                         _(u"Mot-clé : %s obligatoire non valorisé"), self.nom)
106                 valid = 0
107
108             lval = listProto.adapt(v)
109             # Ajout PN
110             # Pour tenir compte des Tuples
111             if hasattr(self.definition.type[0],'ntuple') :
112                try :
113                   if not (type(lval[0]) is tuple) : lval=(lval,)
114                except :
115                   pass
116
117             if lval is None:
118                 valid = 0
119                 if cr == 'oui':
120                     self.cr.fatal(_(u"None n'est pas une valeur autorisée"))
121             else:
122                 # type,into ...
123                 # typeProto=TypeProtocol("type",typ=self.definition.type)
124                 # intoProto=IntoProtocol("into",into=self.definition.into,val_min=self.definition.val_min,val_max=self.definition.val_max)
125                 # cardProto=CardProtocol("card",min=self.definition.min,max=self.definition.max)
126                 # typeProto=self.definition.typeProto
127                 # intoProto=self.definition.intoProto
128                 # cardProto=self.definition.cardProto
129                 typeProto = self.typeProto
130                 intoProto = self.intoProto
131                 cardProto = self.cardProto
132                 if cr == 'oui':
133                     # un cr est demandé : on collecte tous les types d'erreur
134                     try:
135                         for val in lval:
136                             typeProto.adapt(val)
137                     except ValError, e:
138                         valid = 0
139                         self.cr.fatal(*e)
140                     try:
141                         for val in lval:
142                             intoProto.adapt(val)
143                     except ValError, e:
144                         valid = 0
145                         self.cr.fatal(*e)
146                     try:
147                         cardProto.adapt(lval)
148                     except ValError, e:
149                         valid = 0
150                         self.cr.fatal(*e)
151                     #
152                     # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
153                     #
154                     if valid and self.definition.validators:
155                         try:
156                             self.definition.validators.convert(lval)
157                         except ValError, e:
158                             self.cr.fatal(
159                                 _(u"Mot-clé %s invalide : %s\nCritère de validité: %s"),
160                                 self.nom, str(e), self.definition.validators.info())
161                             valid = 0
162                 else:
163                     # si pas de cr demande, on sort a la toute premiere erreur
164                     try:
165                         for val in lval:
166                             typeProto.adapt(val)
167                             intoProto.adapt(val)
168                         cardProto.adapt(lval)
169                         if self.definition.validators:
170                             if hasattr(self.definition.validators, 'set_MCSimp'):
171                                 self.definition.validators.set_MCSimp(self)
172                             self.definition.validators.convert(lval)
173                     except ValError, e:
174                         valid = 0
175
176             self.set_valid(valid)
177             return self.valid
178
179     def isoblig(self):
180         """ indique si le mot-clé est obligatoire
181         """
182         return self.definition.statut == 'o'
183
184     def init_modif_up(self):
185         """
186            Propage l'état modifié au parent s'il existe et n'est l'objet
187            lui-meme
188         """
189         if self.parent and self.parent != self:
190             self.parent.state = 'modified'
191
192     def report(self):
193         """ génère le rapport de validation de self """
194         self.cr = self.CR()
195         self.cr.debut = u"Mot-clé simple : " + self.nom
196         self.cr.fin = u"Fin Mot-clé simple : " + self.nom
197         self.state = 'modified'
198         try:
199             self.isvalid(cr='oui')
200         except AsException, e:
201             if CONTEXT.debug:
202                 traceback.print_exc()
203             self.cr.fatal(_(u"Mot-clé simple : %s %s"), self.nom, e)
204         return self.cr