Salome HOME
bug
[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 - 2017  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 methodes
24    necessaires pour realiser la validation d'un objet de type MCSIMP
25    derive de OBJECT.
26
27    Une classe mixin porte principalement des traitements et est
28    utilisee par heritage multiple pour composer les traitements.
29 """
30 # Modules Python
31 from __future__ import absolute_import
32 try :
33    from builtins import str
34    from builtins import object
35 except : pass
36 import traceback
37
38 # Modules EFICAS
39 from Noyau import N_CR
40 from Noyau.N_Exception import AsException
41 from Noyau.N_VALIDATOR import ValError, TypeProtocol, CardProtocol, IntoProtocol
42 from Noyau.N_VALIDATOR import listProto
43 from Extensions.i18n import tr
44
45
46 class MCSIMP(object):
47
48     """
49        COMMENTAIRE CCAR:
50        Cette classe est quasiment identique a la classe originale d'EFICAS
51        a part quelques changements cosmetiques et des chagements pour la
52        faire fonctionner de facon plus autonome par rapport a l'environnement
53        EFICAS
54
55        A mon avis, il faudrait aller plus loin et reduire les dependances
56        amont au strict necessaire.
57
58            - Est il indispensable de faire l'evaluation de la valeur dans le contexte
59              du jdc dans cette classe.
60
61            - Ne pourrait on pas doter les objets en presence des methodes suffisantes
62              pour eviter les tests un peu particuliers sur GEOM, PARAMETRE et autres. J'ai
63              d'ailleurs modifie la classe pour eviter l'import de GEOM
64     """
65
66     CR = N_CR.CR
67
68     def __init__(self):
69         self.state = 'undetermined'
70         self.typeProto = TypeProtocol("type", typ=self.definition.type)
71         self.intoProto = IntoProtocol(
72             "into", into=self.definition.into, val_min=self.definition.val_min, val_max=self.definition.val_max)
73         self.cardProto = CardProtocol(
74             "card", min=self.definition.min, max=self.definition.max)
75
76     def getValid(self):
77         if hasattr(self, 'valid'):
78             return self.valid
79         else:
80             self.valid = None
81             return None
82
83     def setValid(self, valid):
84         old_valid = self.getValid()
85         self.valid = valid
86         self.state = 'unchanged'
87         if not old_valid or old_valid != self.valid:
88             self.initModifUp()
89
90     def isValid(self, cr='non'):
91         """
92            Cette methode retourne un indicateur de validite de l'objet de type MCSIMP
93
94              - 0 si l'objet est invalide
95              - 1 si l'objet est valide
96
97            Le parametre cr permet de parametrer le traitement. Si cr == 'oui'
98            la methode construit egalement un comte-rendu de validation
99            dans self.cr qui doit avoir ete cree prealablement.
100         """
101         if self.state == 'unchanged':
102             return self.valid
103         else:
104             valid = 1
105             v = self.valeur
106             #  verification presence
107             if self.isOblig() and (v == None or v == "" ):
108                 if cr == 'oui':
109                     self.cr.fatal( "Mandatory keyword : %s has no value" % tr(self.nom))
110                 valid = 0
111
112             lval = listProto.adapt(v)
113             # Ajout PN
114             # Pour tenir compte des Tuples
115             if hasattr(self.definition.type[0],'ntuple') :
116                try :
117                   if (not (type(lval[0]) is tuple)) and (not (type(lval[0]) is list)) : lval=(lval,)
118                except :
119                   pass
120             if lval is None:
121                 valid = 0
122                 if cr == 'oui':
123                     self.cr.fatal("None is not a valid value")
124             else:
125                 # type,into ...
126                 # typeProto=TypeProtocol("type",typ=self.definition.type)
127                 # intoProto=IntoProtocol("into",into=self.definition.into,val_min=self.definition.val_min,val_max=self.definition.val_max)
128                 # cardProto=CardProtocol("card",min=self.definition.min,max=self.definition.max)
129                 # typeProto=self.definition.typeProto
130                 # intoProto=self.definition.intoProto
131                 # cardProto=self.definition.cardProto
132                 typeProto = self.typeProto
133                 intoProto = self.intoProto
134                 cardProto = self.cardProto
135                 if cr == 'oui':
136                     # un cr est demande : on collecte tous les types d'erreur
137                     try:
138                         for val in lval:
139                             typeProto.adapt(val)
140                     except ValError as e:
141                         valid = 0
142                         self.cr.fatal(str(e))
143                     try:
144                         for val in lval:
145                             intoProto.adapt(val)
146                     except ValError as e:
147                         valid = 0
148                         self.cr.fatal(str(e))
149                     try:
150                         cardProto.adapt(lval)
151                     except ValError as e:
152                         valid = 0
153                         self.cr.fatal(str(e))
154                     #
155                     # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
156                     #
157                     if valid and self.definition.validators:
158                         try:
159                             self.definition.validators.convert(lval)
160                         except ValError as e:
161                             self.cr.fatal(
162                                 "invalid keyword %s  : %s\nCriteria : %s" % (tr(self.nom)), str(e), self.definition.validators.info())
163                             valid = 0
164                 else:
165                     # si pas de cr demande, on sort a la toute premiere erreur
166                     try:
167                         for val in lval:
168                             typeProto.adapt(val)
169                             intoProto.adapt(val)
170                         cardProto.adapt(lval)
171                         if self.definition.validators:
172                             if hasattr(self.definition.validators, 'set_MCSimp'):
173                                 self.definition.validators.set_MCSimp(self)
174                             self.definition.validators.convert(lval)
175                     except ValError as e:
176                         valid = 0
177
178             self.setValid(valid)
179             return self.valid
180
181     def isOblig(self):
182         """ indique si le mot-cle est obligatoire
183         """
184         return self.definition.statut == 'o'
185
186     def initModifUp(self):
187         """
188            Propage l'etat modifie au parent s'il existe et n'est l'objet
189            lui-meme
190         """
191         if self.parent and self.parent != self:
192             self.parent.state = 'modified'
193
194     def report(self):
195         """ genere le rapport de validation de self """
196         self.cr = self.CR()
197         self.cr.debut = "Simple Keyword : " + tr(self.nom)
198         self.cr.fin = "End Simple Keyword: " + tr(self.nom)
199         self.state = 'modified'
200         try:
201             self.isValid(cr='oui')
202         except AsException as e:
203             if CONTEXT.debug:
204                 traceback.print_exc()
205             self.cr.fatal("Simple Keyword  : %s %s" % (tr(self.nom), e))
206         return self.cr