Salome HOME
Add COPYING license file
[tools/eficas.git] / Validation / V_MCSIMP.py
1 # coding=utf-8
2 # person_in_charge: mathieu.courtois at edf.fr
3 # ======================================================================
4 # COPYRIGHT (C) 2007-2021  EDF R&D                  
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              oui surtout pour les filtres et les validateurs
61
62            - Ne pourrait on pas doter les objets en presence des methodes suffisantes
63              pour eviter les tests un peu particuliers sur GEOM, PARAMETRE et autres. J'ai
64              d'ailleurs modifie la classe pour eviter l'import de GEOM
65     """
66
67     CR = N_CR.CR
68
69     def __init__(self):
70         self.state = 'undetermined'
71         self.typeProto = TypeProtocol("type", typ=self.definition.type)
72         self.intoProto = IntoProtocol(
73             "into", into=self.definition.into, val_min=self.definition.val_min, val_max=self.definition.val_max)
74         self.cardProto = CardProtocol(
75             "card", min=self.definition.min, max=self.definition.max)
76
77     def getValid(self):
78         if hasattr(self, 'valid'):
79             return self.valid
80         else:
81             self.valid = None
82             return None
83
84     def setValid(self, valid):
85         old_valid = self.getValid()
86         self.valid = valid
87         self.state = 'unchanged'
88         if not old_valid or old_valid != self.valid:
89             self.initModifUp()
90
91     def isValid(self, cr='non'):
92         """
93            Cette methode retourne un indicateur de validite de l'objet de type MCSIMP
94
95              - 0 si l'objet est invalide
96              - 1 si l'objet est valide
97
98            Le parametre cr permet de parametrer le traitement. Si cr == 'oui'
99            la methode construit egalement un comte-rendu de validation
100            dans self.cr qui doit avoir ete cree prealablement.
101         """
102         if self.state == 'unchanged':
103             return self.valid
104         else:
105             valid = 1
106             v = self.valeur
107             #  verification presence
108             if self.isOblig() and (v == None or v == "" ):
109                 if cr == 'oui':
110                     self.cr.fatal( "Mandatory keyword : %s has no value" % tr(self.nom))
111                 valid = 0
112
113             lval = listProto.adapt(v)
114             # Ajout PN
115             # Pour tenir compte des Tuples
116             if hasattr(self.definition.type[0],'ntuple') :
117                 try :
118                     if (not (type(lval[0]) is tuple)) and (not (type(lval[0]) is list)) : lval=(lval,)
119                 except :
120                     pass
121             if lval is None:
122                 valid = 0
123                 if cr == 'oui':
124                     self.cr.fatal("None is not a valid value")
125             else:
126                 # type,into ...
127                 # typeProto=TypeProtocol("type",typ=self.definition.type)
128                 # intoProto=IntoProtocol("into",into=self.definition.into,val_min=self.definition.val_min,val_max=self.definition.val_max)
129                 # cardProto=CardProtocol("card",min=self.definition.min,max=self.definition.max)
130                 # typeProto=self.definition.typeProto
131                 # intoProto=self.definition.intoProto
132                 # cardProto=self.definition.cardProto
133                 typeProto = self.typeProto
134                 intoProto = self.intoProto
135                 cardProto = self.cardProto
136                 if cr == 'oui':
137                     # un cr est demande : on collecte tous les types d'erreur
138                     try:
139                         for val in lval:
140                             typeProto.adapt(val)
141                     except ValError as e:
142                         valid = 0
143                         self.cr.fatal(str(e))
144                     try:
145                         for val in lval:
146                             intoProto.adapt(val)
147                     except ValError as e:
148                         valid = 0
149                         self.cr.fatal(str(e))
150                     try:
151                         cardProto.adapt(lval)
152                     except ValError as e:
153                         valid = 0
154                         self.cr.fatal(str(e))
155                     #
156                     # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
157                     #
158                     if valid and self.definition.validators:
159                         try:
160                             self.definition.validators.convert(lval)
161                         except ValError as e:
162                             self.cr.fatal( "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