Salome HOME
CCAR: modification edition INCLUDE
[tools/eficas.git] / Extensions / jdc_include.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21
22 """
23    Ce module contient la classe JDC_INCLUDE qui sert a inclure
24    dans un jeu de commandes une partie de jeu de commandes
25    au moyen de la fonctionnalite INCLUDE ou INCLUDE_MATERIAU
26    Quand l'utilisateur veut inclure un fichier il faut versifier
27    que le jeu de commandes inclus est valide et compatible
28    avec le contexte avant et apres l'insertion
29 """
30 from Accas import JDC,ASSD,AsException,JDC_CATA
31
32 class NOTIFIER:
33    def __init__(self):
34       self.subscribers=[]
35
36    def subscribe(self,obj):
37       if not obj in self.subscribers:
38          self.subscribers.append(obj)
39
40    def notify(self):
41       for obj in self.subscribers:
42          obj.notify(self)
43
44 class JDC_POURSUITE(JDC,NOTIFIER):
45    def __init__(self,definition=None,procedure=None,cata=None,
46                      cata_ord_dico=None,parent=None,
47                      nom='SansNom',appli=None,context_ini=None,
48                      jdc_pere=None,etape_include=None,prefix_include=None,
49                      recorded_units=None,old_recorded_units=None,**args):
50
51       NOTIFIER.__init__(self)
52       JDC.__init__(self, definition=definition,
53                          procedure=procedure,
54                          cata=cata,
55                          cata_ord_dico=cata_ord_dico,
56                          parent=parent,
57                          nom=nom,
58                          appli=appli,
59                          context_ini=context_ini,
60                          **args
61                          )
62       self.jdc_pere=jdc_pere
63       self.etape_include=etape_include
64       self.prefix_include=prefix_include
65       if recorded_units is not None:self.recorded_units=recorded_units
66       if old_recorded_units is not None:self.old_recorded_units=old_recorded_units
67
68    def NommerSdprod(self,sd,sdnom,restrict='non'):
69       """
70           Nomme la SD apres avoir verifie que le nommage est possible : nom
71           non utilise
72           Ajoute un prefixe s'il est specifie (INCLUDE_MATERIAU)
73           Si le nom est deja utilise, leve une exception
74           Met le concept créé dans le contexe global g_context
75       """
76       if self.prefix_include:
77           if sdnom != self.prefix_include:sdnom=self.prefix_include+sdnom
78       o=self.sds_dict.get(sdnom,None)
79       if isinstance(o,ASSD):
80          raise AsException("Nom de concept deja defini : %s" % sdnom)
81
82       # On pourrait verifier que le jdc_pere apres l'etape etape_include
83       # ne contient pas deja un concept de ce nom
84       #if self.jdc_pere.get_sd_apres_etape_avec_detruire(sdnom,etape=self.etape_include):
85          # Il existe un concept apres self => impossible d'inserer
86       #   raise AsException("Nom de concept deja defini : %s" % sdnom)
87       # On a choisi de ne pas faire ce test ici mais de le faire en bloc
88       # si necessaire apres en appelant la methode verif_contexte
89
90       # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja.
91       # Ajoute a la creation (appel de reg_sd).
92       self.sds_dict[sdnom]=sd
93       sd.nom=sdnom
94
95       # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
96       if restrict == 'non':
97          self.g_context[sdnom]=sd
98
99    def get_verif_contexte(self):
100       j_context=self.get_contexte_avant(None)
101       self.verif_contexte(j_context)
102       return j_context
103
104    def verif_contexte(self,context):
105       """
106          Cette methode verifie si le contexte passé en argument (context)
107          peut etre inséré dans le jdc pere de l'include.
108          Elle verifie que les concepts contenus dans ce contexte n'entrent
109          pas en conflit avec les concepts produits dans le jdc pere
110          apres l'include.
111          Si le contexte ne peut pas etre inséré, la méthode leve une
112          exception sinon elle retourne le contexte inchangé
113       """
114       for nom_sd,sd in context.items():
115         if not isinstance(sd,ASSD):continue
116         if self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
117                                                        etape=self.etape_include):
118            # Il existe un concept produit par une etape apres self 
119            # => impossible d'inserer
120            raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
121                            "%s existe déjà dans le jeu de commandes." % nom_sd)
122
123       return context
124
125    def get_liste_cmd(self):
126       """
127           Retourne la liste des commandes du catalogue
128       """
129       return self.jdc_pere.get_liste_cmd()
130
131    def get_groups(self):
132       """
133           Retourne la liste des commandes du catalogue par groupes
134       """
135       return self.jdc_pere.get_groups()
136
137    def init_modif(self):
138       """
139          Met l'état de l'étape à : modifié
140          Propage la modification au parent
141
142          Attention : init_modif doit etre appelé avant de réaliser une modification
143          La validité devra etre recalculée apres cette modification
144          mais par un appel à fin_modif pour préserver l'état modified
145          de tous les objets entre temps
146       """
147       print "init_modif",self,self.etape_include
148       self.state = 'modified'
149       self.etape_include.init_modif()
150
151    def fin_modif(self):
152       """
153           Méthode appelée une fois qu'une modification a été faite afin de
154           déclencher d'éventuels traitements post-modification
155           ex : INCLUDE et POURSUITE
156       """
157       print "fin_modif",self,self.etape_include
158       self.etape_include.fin_modif()
159       self.notify()
160
161    def supprime(self):
162       """
163           On ne supprime rien pour un jdc auxiliaire d'include ou de poursuite
164       """
165       pass
166
167
168 class JDC_INCLUDE(JDC_POURSUITE):
169    def active_etapes(self):
170       for e in self.etapes:
171          e.active()
172
173 class JDC_CATA_INCLUDE(JDC_CATA):
174    class_instance=JDC_INCLUDE
175
176 class JDC_CATA_POURSUITE(JDC_CATA):
177    class_instance=JDC_POURSUITE
178
179 from Accas import AU_MOINS_UN,A_CLASSER
180
181 JdC_include=JDC_CATA_INCLUDE(code='ASTER', execmodul=None)
182
183 JdC_poursuite=JDC_CATA_POURSUITE(code='ASTER', execmodul=None,
184                                  regles = (AU_MOINS_UN('DEBUT','POURSUITE'),
185                                            AU_MOINS_UN('FIN'),
186                                            A_CLASSER(('DEBUT','POURSUITE'),'FIN')
187                                           )
188                                )
189
190