2 Ce module contient la classe mixin ETAPE qui porte les méthodes
3 nécessaires pour réaliser la validation d'un objet de type ETAPE
6 Une classe mixin porte principalement des traitements et est
7 utilisée par héritage multiple pour composer les traitements.
10 import string,types,sys
15 from Noyau.N_Exception import AsException
16 from Noyau.N_utils import AsType
18 class ETAPE(V_MCCOMPO.MCCOMPO):
22 def isvalid(self,sd='oui',cr='non'):
24 Methode pour verifier la validité de l'objet ETAPE. Cette méthode
25 peut etre appelée selon plusieurs modes en fonction de la valeur
28 Si cr vaut oui elle crée en plus un compte-rendu.
30 Cette méthode a plusieurs fonctions :
32 - mettre à jour l'état de self (update)
34 - retourner un indicateur de validité 0=non, 1=oui
36 - produire un compte-rendu : self.cr
39 if CONTEXT.debug : print "ETAPE.isvalid ",self.nom
40 if self.state == 'unchanged' :
44 if hasattr(self,'valid'):
45 old_valid = self.valid
48 # on teste si demandé la structure de donnée (par défaut)
50 if self.sd != None :pass
51 # Ce test parait superflu. Il est sur que si sd existe il s'agit du concept produit
52 # Quelle pourrait etre la raison qui ferait que sd n existe pas ???
53 #if self.jdc.get_sdprod(self.sd.nom) == None :
55 # self.cr.fatal('Le concept '+self.sd.nom+" n'existe pas")
58 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
60 # on teste, si elle existe, le nom de la sd (sa longueur doit être <= 8 caractères)
62 # la SD existe déjà : on regarde son nom
63 if self.sd.nom != None :
64 if len(self.sd.nom) > 8 and self.jdc.definition.code == 'ASTER' :
66 self.cr.fatal("Le nom de concept %s est trop long (8 caractères maxi)" %self.sd.nom)
68 if string.find(self.sd.nom,'sansnom') != -1 :
69 # la SD est 'sansnom' : --> erreur
71 self.cr.fatal("Pas de nom pour le concept retourné")
73 elif string.find(self.sd.nom,'SD_') != -1 :
74 # la SD est 'SD_' cad son nom = son id donc pas de nom donné par utilisateur : --> erreur
76 self.cr.fatal("Pas de nom pour le concept retourné")
78 # on teste les enfants
79 for child in self.mc_liste :
80 if not child.isvalid():
83 # on teste les règles de self
84 text_erreurs,test_regles = self.verif_regles()
86 if cr == 'oui' : self.cr.fatal(string.join(("Règle(s) non respectée(s) :", text_erreurs)))
88 if self.reste_val != {}:
90 self.cr.fatal("Mots cles inconnus :" + string.join(self.reste_val.keys(),','))
92 if sd == 'oui' and valid:
93 valid = self.update_sdprod(cr)
95 self.state = 'unchanged'
97 if old_valid != self.valid : self.init_modif_up()
100 def update_sdprod(self,cr='non'):
102 Cette méthode met à jour le concept produit en fonction des conditions initiales :
104 1- Il n'y a pas de concept retourné (self.definition.sd_prod == None)
106 2- Le concept retourné n existait pas (self.sd == None)
108 3- Le concept retourné existait. On change alors son type ou on le supprime
110 En cas d'erreur (exception) on retourne un indicateur de validité de 0 sinon de 1
112 sd_prod=self.definition.sd_prod
113 if type(sd_prod) == types.FunctionType: # Type de concept retourné calculé
114 d=self.cree_dict_valeurs(self.mc_liste)
116 sd_prod= apply(sd_prod,(),d)
118 # Erreur pendant le calcul du type retourné
119 if CONTEXT.debug:traceback.print_exc()
122 l=traceback.format_exception(sys.exc_info()[0],
125 self.cr.fatal('Impossible d affecter un type au résultat\n'+ string.join(l[2:]))
127 # on teste maintenant si la SD est r\351utilis\351e ou s'il faut la cr\351er
129 if AsType(self.reuse) != sd_prod:
130 if cr == 'oui' : self.cr.fatal('Type de concept reutilise incompatible avec type produit')
135 if sd_prod == None:# Pas de concept retourné
136 # Que faut il faire de l eventuel ancien sd ?
140 # Un sd existe deja, on change son type
141 self.sd.__class__=sd_prod
143 # Le sd n existait pas , on ne le crée pas
144 if cr == 'oui' : self.cr.fatal("Concept retourné non défini")
146 if self.definition.reentrant == 'o':
153 Methode pour generation d un rapport de validite
155 self.cr=self.CR(debut='Etape : '+self.nom \
156 + ' ligne : '+`self.appel[0]`\
157 + ' fichier : '+`self.appel[1]`,
158 fin = 'Fin Etape : '+self.nom)
159 self.state = 'modified'
161 self.isvalid(cr='oui')
162 except AsException,e:
163 if CONTEXT.debug : traceback.print_exc()
164 self.cr.fatal(string.join(('Etape :',self.nom,
165 'ligne :',`self.appel[0]`,
166 'fichier :',`self.appel[1]`,str(e))))
167 for child in self.mc_liste:
168 self.cr.add(child.report())