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.
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.
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.
20 # ======================================================================
23 Ce module contient la classe mixin MCSIMP qui porte les methodes
24 necessaires pour realiser la validation d'un objet de type MCSIMP
27 Une classe mixin porte principalement des traitements et est
28 utilisee par heritage multiple pour composer les traitements.
31 from __future__ import absolute_import
33 from builtins import str
34 from builtins import object
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
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
55 A mon avis, il faudrait aller plus loin et reduire les dependances
56 amont au strict necessaire.
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
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
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)
78 if hasattr(self, 'valid'):
84 def setValid(self, valid):
85 old_valid = self.getValid()
87 self.state = 'unchanged'
88 if not old_valid or old_valid != self.valid:
91 def isValid(self, cr='non'):
93 Cette methode retourne un indicateur de validite de l'objet de type MCSIMP
95 - 0 si l'objet est invalide
96 - 1 si l'objet est valide
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.
102 if self.state == 'unchanged':
107 # verification presence
108 if self.isOblig() and (v == None or v == "" ):
110 self.cr.fatal( "Mandatory keyword : %s has no value" % tr(self.nom))
113 lval = listProto.adapt(v)
115 # Pour tenir compte des Tuples
116 if hasattr(self.definition.type[0],'ntuple') :
118 if (not (type(lval[0]) is tuple)) and (not (type(lval[0]) is list)) : lval=(lval,)
124 self.cr.fatal("None is not a valid value")
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
137 # un cr est demande : on collecte tous les types d'erreur
141 except ValError as e:
143 self.cr.fatal(str(e))
147 except ValError as e:
149 self.cr.fatal(str(e))
151 cardProto.adapt(lval)
152 except ValError as e:
154 self.cr.fatal(str(e))
156 # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
158 if valid and self.definition.validators:
160 self.definition.validators.convert(lval)
161 except ValError as e:
163 "invalid keyword %s : %s\nCriteria : %s" % (tr(self.nom)), str(e), self.definition.validators.info())
166 # si pas de cr demande, on sort a la toute premiere erreur
171 cardProto.adapt(lval)
172 if self.definition.validators:
173 if hasattr(self.definition.validators, 'set_MCSimp'):
174 self.definition.validators.set_MCSimp(self)
175 self.definition.validators.convert(lval)
176 except ValError as e:
183 """ indique si le mot-cle est obligatoire
185 return self.definition.statut == 'o'
187 def initModifUp(self):
189 Propage l'etat modifie au parent s'il existe et n'est l'objet
192 if self.parent and self.parent != self:
193 self.parent.state = 'modified'
196 """ genere le rapport de validation de self """
198 self.cr.debut = "Simple Keyword : " + tr(self.nom)
199 self.cr.fin = "End Simple Keyword: " + tr(self.nom)
200 self.state = 'modified'
202 self.isValid(cr='oui')
203 except AsException as e:
205 traceback.print_exc()
206 self.cr.fatal("Simple Keyword : %s %s" % (tr(self.nom), e))