+ def get_verif_contexte(self):
+ #print "get_verif_contexte"
+ j_context=self.get_contexte_avant(None)
+ self.verif_contexte(j_context)
+ return j_context
+
+ def force_contexte(self,contexte):
+ for nom_sd,sd in list(contexte.items()):
+ if not isinstance(sd,ASSD):continue
+ autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
+ etape=self.etape_include)
+ if autre_sd is None:continue
+ if sd is not autre_sd:
+ # Il existe un autre concept de meme nom produit par une etape apres self
+ # on detruit ce concept pour pouvoir inserer les etapes du jdc_include
+ if sd.etape:
+ sd.etape.supprime_sdprod(sd)
+
+ return contexte
+
+ def verif_contexte(self,context):
+ """
+ Cette methode verifie si le contexte passe en argument (context)
+ peut etre insere dans le jdc pere de l'include.
+ Elle verifie que les concepts contenus dans ce contexte n'entrent
+ pas en conflit avec les concepts produits dans le jdc pere
+ apres l'include.
+ Si le contexte ne peut pas etre insere, la methode leve une
+ exception sinon elle retourne le contexte inchange
+ """
+ #print "verif_contexte"
+ for nom_sd,sd in list(context.items()):
+ if not isinstance(sd,ASSD):continue
+ autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
+ etape=self.etape_include)
+ if autre_sd is None:continue
+ if sd is not autre_sd:
+ # Il existe un concept produit par une etape apres self
+ # => impossible d'inserer
+ raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
+ "%s existe deja dans le jeu de commandes." % nom_sd)
+
+ return context
+
+ def get_liste_cmd(self):
+ """
+ Retourne la liste des commandes du catalogue
+ """
+ if self.jdc_pere is None:
+ return JDC.get_liste_cmd(self)
+ return self.jdc_pere.get_liste_cmd()
+
+ def get_groups(self):
+ """
+ Retourne la liste des commandes du catalogue par groupes
+ """
+ if self.jdc_pere is None:
+ return JDC.get_groups(self)
+ return self.jdc_pere.get_groups()
+
+ def init_modif(self):
+ """
+ Met l'etat de l'etape a : modifie
+ Propage la modification au parent
+
+ Attention : init_modif doit etre appele avant de realiser une modification
+ La validite devra etre recalculee apres cette modification
+ mais par un appel a fin_modif pour preserver l'etat modified
+ de tous les objets entre temps
+ """
+ #print "jdc_include.init_modif",self,self.etape_include
+ self.state = 'modified'
+ if self.etape_include:
+ self.etape_include.init_modif()
+
+ def fin_modif(self):
+ """
+ Methode appelee une fois qu'une modification a ete faite afin de
+ declencher d'eventuels traitements post-modification
+ ex : INCLUDE et POURSUITE
+ """
+ #print "jdc_include.fin_modif",self,self.etape_include
+ CONNECTOR.Emit(self,"valid")
+ if self.etape_include:
+ self.etape_include.fin_modif()
+
+ def supprime(self):
+ """
+ On ne supprime rien directement pour un jdc auxiliaire d'include ou de poursuite
+ Utiliser supprime_aux
+ """
+ pass
+
+ def supprime_aux(self):
+ #print "supprime_aux",self
+ JDC.supprime(self)
+ self.jdc_pere=None
+ self.etape_include=None
+ # self.cata_ordonne_dico={}
+ self.appli=None
+ # self.context_ini={}
+ # self.procedure=None
+
+ def get_contexte_avant(self,etape):
+ """
+ Retourne le dictionnaire des concepts connus avant etape
+ On tient compte des concepts produits par le jdc pere
+ en reactualisant le contexte initial context_ini
+ On tient compte des commandes qui modifient le contexte
+ comme DETRUIRE ou les macros
+ Si etape == None, on retourne le contexte en fin de JDC
+ """
+ #print "jdc_include.get_contexte_avant",etape,etape and etape.nom
+ if self.etape_include:
+ new_context=self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
+ self.context_ini=new_context
+ d= JDC.get_contexte_avant(self,etape)
+ return d
+
+ def reset_context(self):
+ #print "jdc_include.reset_context",self,self.nom
+ if self.etape_include:
+ self.etape_include.parent.reset_context()
+ new_context=self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
+ self.context_ini=new_context
+ JDC.reset_context(self)
+
+ def get_sd_apres_etape(self,nom_sd,etape,avec='non'):
+ """
+ Cette methode retourne la SD de nom nom_sd qui est eventuellement
+ definie apres etape
+ Si avec vaut 'non' exclut etape de la recherche
+ """
+ if self.etape_include:
+ sd=self.etape_include.parent.get_sd_apres_etape(nom_sd,self.etape_include,'non')
+ if sd:return sd
+ return JDC.get_sd_apres_etape(self,nom_sd,etape,avec)
+
+ def get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec='non'):
+ """
+ On veut savoir ce que devient le concept sd de nom nom_sd apres etape.
+ Il peut etre detruit, remplace ou conserve
+ Cette methode retourne la SD sd de nom nom_sd qui est eventuellement
+ definie apres etape en tenant compte des concepts detruits
+ Si avec vaut 'non' exclut etape de la recherche
+ """
+ #print "jdc_include.get_sd_apres_etape_avec_detruire",nom_sd,sd,id(sd)
+ autre_sd=JDC.get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec)
+ # si autre_sd vaut None le concept sd a ete detruit. On peut terminer
+ # la recherche en retournant None
+ # Si autre_sd ne vaut pas sd, le concept a ete redefini. On peut terminer
+ # la recherche en retournant le concept nouvellement defini
+ # Sinon, on poursuit la recherche dans les etapes du niveau superieur.
+ if autre_sd is None or autre_sd is not sd :return autre_sd
+ return self.etape_include.parent.get_sd_apres_etape_avec_detruire(nom_sd,sd,self.etape_include,'non')
+
+ def delete_concept(self,sd):
+ """
+ Fonction : Mettre a jour les etapes du JDC suite a la disparition du
+ concept sd
+ Seuls les mots cles simples MCSIMP font un traitement autre
+ que de transmettre aux fils
+ """
+ # Nettoyage des etapes de l'include
+ JDC.delete_concept(self,sd)
+ # Nettoyage des etapes du parent
+ if self.etape_include:
+ self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
+
+ def delete_concept_after_etape(self,etape,sd):
+ """
+ Fonction : Mettre a jour les etapes du JDC qui sont apres etape suite a
+ la disparition du concept sd
+ """
+ # Nettoyage des etapes de l'include
+ JDC.delete_concept_after_etape(self,etape,sd)
+ # Nettoyage des etapes du parent
+ if self.etape_include:
+ self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
+
+ def update_concept_after_etape(self,etape,sd):
+ """
+ Fonction : mettre a jour les etapes du JDC suite a une modification
+ du concept sd (principalement renommage)
+ """
+ JDC.update_concept_after_etape(self,etape,sd)
+ if self.etape_include:
+ self.etape_include.parent.update_concept_after_etape(self.etape_include,sd)
+
+ def replace_concept_after_etape(self,etape,old_sd,sd):
+ """
+ Fonction : Mettre a jour les etapes du JDC qui sont apres etape suite au
+ remplacement du concept old_sd par sd
+ """
+ # Nettoyage des etapes de l'include
+ JDC.replace_concept_after_etape(self,etape,old_sd,sd)
+ # Nettoyage des etapes du parent
+ if self.etape_include:
+ self.etape_include.parent.replace_concept_after_etape(self.etape_include,old_sd,sd)
+
+ def changefichier(self,fichier):
+ if self.etape_include:
+ self.etape_include.fichier_ini=fichier
+ self.fin_modif()
+
+ def control_context_apres(self,etape):
+ """
+ Cette methode verifie que les etapes apres l'etape etape
+ ont bien des concepts produits acceptables (pas de conflit de
+ nom principalement)
+ Si des concepts produits ne sont pas acceptables ils sont supprimes.
+ Effectue les verifications sur les etapes du jdc mais aussi sur les
+ jdc parents s'ils existent.
+ """
+ #print "jdc_include.control_context_apres",self,etape
+ #Regularise les etapes du jdc apres l'etape etape
+ self.control_jdc_context_apres(etape)
+ if self.etape_include:
+ #print "CONTROL_INCLUDE:",self.etape_include,self.etape_include.nom
+ # il existe un jdc pere. On propage la regularisation
+ self.etape_include.parent.control_context_apres(self.etape_include)
+