Salome HOME
reindent + copyright + merge manuel avec la V9_dev sauf repertoires metier
[tools/eficas.git] / Efi2Xsd / MCAccasXML.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2007-2021   EDF R&D
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Lesser General Public License for more details.
14 #
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21
22 import sys,os
23 import inspect
24 import traceback
25 def trace():
26     traceback.print_stack()
27 #import raw.efficas as efficas
28 import types
29
30 sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
31
32 try :
33     import pyxb
34     import pyxb.binding
35     import pyxb.binding.basis
36     #import pyxb.utils.utility
37     #import pyxb.utils.domutils
38 except : pass
39
40 from Accas import A_ASSD
41
42 class X_OBJECT:
43 # -------------
44
45     def delObjPyxb(self, debug=False):
46         if not self.cata or not self.cata.modeleMetier : return
47         if self.nom == 'Consigne' : return None
48         trouve = False
49
50         if debug : print ('--------------- in delObjPyxb pour ' , self.nom)
51         if debug : print (self.perePyxb.objPyxb.orderedContent())
52         if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
53
54         elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
55         if debug : print ('element moi = ', elt, 'id de moi = ', id(self.objPyxb), self.objPyxb)
56         if (elt.elementDeclaration.isPlural()):
57             if debug : print ('je suis Plural')
58         #   monIndexInOrderedContent=0
59         #   for c in self.perePyxb.objPyxb.orderedContent():
60         #     if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0], type(self.objPyxb)): monIndexInOrderedContent += 1
61         #   listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
62         #   if len(listeObjetsAccas) == 1 : monIndex=0
63         #   else : monIndex=listeObjetsAccas.index(self)
64         #   listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
65         #   listeObjetsPyxb.pop(monIndex)
66         #   self.perePyxb.objPyxb.orderedContent().pop(monIndexInOrderedContent)
67             for c in self.perePyxb.objPyxb.orderedContent():
68                 trouve=False
69                 if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0],type(self.objPyxb)):
70                     monIndex=c.value.index(self.objPyxb)
71                     trouve = True
72                 if trouve : break
73             if not trouve : print ("************ pas trouve au delete"); return
74             listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
75             listeObjetsPyxb.pop(monIndex)
76             # si dernier ?
77         else :
78             newOrderedContent = []
79             for i in self.perePyxb.objPyxb.orderedContent():
80                 if id(self.objPyxb) == id(i._Content__value) : trouve = True ;continue
81                 newOrderedContent.append(i)
82             if not trouve : print ('elt a supprimer ', self.nom, 'non trouve')
83             for i in range(len(newOrderedContent)):
84                 self.perePyxb.objPyxb.orderedContent()[i]=newOrderedContent[i]
85             self.perePyxb.objPyxb.orderedContent().pop(len(newOrderedContent))
86
87             setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,None)
88             if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
89
90
91
92     def addObjPyxb(self,indiceDsLeContenu,debug=False):
93         if not self.cata or not self.cata.modeleMetier : return
94         if debug :print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
95         # adherence Accas sur le parent
96         parent=self.parent
97         while (parent.isBLOC()):
98             if parent != self.parent : indiceDsLeContenu += parent.rangDsPyxb()
99             parent=parent.parent
100         self.perePyxb=parent
101
102         if debug :print ('indiceDsLeContenu',indiceDsLeContenu)
103         if debug :print (pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
104
105         #if self.objPyxb ! = None : self.objPyxb.objAccas=self
106         elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
107         self.perePyxb.objPyxb.orderedContent().insert(indiceDsLeContenu,elt)
108         if (elt.elementDeclaration.isPlural()):
109         # je suis donc un MCList
110             listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
111             if len(listeObjetsAccas) == 1 : monIndex=1
112             else : monIndex=listeObjetsAccas.index(self)
113             listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
114             listeObjetsPyxb.insert(monIndex,self.objPyxb)
115         else :
116             setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
117         if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
118         if debug : print ('fin _____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
119
120
121     def rangDsPyxb(self):
122         monRangEnAccas=self.parent.mcListe.index(self)
123         rangEnPyxb=0
124         for frere in self.parent.mcListe[0: monRangEnAccas] :
125             rangEnPyxb += frere.longueurDsArbre()
126         return rangEnPyxb
127
128
129 class X_MCSIMP(X_OBJECT):
130 # -----------------------
131
132     def buildObjPyxb(self, debug=True) :
133         if not self.cata or not self.cata.modeleMetier : return
134         if self.nom == 'Consigne' : return None
135         if debug : print (self.definition.nomComplet())
136         if debug : print ('_______________ X_MCSIMP buildObjPyxb', self.nom, self,self.valeur)
137         if debug and self.objPyxbDeConstruction == None : print (self.nom, ' pas de pyxb')
138         elif debug : print ('objPyxbDeConstruction', self.objPyxbDeConstruction)
139
140         if self.objPyxbDeConstruction != None :
141             self.objPyxb = self.objPyxbDeConstruction
142             self.maClasseModeleMetier =type(self.objPyxb)
143             self.objPyxbDeConstruction = None
144             if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
145                 self.needFactory=True
146                 self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
147             else : self.needFactory=False
148         else :
149             self.monNomClasseModeleMetier ='T_'+self.nom
150             if hasattr(self.definition,'nomXML') and self.definition.nomXML != None : self.monNomClasseModeleMetier='T_'+self.definition.nomXML
151             if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
152                 nomComplet=self.definition.nomComplet()
153                 if nomComplet in list(self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier].keys()):
154                     self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][nomComplet]
155             if debug : print ('Pour', self.nom, ' le type est ', self.monNomClasseModeleMetier)
156             self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
157
158             if self.waitMatrice() :
159                #PNPN : Attention rien ne relie les objets listeObjPyxb a un objAccas
160                # 27/04 je ne sais pas si cela posera pb
161                self.listeLines = []
162                self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
163                self.maClasseModeleMetier_line=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_line')
164                if debug : print ('Matrice  de type ', self.maClasseModeleMetier)
165                for v in self.valeur: 
166                    l=self.maClasseModeleMetier_line(v)
167                    self.listeLines.append(l)
168                self.objPyxb=self.maClasseModeleMetier(*self.listeLines)
169                #if self.objPyxb !=None : self.objPyxb.objAccas=self
170                if debug : print ('Matrice ', self.nom, self.objPyxb)
171                return
172             if self.waitTuple() :
173                self.objPyxb = []
174                self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
175                # if faut traiter l autre cas
176                # et optimiser
177                if self.definition.max !=1 :
178                   for v in self.valeur :
179                     if debug : print ('je traite ', v)
180                     listeConstruction=[]
181                     for i in range(self.combienEltDsTuple()):
182                         num=i+1
183                         maClasseElt=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_n'+str(num))
184                         listeConstruction.append(maClasseElt(v[i]))
185                     self.objPyxb.append(self.maClasseModeleMetier(*listeConstruction))
186                     if debug  : print (self.objPyxb)
187                   return
188             if self.waitChaineAvecBlancs() and self.definition.max > 1:
189                self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
190                if debug : print (self.valeur)
191                if self.valeur != None and self.valeur != [] : self.objPyxb = self.maClasseModeleMetier(*self.valeur)
192                else :self.objPyxb = self.maClasseModeleMetier()
193                if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
194                if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
195                return
196
197                         
198             if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
199                 if debug : print ('needFactory')
200                 self.needFactory=True
201                 self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
202             else : self.needFactory=False
203
204             if self.valeur != None :
205                 if self.needFactory :
206                     if self.definition.max > 1 :
207                        # PNPN A corriger 
208                        # self.objPyxb=self.maClasseModeleMetier(self.valeur)
209                             self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
210                     else :  self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
211                 else                :  self.objPyxb=self.maClasseModeleMetier(self.valeur)
212             else                   :
213                 if self.needFactory : self.objPyxb=None
214                 else                : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False)
215
216
217             #if self.objPyxb !=None : self.objPyxb.objAccas=self
218         if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
219         if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
220
221
222     def setValeurObjPyxb(self,newVal, debug=True):
223         if not self.cata or not self.cata.modeleMetier : return
224         if debug : print (' ___________________________ dans setValeurObjPyxb MCSIMP ', self.nom, newVal)
225         if debug : print (' self.perePyxb = ', self.perePyxb.nom)
226         if debug : print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb)
227         if debug : print ('debut du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
228
229         #if newVal != None : nvlObj=self.maClasseModeleMetier(newVal)
230         if newVal != None :
231             if self.needFactory : nvlObj=self.maClasseModeleMetierFactory(newVal)
232             else                : nvlObj=self.maClasseModeleMetier(newVal)
233         else                   :
234             if self.needFactory : nvlObj =None
235             else                : nvlObj=self.maClasseModeleMetier(_validate_constraints=False)
236         self.val=newVal
237         if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
238
239         if inspect.isclass(newVal) and issubclass(newVal,A_ASSD)  :
240             newVal = newVal.nom
241         setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
242         trouve=False
243         indice=0
244         for i in self.perePyxb.objPyxb.orderedContent():
245             if i.elementDeclaration.id() == self.nom:
246             #if isinstance(i._Content__value, self.maClasseModeleMetier) :
247                 self.perePyxb.objPyxb.orderedContent()[indice]=self.perePyxb.objPyxb.orderedContent()[-1]
248                 del(self.perePyxb.objPyxb.orderedContent()[-1])
249                 trouve=True
250                 break
251             indice+=1
252         if not trouve : print ('Attention souci au changement de valeur de ', self.nom)
253         self.objPyxb=nvlObj
254         #self.objPyxb.objAccas=self
255         if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
256
257
258
259
260 class X_MCCOMPO(X_OBJECT) :
261 # -------------------------
262 #
263     def buildObjPyxb(self,mc_list, debug=False) :
264         if not self.cata or not self.cata.modeleMetier : return
265
266         #if self.nom == 'Scenario_data' : debug=1
267         if debug : print ('X_MCCOMPO', self.nom)
268         deepDebug=False
269         self.listArg=[]
270         self.dicoArg={}
271         for objAccas in mc_list :
272             if objAccas.nature == 'MCBLOC' :
273                 self.exploreBLOC(objAccas)
274             elif objAccas.nature == 'MCList' :
275                 if objAccas[0].definition.max > 1 :
276                     self.listArg.append(objAccas) # les MCList n ont pas objPyxb
277                     self.dicoArg[objAccas.nom]=[]
278                     for fils in objAccas :
279                         fils.perePyxb=self
280                         self.dicoArg[objAccas.nom].append(fils.objPyxb)
281                 else :
282                     objAccas[0].perePyxb=self
283                     self.dicoArg[objAccas.nom]=objAccas[0].objPyxb
284                     self.listArg.append(objAccas[0].objPyxb)
285             else :
286                 if objAccas.nom == 'Consigne'     : continue
287                 print ('______________', objAccas.nom, objAccas.objPyxb)
288                 self.listArg.append(objAccas.objPyxb)
289                 self.dicoArg[objAccas.nom]=objAccas.objPyxb
290                 objAccas.perePyxb=self
291
292         if debug : print('X_MCCOMPO -- listArg ---',self.nom,self.listArg)
293         if debug : print('X_MCCOMPO -- dicoArg ---',self.nom,self.dicoArg)
294
295
296         self.monNomClasseModeleMetier='T_'+self.nom
297         if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
298             self.nomComplet=self.definition.nomComplet()
299             self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][self.nomComplet]
300         self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
301
302         # PN : Ne doit-on pas tester avant
303         if self.objPyxbDeConstruction != None :
304             self.objPyxb = self.objPyxbDeConstruction
305             self.objPyxbDeConstruction = None
306             if debug : print ('je passe dans le if pour ', self.nom, self.objPyxb, self)
307             if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,self.objPyxb.orderedContent())
308         else :
309             if debug : print (self.listArg)
310             if debug : print (self.maClasseModeleMetier)
311             # self.objPyxb=self.maClasseModeleMetier(*self.listArg)
312             self.objPyxb=self.maClasseModeleMetier(**self.dicoArg)
313             if deepDebug :
314                 print ('debut de __________ new ordered content')
315                 for o in self.objPyxb.orderedContent():
316                     print ('o', o)
317                     print ('value', o.value)
318                     print ('type', type(o.value))
319                     print ('id', id(o.value))
320                 print ('fin __________ new ordered content')
321                 print ('debut de  __________ listArg')
322                 for obj in self.listArg:
323                     print ('obj',obj)
324                     print ('type obj', type(obj))
325                     print ('id(obj)', id(obj))
326                 print ('fin __________  listArg')
327
328             newOrderedContent=[]
329             if debug  : print ('list Arg')
330             for obj in self.listArg:
331                 if debug :
332                     print ('obj',obj)
333                     print ('type obj', type(obj))
334                     print ('id(obj)', id(obj))
335
336                 # on teste le caractere pluriel
337                 if  isinstance(obj, list):
338                     for c in self.objPyxb.orderedContent() :
339                         if hasattr (c,'value') and c.value == obj :
340                            newOrderedContent.append(c)
341                     continue
342                 if (hasattr(obj, 'nature')) : # attention on a un object Accas et non un pyxb car les MCList n ont pas de objPyxb
343                     max=obj[0].definition.max
344                 else : max = 1
345                 if  max == 1 :
346                     #if not(issubclass(type(obj), pyxb.binding.basis.enumeration_mixin) ):
347                     #   newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
348                     #else :
349                     #   newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:type(o.value), self.objPyxb.orderedContent())).index(type(obj))] )
350                     # PN 22 sept 2020 . pourquoi pas toujours l id. le tyoe ne convient pas en cas d union d enum
351                     newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
352                 else  : # element Pural
353                     for c in self.objPyxb.orderedContent() :
354                         if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0], type(obj[0].objPyxb)): newOrderedContent.append(c)
355
356             for i in range(len(self.listArg)):
357                 self.objPyxb.orderedContent()[i]=newOrderedContent[i]
358             debug=True
359             if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb)
360             if debug : print ('X_MCCOMPO', self.listArg)
361             if debug : print ('X_MCCOMPO', newOrderedContent)
362             if debug : print ( 'X_MCCOMPO',self.objPyxb.orderedContent())
363         if debug : print ('fin buildObjetPyxb _______________________________________')
364         # assert(self.objPyxb.validateBinding())
365
366
367     def exploreBLOC(self,objAccas,debug=False):
368         if debug : print (' ds exploreBLOC', objAccas.nom)
369         laListeSsLesBlocs=[]
370         for fils in objAccas.mcListe:
371             if fils.nature == 'MCBLOC' :
372                 self.exploreBLOC(fils)
373             elif fils.nature == 'MCList' :
374                 #print ('exploreBLOC des MCList', fils.nom)
375                 self.dicoArg[fils.nom]=[]
376                 if fils[0].definition.max > 1 :
377                     #print ('ajout de ', fils)
378                     self.listArg.append(fils) # les MCList n ont pas objPyxb
379                     for objFils in fils :
380                         objFils.perePyxb=self
381                         self.dicoArg[fils.nom].append(objFils.objPyxb)
382                 else:
383                     fils[0].perePyxb=self
384                     self.dicoArg[fils.nom]=fils[0].objPyxb
385                     self.listArg.append(fils[0].objPyxb)
386             else :
387                 if fils.nom == "Consigne" : continue
388                 self.listArg.append(fils.objPyxb)
389                 self.dicoArg[fils.nom]=fils.objPyxb
390                 fils.perePyxb=self
391                 if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom)
392         if debug : print ('fin  ds exploreBLOC', objAccas .nom)
393
394
395
396
397 class X_MCBLOC (X_MCCOMPO):
398 # --------------------------
399     def buildObjPyxb(self,mc_list,debug=False):
400         if not self.cata or not self.cata.modeleMetier : return
401         if debug : print ('X_MCBLOC buildObjPyxb', self.nom, self, mc_list, 'ne fait rien')
402         self.perePyxb=None
403         self.objPyxb=None
404
405     def addObjPyxb(self, indiceDsLeContenu, debug=False):
406         if not self.cata or not self.cata.modeleMetier : return
407         if debug : print ('X_MCBLOC addObjPyxb', self.nom, self, self.mcListe, indiceDsLeContenu)
408         rangDeLObjet=indiceDsLeContenu
409         for obj in self.mcListe:
410             obj.addObjPyxb( rangDeLObjet)
411             rangDeLObjet=rangDeLObjet+obj.longueurDsArbre()
412
413     def delObjPyxb(self, debug=False):
414         if not self.cata or not self.cata.modeleMetier : return
415         if debug : print ('X_MCBLOC delObjPyxb', self.nom, ' --------------------------')
416         for obj in self.mcListe:
417             obj.delObjPyxb()
418         if debug : print ('fin X_MCBLOC delObjPyxb --------------------------')
419
420 class X_MCLIST (X_MCCOMPO):
421 # --------------------------
422
423     def buildObjPyxb(self,mc_list, debug=False):
424         if debug : print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list)
425         pass
426
427     def addObjPyxb(self,indiceDsLeContenu, debug=False):
428         if debug : print ('X_MCLIST addObjPyxb', self.nom, indiceDsLeContenu)
429         rangDeLObjet=indiceDsLeContenu
430         for objFils in self :
431             objFils.addObjPyxb(rangDeLObjet)
432             rangDeLObjet= rangDeLObjet + 1
433
434     def delObjPyxb(self, debug=False):
435         if not self.cata or not self.cata.modeleMetier : return
436         if debug : print ('X_MCLIST delObjPyxb', self.nom, ' --------------------------')
437         for obj in self:
438             obj.delObjPyxb()
439         if debug : print ('fin X_MCLIST delObjPyxb --------------------------')
440
441
442 class X_MCFACT (X_MCCOMPO):
443 # -------------------------
444     pass
445
446 class X_ETAPE(X_MCCOMPO) :
447 # -------------------------
448
449     def metAJourNomASSD(self, nom,debug=False):
450         if not self.cata or not self.cata.modeleMetier : return
451         if debug : print ('X_ETAPE metAJourLesAttributs', self.nom, nom,' --------------------------')
452         self.objPyxb.sdName=nom
453
454 class X_JDC (X_MCCOMPO):
455 # ---------------------
456
457     def  __init__(self):
458         self.perePyxb=None
459         if not self.cata or not self.cata.modeleMetier : return
460         #if hasattr(self.cata,'DicoNomTypeDifferentNomElt') : print ('jkllllllllllllllll')
461         if not(hasattr(self.cata,'DicoNomTypeDifferentNomElt')) : self.cata.DicoNomTypeDifferentNomElt={}
462         self.monNomClasseModeleMetier=self.code
463         self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
464         self.objPyxb=self.maClasseModeleMetier()
465         #self.objPyxb.objAccas=self
466         pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.NEVER)
467         pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
468         pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
469
470
471
472     def enregistreEtapePyxb(self,etape,indice=0):
473       # ne fonctionne pas : a reecrire avec les fonctions addObjPyxb et ReconstruitPerePyxb
474       # ne contient pas indice pour l insant
475       # print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh')
476       # print ('enregistre ds ',self, etape.nom, 'indice = ', indice)
477         if not self.cata.modeleMetier : return
478         self.objPyxb.append(etape.objPyxb)
479         etape.perePyxb = self
480
481         #print (self.objPyxb.orderedContent())
482         #if indice   != (len(self.objPyxb.orderedContent()) ) :
483         #  tampon=self.objPyxb.orderedContent()[-1]
484         #  for i in reversed(range(len(self.objPyxb.orderedContent()))):
485         #    self.objPyxb.orderedContent()[i]=self.objPyxb.orderedContent()[i-1]
486         #    if i == indice + 1 : break
487         #  self.objPyxb.orderedContent()[indice]=tampon
488
489         #print (self.objPyxb.orderedContent())
490         #try:
491         #   self.objPyxb.validateBinding()
492         #except pyxb.ValidationError as e:
493         #   print(e.details())
494
495     def toXml(self,fichier=None, debug=False):
496         if debug : print ('ds to XML')
497         if not self.cata or not self.cata.modeleMetier : return
498         if debug : print (' to xml ***************',self.objPyxb,'***************',)
499         if debug : print (' to xml ***************',self,'***************',)
500         if debug : print (' to xml ***************',self.objPyxb.orderedContent(),'***************',)
501         if debug : print(self.objPyxb.toDOM().toprettyxml())
502         if debug : print(self.objPyxb.toxml())
503         return (self.objPyxb.toDOM().toprettyxml())
504
505
506     def analyseFromXML(self,debug=False):
507         print ("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py")
508         if self.procedure == "" : return
509         self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure)
510         if not hasattr(self.cata.modeleMetier,'AccasUserAssd'):
511             from Accas import UserASSD
512             self.cata.modeleMetier.AccasUserAssd=UserASSD
513         for contentObjEtape in self.objPyxb.orderedContent():
514             objEtape=contentObjEtape.value
515             objEtape.dictArgs=(self.pyxbToDict(objEtape))
516             objEtape.monNomClasseAccas=objEtape._ExpandedName.localName()
517             objEtape.monNomClasseAccas=objEtape.monNomClasseAccas[2:]
518             # doute sur les 2 lignes suivantes : objEtape peut etre contentObjEtape 2juin20
519             objEtape.dictPyxb['objEnPyxb']=objEtape
520             objEtape.dictArgs['dicoPyxbDeConstruction']=objEtape.dictPyxb
521             if debug : print ('dicoPyxbDeConstruction', objEtape.dictArgs['dicoPyxbDeConstruction'])
522             maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
523             if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
524             if debug : print ('maClasseAccas ', maClasseAccas)
525             if debug : print ('objEtape ', objEtape , type(objEtape))
526             if debug : print ('nomClasseAccas ',objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas))
527             if debug : print ('_ExpandedName ', objEtape._ExpandedName, type(objEtape._ExpandedName))
528             if debug : print ('dictArgs ',objEtape.dictArgs)
529             if debug : print ('dictPyxb ',objEtape.dictPyxb)
530             # attention au call d Oper qui renomme l objet pyxb
531             if hasattr(objEtape,'sdName') :
532                 if debug and hasattr(objEtape,'sdName') :print ('sdName',objEtape.sdName)
533                 objAccasEtape=maClasseAccas(nomXML=objEtape.sdName, **(objEtape.dictArgs))
534             else : objAccasEtape=maClasseAccas(**(objEtape.dictArgs))
535             if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
536
537
538     def pyxbToDict(self,objAAnalyser, debug=True):
539         # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
540         if objAAnalyser is None: return
541         if debug : print ('debut pour_____________________________ ',objAAnalyser)
542         dictArgs = {}
543         # traitement SIMP
544         # ---------------
545         # a revoir pour les matrices
546         # et les tuples
547         debug = 1
548         if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition):
549             if debug : print ('je suis un MCSimple', objAAnalyser)
550             # traitement scalaire
551             objAAnalyser.dictPyxb=objAAnalyser
552             if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
553                 if debug :  print ('je suis un scalaire')
554                 if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd) or isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssdMultiple):
555                     if debug : print ('je suis un UserASSD')
556                     laClassePyxbUserAssd=type(objAAnalyser)
557                     return self.creeUserAssd(objAAnalyser,laClassePyxbUserAssd)
558                 if isinstance(objAAnalyser, pyxb.binding.datatypes.boolean) : return bool(objAAnalyser)
559                 if isinstance(objAAnalyser, str)  : return str(objAAnalyser)
560                 if isinstance(objAAnalyser, int)  : return int(objAAnalyser)
561                 if isinstance(objAAnalyser, float): return float(objAAnalyser)
562                 if isinstance(objAAnalyser, pyxb.binding.basis.enumeration_mixin):    return str(objAAnalyser)
563                 return objAAnalyser
564             else :
565                 if debug : print ('je suis une liste')
566                 laListe=[]
567                 # liste homogene
568                 if len(objAAnalyser)>0:
569                     if issubclass(objAAnalyser[0].__class__,self.cata.modeleMetier.AccasUserAssd) or issubclass(objAAnalyser[0].__class__,self.cata.modeleMetier.AccasUserAssdMultiple): estUnUserASSDorUserASSDMultiple = True
570                     else : estUnUserASSDorUserASSDMultiple=False
571                 else : estUnUserASSDorUserASSDMultiple=False
572                 if debug : print ('estUnUserASSDorUserASSDMultiple', estUnUserASSDorUserASSDMultiple)
573                 for obj in objAAnalyser :
574                     if estUnUserASSDorUserASSDMultiple:
575                        laClassePyxbUserAssd=obj.__class__
576                        laListe.append(self.creeUserAssd(obj,laClassePyxbUserAssd))
577                     elif isinstance(obj, str): laListe.append (str(obj))
578                     elif isinstance(obj, int): laListe.append (int(obj))
579                     elif isinstance(obj, float): laListe.append (float(obj))
580                     elif isinstance(obj, pyxb.binding.basis.enumeration_mixin): laListe.append(str(obj))
581                     else :  laListe.append(obj)
582                 return (laListe)
583             #  if debug : print ('je suis Plural')
584             # ou ? return objAAnalyser
585             #if isinstance(objAAnalyser, types.StringTypes): return pyxb.utils.utility.QuotedEscaped(objAAnalyser,)
586             #pour une enum getattr(value dans le type)
587             # return pythonLiteral(ReferenceFacet(facet=value, **kw))
588         #print ('je suis un mot complexe')
589         # traitement FACT ou BLOC
590         # ------------------------
591         # il faut traiter les fact multiples
592         objAAnalyser.dictPyxb = {}
593         objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
594         #for expandedName, elementDeclaration in objAAnalyser._ElementMap.items():
595         #    objPyxbName  = expandedName.localName()
596         #    objPyxbValue = getattr(objAAnalyser, objPyxbName)
597         for objEltContentFils in objAAnalyser.orderedContent():
598             objPyxbValue = objEltContentFils.value
599             objPyxbName  = objEltContentFils.elementDeclaration.id()
600             elementDeclaration = objEltContentFils.elementDeclaration
601             #if objPyxbValue == None or objPyxbValue == [] : continue
602             if elementDeclaration.isPlural():
603                 if objPyxbName not in list(dictArgs.keys()) : dictArgs[objPyxbName]=[]
604                 if objPyxbName not in list(objAAnalyser.dictPyxb.keys()) : objAAnalyser.dictPyxb[objPyxbName]=[]
605                 dictArgs[objPyxbName].append(self.pyxbToDict(objPyxbValue))
606                 objAAnalyser.dictPyxb[objPyxbName].append(objPyxbValue.dictPyxb)
607             else:
608                 dictArgs[objPyxbName] = self.pyxbToDict(getattr(objAAnalyser, objPyxbName))
609                 objAAnalyser.dictPyxb[objPyxbName] = objPyxbValue.dictPyxb
610                 # print ('ajout dans dictPyxb', objPyxbName, objPyxbValue.dictPyxb)
611                 #print ('avec la valeur', 'de',  objAAnalyser.dictPyxb[objPyxbName])
612
613         #print ("***********************************")
614         #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
615         #print ('pyxbToDict ', objAAnalyser, objAAnalyser.dictPyxb)
616         #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
617         #print ("***********************************")
618         #print (dictArgs)
619         #print (dictPyxb)
620         #for i in dictArgs.keys(): print (i, " ", dictArgs[i], " ", type(dictArgs[i]))
621         #print ('fin pour ',objAAnalyser)
622         return dictArgs
623
624     def creeUserAssd(self,objAAnalyser,laClassePyxbUserAssd,debug=True):
625
626         enCreation=False
627         if debug : print ('creeUserAssd ', objAAnalyser, ' ',laClassePyxbUserAssd)
628         leTypeIntermediaire=laClassePyxbUserAssd.XsdSuperType()  
629         if debug : print ('leTypeIntermediaire ', leTypeIntermediaire)
630         if debug : print ('leTypeIntermediaire ', leTypeIntermediaire.XsdSuperType())
631         if leTypeIntermediaire.__name__[-2:]== '_C' : enCreation = True
632         elif leTypeIntermediaire.__name__[-2:] != '_U' : print ('pb avec', laClassePyxbUserAssd); return None #exit() 
633         nomClasseAccasUserAssd=leTypeIntermediaire.XsdSuperType().__name__
634         if debug : print ('nomClasseAccasUserAssd', nomClasseAccasUserAssd)
635         laClasseAccas=getattr(self.cata,nomClasseAccasUserAssd)
636         print (laClasseAccas)
637         if not(enCreation):
638             if str(objAAnalyser) in self.g_context.keys():return self.g_context[str(objAAnalyser)]
639             else :
640                 obj=laClasseAccas()
641                 self.g_context[str(objAAnalyser)]=obj
642                 return obj
643         if str(objAAnalyser) in self.g_context.keys():
644             if isinstance(self.g_context[str(objAAnalyser)],laClasseAccas):
645                 return self.g_context[str(objAAnalyser)]
646             else :
647                 nvlObj=laClasseAccas()
648                 oldObj=self.g_context[str(objAAnalyser)]
649                 nvlObj.transfere(oldObj)
650                 self.g_context[str(objAAnalyser)]=nvlObj
651                 return nvlObj
652         else :
653             obj=laClasseAccas()
654             self.g_context[str(objAAnalyser)]=obj
655             return obj
656
657 #   def analyseContent(self,objAAnalyser):
658 #       objAAnalyser.dictArgs={}
659 #       for objContenu in objAAnalyser.content():
660 #          #print ('j analyse ', objContenu)
661 #          objContenu.monNomClasseModeleMetier=str(objContenu.__class__).split('.')[-1]
662 #          objContenu.monNomClasseAccas=objContenu.monNomClasseModeleMetier[2:-2]
663 #          #maClasseAccas=classeAccasPere.entites[objContenu.monNomClasseAccas]
664 #          if objContenu._IsSimpleTypeContent():
665 #             print (objContenu.monNomClasseAccas,objContenu.pythonLiteral())
666 #             print (objContenu.monNomClasseAccas,objContenu.xsdLiteral())
667 #             #chaine=objContenu.pythonLiteral().split('(')[1].split(')')[0]
668 #             print (dir(objContenu))
669 #             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=None
670 #             #objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.pythonLiteral()
671 #          else :
672 #             self.analyseContent(objContenu)
673 #             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.dictArgs
674             #print ( '________________')
675             #print (objAAnalyser.monNomClasseAccas)
676             #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
677             #print ( '________________')
678
679
680
681 if __name__ == "__main__":
682     print ('a faire')