From 990fe7984bf5db9aa10bd636a8287216a2d5ddb9 Mon Sep 17 00:00:00 2001 From: Eric Fayolle Date: Mon, 25 Feb 2019 09:56:06 +0100 Subject: [PATCH] =?utf8?q?Utilisation=20d'une=20autre=20m=C3=A9thode=20pou?= =?utf8?q?r=20l'insertion=20des=20objets=20PyxB?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Efi2Xsd/AccasXsd.py | 4 +- Efi2Xsd/MCAccasXsd.py | 134 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 113 insertions(+), 25 deletions(-) diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index db61521f..07164a99 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -113,7 +113,7 @@ class X_definitionComposee (X_definition): # ______________________ # valable pour PROC et OPER self.minOccurs = 0 - self.maxOccurs = "unbounded" + self.maxOccurs = "1" def compare(self,autreMC): if self.label != autreMC.label : return False @@ -129,6 +129,8 @@ class X_definitionComposee (X_definition): # --------------------------------- class X_FACT (X_definitionComposee): #--------- ------------------------ +#Un FACT avec max=** doit se projeter en XSD sous forme d'une sequence a cardinalite 1 et +# l'element qui porte la repetition du FACT def traduitMinMax(self): if self.max == '**' or self.max == float('inf') : self.maxOccurs="unbounded" else : self.maxOccurs = self.max diff --git a/Efi2Xsd/MCAccasXsd.py b/Efi2Xsd/MCAccasXsd.py index d5b6c645..68dce819 100755 --- a/Efi2Xsd/MCAccasXsd.py +++ b/Efi2Xsd/MCAccasXsd.py @@ -48,7 +48,7 @@ class X_OBJECT: if grandPere : grandPere.reconstruitAvecNvlObj(ancienObjPerePyxb,nvlObjPerePyxb) print ('----------- fin delObjPyxb', self.nom) - def addObjPyxb(self,indiceDansLeContenu): + def addObjPyxbV0(self,indiceDansLeContenu): if not self.cata.modeleMetier : return #print ('**********************************************') #print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDansLeContenu) @@ -84,6 +84,51 @@ class X_OBJECT: #print (self.nom, ' a pour gp ', grandPere) if grandPere : grandPere.reconstruitAvecNvlObj(ancienObjPerePyxb,nvlObjPerePyxb) + def addObjPyxb(self,indiceDansLeContenu): + if not self.cata.modeleMetier : return + print ('**********************************************') + print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDansLeContenu) + # adherence Accas sur le parent + parent=self.parent + while (parent.isBLOC()): parent=parent.parent + self.perePyxb=parent + + #EF: grandPere et ancienObjPerePyxb sont devenus inutiles + # grandPere=self.perePyxb.perePyxb + # ancienObjPerePyxb=self.perePyxb.objPyxb + # print ('dans le perePyxb', self.perePyxb.nom) + # print ('j ai pour orderedContent', self.objPyxb.orderedContent()) + + self.objPyxb.objAccas=self + + # listeArg=[] + # indice=0 + # # a tester + # # a affiner si on ajoute en fin + # #print (indiceDansLeContenu) + # #print (self.perePyxb.objPyxb.orderedContent()) + # for i in self.perePyxb.objPyxb.orderedContent(): + # if indice==indiceDansLeContenu : listeArg.append(self.objPyxb) + # else : listeArg.append(i._Content__value) + # indice=indice+1 + # #print ('avec', listeArg) + # if indiceDansLeContenu == len(self.perePyxb.objPyxb.orderedContent()): + # listeArg.append(self.objPyxb) + print('self.cata.modeleMetier.Namespace : ',self.cata.modeleMetier.Namespace) + print('self.nom : ',self.nom) + elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom)) + #perePyxb est en fait l'objet ACAS père de notre objet PyxB (Il peut être éloigné à cause des BLOCS) + self.perePyxb.objPyxb.orderedContent().insert(indiceDansLeContenu,elt) + setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb) + #print ('avec', listeArg) + + #EF: J'imagine que la ligne suivante sert a demander au père de se reconstruire avec la liste des args + #nvlObjPerePyxb=self.perePyxb.maClasseModeleMetier(*listeArg) + #self.perePyxb.objPyxb=nvlObjPerePyxb + #self.perePyxb.objPyxb.objAccas=ancienObjPerePyxb.objAccas + #print (self.nom, ' a pour gp ', grandPere) + #if grandPere : grandPere.reconstruitAvecNvlObj(ancienObjPerePyxb,nvlObjPerePyxb) + def reconstruitAvecNvlObj(self, ancienObj,nvlObj): if not self.cata.modeleMetier : return print ('reconstruitAvecNvlObj pour', self, self.nom, ancienObj,nvlObj) @@ -167,9 +212,9 @@ class X_MCSIMP(X_OBJECT): print ('addObjPyxb : ajout de ', self.nom, 'en ', indiceDsLeContenu) # adherence Accas sur le parent - parent=self.parent - while (parent.isBLOC() ): parent=parent.parent - self.perePyxb=parent + # parent=self.parent + # while (parent.isBLOC() ): parent=parent.parent + # self.perePyxb=parent #print ('dans le perePyxb', self.perePyxb.nom) #print (dir(self.perePyxb)) @@ -177,22 +222,25 @@ class X_MCSIMP(X_OBJECT): self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) #nvlObj=self.maClasseModeleMetier() #nvlObj=self.maClasseModeleMetier(_validate_constraints=False) - if self.valeur != None : nvlObj=self.maClasseModeleMetier(self.valeur) - else : nvlObj=self.maClasseModeleMetier(_validate_constraints=False); + if self.valeur != None : self.objPyxb=self.maClasseModeleMetier(self.valeur) + else : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False); #print (self.perePyxb.objPyxb.orderedContent()) #for i in (self.perePyxb.objPyxb.orderedContent()): print i._Content__value;print (type(i._Content__value)) - setattr(self.perePyxb.objPyxb,self.nom,nvlObj) - tampon=self.perePyxb.objPyxb.orderedContent()[-1] - self.objPyxb = nvlObj - self.objPyxb.objAccas=self - indexOC=-1 - longueur=len(self.perePyxb.objPyxb.orderedContent()) - #print (self.perePyxb.objPyxb.orderedContent()) - #print (self.perePyxb.nom) - for i in reversed(range(longueur)): - self.perePyxb.objPyxb.orderedContent()[i]=self.perePyxb.objPyxb.orderedContent()[i-1] - if i == indiceDsLeContenu + 1 : break - self.perePyxb.objPyxb.orderedContent()[indiceDsLeContenu]=tampon + + X_OBJECT.addObjPyxb(self, indiceDsLeContenu) + + # setattr(self.perePyxb.objPyxb,self.nom,nvlObj) + # tampon=self.perePyxb.objPyxb.orderedContent()[-1] + # self.objPyxb = nvlObj + # self.objPyxb.objAccas=self + # indexOC=-1 + # longueur=len(self.perePyxb.objPyxb.orderedContent()) + # #print (self.perePyxb.objPyxb.orderedContent()) + # #print (self.perePyxb.nom) + # for i in reversed(range(longueur)): + # self.perePyxb.objPyxb.orderedContent()[i]=self.perePyxb.objPyxb.orderedContent()[i-1] + # if i == indiceDsLeContenu + 1 : break + # self.perePyxb.objPyxb.orderedContent()[indiceDsLeContenu]=tampon @@ -283,17 +331,17 @@ class X_MCBLOC (X_MCCOMPO): rangDeLObjet=indiceDsLeContenu for obj in self.mcListe: obj.addObjPyxb( rangDeLObjet) - rangDeLObjet=rangDeLObjet+1 + rangDeLObjet=rangDeLObjet+obj.longueurDsArbre() class X_MCLIST (X_MCCOMPO): # -------------------------- - def buildObjPyxb(self,mc_list): + def buildObjPyxb(self,mc_list): #print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list) pass - - def addObjPyxb(self,indiceDansLeContenu): + + def addObjPyxb(self,indiceDansLeContenu): #traceback.print_stack() print ('X_MCLIST addObjPyxb ne fait rien', self.nom) pass @@ -303,9 +351,45 @@ class X_MCLIST (X_MCCOMPO): class X_MCFACT (X_MCCOMPO): # ------------------------- # on gere au niveau du MCCOMPO - pass + def addObjPyxb(self,indiceDansLeContenu): + if not self.cata.modeleMetier : return + print ('**********************************************') + print ('_____________ addObjPyxb ds X_MCLIST', self.nom, indiceDansLeContenu) + # adherence Accas sur le parent + #perePyxb est en fait l'objet ACCAS père de notre objet PyxB (Il peut être éloigné à cause des BLOCS) + parentNonBloc=self.parent + while (parentNonBloc.isBLOC()): parentNonBloc=parentNonBloc.parent + self.perePyxb=parentNonBloc + objPerePyxb=self.perePyxb.objPyxb + + self.objPyxb.objAccas=self + + # print('self.cata.modeleMetier.Namespace : ',self.cata.modeleMetier.Namespace) + # print('self.nom : ',self.nom) + + listeObjets=self.parent.getChild(self.nom,restreint='oui') + nbObjsPresents=len(listeObjets) + # nbObjsPresents == 1 nous indique qu'il n'y avait pas d'objet avec notre 'nom' dans le père + + #Il y a une symetrie entre le contenu de l'orderedContent pour l'objet plural et la liste maintenue pas pyxb pour l'attribut et la mcListe ACCAS + elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=objPerePyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom)) + objPerePyxb.orderedContent().insert(indiceDansLeContenu,elt) + + if (elt.elementDeclaration.isPlural()): + if (nbObjsPresents == 1): + #vérifier que lorsque l'élément est optionnel il existe une liste vide ?? + # setattr(objPerePyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb,) + ouAjouter=0 + else: + ouAjouter=listeObjets.getIndex(self) + liste=getattr(objPerePyxb,elt.elementDeclaration._ElementDeclaration__key) + liste.insert(ouAjouter,self.objPyxb) + else: + setattr(objPerePyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb) + + class X_JDC (X_MCCOMPO): # --------------------- @@ -328,6 +412,8 @@ class X_JDC (X_MCCOMPO): print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh') print ('enregistre ds ',self, etape.nom, 'indice = ', indice) if not self.cata.modeleMetier : return + import traceback + traceback.print_stack() self.objPyxb.append(etape.objPyxb) etape.perePyxb=self #print (self.objPyxb.orderedContent()) @@ -345,7 +431,7 @@ class X_JDC (X_MCCOMPO): #except pyxb.ValidationError as e: # print(e.details()) - def toXml(self): + def toXml(self,fichier=None): if not self.cata.modeleMetier : return print ('***************',self.objPyxb,'***************',) print ('***************',self,'***************',) -- 2.39.2