6 from Noyau.N_MCLIST import MCList
7 from Noyau.N_MCSIMP import MCSIMP
8 from Noyau.N_MCFACT import MCFACT
9 from Noyau.N_MCBLOC import MCBLOC
12 class MCCOMPO(I_OBJECT.OBJECT):
13 def getlabeltext(self):
15 Retourne le label de self suivant qu'il s'agit d'un MCFACT,
16 d'un MCBLOC ou d'un MCFACT appartenant à une MCList :
17 utilisée pour l'affichage dans l'arbre
19 objet = self.parent.get_child(self.nom)
20 # objet peut-être self ou une MCList qui contient self ...
21 if isinstance(objet,MCList) :
22 index = objet.get_index(self)+1 # + 1 à cause de la numérotation qui commence à 0
23 label = self.nom +'_'+`index`+':'
28 def get_genealogie(self):
30 Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC
31 ou ETAPE) de self jusqu'au premier objet etape rencontré
35 while objet.definition.label != 'JDC' :
36 if not objet.isMCList() :
37 l.append(string.strip(objet.nom))
40 # Si objet.etape == etape c'est que objet est l'étape origine de la généalogie
41 if objet.etape == objet: break
46 def get_liste_mc_ordonnee(self,liste,dico):
48 Retourne la liste ordonnée (suivant le catalogue) des mots-clés
49 d'une entité composée dont le chemin complet est donné sous forme
50 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
51 il faut encore réarranger cette liste (certains mots-clés déjà
52 présents ne doivent plus être proposés, règles ...)
54 return self.filtre_liste_mc(self.get_liste_mc_ordonnee_brute(liste,dico))
56 def get_liste_mc_ordonnee_brute(self,liste,dico):
58 Retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
59 d'une entité composée dont le chemin complet est donné sous forme
60 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
63 objet_cata = dico[arg]
65 return objet_cata.liste
67 def filtre_liste_mc(self,liste_brute):
69 Cette méthode est appelée par EFICAS afin de présenter à
70 l'utilisateur la liste des enfants possibles de self actualisée
71 en fonction du contexte de self. En clair, sont supprimés de la
72 liste des possibles (fournie par la définition), les mots-clés
73 exclus par les règles de self et les mots-clés ne pouvant plus
76 liste = copy(liste_brute)
77 liste_mc_presents = self.liste_mc_presents()
78 # on enlève les mots-clés non permis par les règles
79 for regle in self.definition.regles:
80 # la méthode purge_liste est à développer pour chaque règle qui
81 # influe sur la liste de choix à proposer à l'utilisateur
82 # --> EXCLUS,UN_PARMI,PRESENT_ABSENT
83 liste = regle.purge_liste(liste,liste_mc_presents)
84 # on enlève les mots-clés dont l'occurrence est déjà atteinte
85 liste_copy = copy(liste)
87 objet = self.get_child(k,restreint = 'oui')
89 # l'objet est déjà présent : il faut distinguer plusieurs cas
90 if isinstance(objet,MCSIMP):
91 # un mot-clé simple ne peut pas être répété
93 elif isinstance(objet,MCBLOC):
94 # un bloc conditionnel ne doit pas apparaître dans la liste de choix
96 elif isinstance(objet,MCFACT):
97 # un mot-clé facteur ne peut pas être répété plus de self.max fois
98 if objet.definition.max == 1:
100 elif isinstance(objet,MCList):
102 nb_occur_maxi = objet[0].definition.max
103 if len(objet) >= nb_occur_maxi:
108 #XXX CCAR : les MCNUPLET ne sont pas traités
109 if CONTEXT.debug : print ' ',k,' est un objet de type inconnu :',type(objet)
111 # l'objet est absent : on enlève de la liste les blocs
112 if self.definition.entites[k].statut=='c' :
114 if self.definition.entites[k].label=='BLOC':
118 def liste_mc_presents(self):
120 Retourne la liste des noms des mots-clés fils de self présents construite
121 à partir de self.mc_liste
124 for v in self.mc_liste:
129 def ordonne_liste_mc(self,liste_mc_a_ordonner,liste_noms_mc_ordonnee):
131 Retourne liste_mc_a_ordonner ordonnée suivant l'ordre
132 donné par liste_noms_mc_ordonnee
135 # on transforme liste_a_ordonner en un dictionnaire (plus facile à consulter)
137 for mc in liste_mc_a_ordonner:
139 # on construit la liste des objets ordonnés
140 for nom_mc in liste_noms_mc_ordonnee:
141 if d_mc.has_key(nom_mc):
142 liste.append(d_mc.get(nom_mc))
146 def suppentite(self,objet) :
148 Supprime le fils 'objet' de self :
149 Retourne 1 si la suppression a pu être effectuée,
150 Retourne 0 dans le cas contraire
153 if not objet in self.mc_liste:
154 # Impossible de supprimer objet. Il n'est pas dans mc_liste
159 if hasattr(objet.definition,'position'):
160 if objet.definition.position == 'global' :
161 self.delete_mc_global(objet)
162 elif objet.definition.position == 'global_jdc' :
163 self.delete_mc_global_jdc(objet)
164 self.mc_liste.remove(objet)
172 return self.definition.statut=='o'
174 def addentite(self,name,pos=None):
176 Ajoute le mot-cle name à la liste des mots-cles de
180 if type(name)==types.StringType :
181 if self.ispermis(name) == 0 : return 0
182 objet=self.definition.entites[name](val=None,nom=name,parent=self)
183 if hasattr(objet.definition,'position'):
184 if objet.definition.position == 'global' :
185 self.append_mc_global(objet)
186 elif objet.definition.position == 'global_jdc' :
187 self.append_mc_global_jdc(objet)
190 # si un objet de même nom est déjà présent dans la liste
191 # et si l'objet est répétable
192 # il faut créer une MCList et remplacer l'objet de la liste
194 test1 = objet.isrepetable()
195 old_obj = self.get_child(objet.nom,restreint = 'oui')
196 test2 = self.ispermis(objet)
197 #print "test1,test2=",test1,test2
198 if test1 == 0 and old_obj :
199 self.jdc.send_message("L'objet %s ne peut pas être répété" %objet.nom)
203 self.jdc.send_message("L'objet %s ne peut être un fils de %s" %(objet.nom,self.nom))
208 #if not isinstance(old_obj,MCList):
209 if not old_obj.isMCList():
210 # un objet de même nom existe déjà mais ce n'est pas une MCList
211 # Il faut en créer une
212 # L'objet existant (old_obj) est certainement un MCFACT
213 # qui pointe vers un constructeur
214 # de MCList : definition.liste_instance
215 #print "un objet de même type existe déjà"
216 index = self.mc_liste.index(old_obj)
217 #XXX remplacé par definition.list_instance : new_obj = MCList()
218 new_obj = old_obj.definition.list_instance()
219 new_obj.init(objet.nom,self)
220 new_obj.append(old_obj)
221 new_obj.append(objet)
222 self.mc_liste.remove(old_obj)
223 self.mc_liste.insert(index,new_obj)
227 # une liste d'objets de même type existe déjà
228 #print "une liste d'objets de même type existe déjà"
229 old_obj.append(objet)
233 self.mc_liste.append(objet)
235 self.mc_liste.insert(pos,objet)
239 def ispermis(self,fils):
241 Retourne 1 si l'objet de nom nom_fils
242 est bien permis, cad peut bien être un fils de self,
245 if type(fils) == types.StringType :
246 # on veut juste savoir si self peut avoir un fils de nom 'fils'
247 if self.definition.entites.has_key(fils):
251 elif type(fils) == types.InstanceType:
252 # fils est un objet (commande,mcf,mclist)
253 # on est dans le cas d'une tentative de copie de l'objet
254 # on veut savoir si l'objet peut bien être un fils de self :
255 # la vérification du nom de suffit pas (plusieurs commandes
256 # ont le même mot-clé facteur AFFE ... et c'est l'utilisateur
257 # qui choisit le père d'où un risque d'erreur)
258 if not self.definition.entites.has_key(fils.nom):
261 if fils.parent.nom != self.nom : return 0
264 def liste_mc_presents(self):
266 Retourne la liste des noms des mots-clés fils de self présents
267 construite à partir de self.mc_liste
270 for v in self.mc_liste:
275 def delete_concept(self,sd):
280 Mettre a jour les fils de l objet suite à la disparition du
282 Seuls les mots cles simples MCSIMP font un traitement autre que
283 de transmettre aux fils
285 for child in self.mc_liste :
286 child.delete_concept(sd)
288 def delete_mc_global(self,mc):
290 Supprime le mot-clé mc de la liste des mots-clés globaux de l'étape
292 etape = self.get_etape()
295 del etape.mc_globaux[nom]
297 def delete_mc_global_jdc(self,mc):
299 Supprime le mot-clé mc de la liste des mots-clés globaux du jdc
302 del self.jdc.mc_globaux[nom]
305 """ Retourne une copie de self """
306 objet = self.makeobjet()
307 objet.valeur = copy(self.valeur)
308 objet.val = copy(self.val)
310 for obj in self.mc_liste:
312 objet.mc_liste.append(new_obj)
315 def get_sd_utilisees(self):
317 Retourne la liste des concepts qui sont utilisés à l'intérieur de self
318 ( comme valorisation d'un MCS)
321 for child in self.mc_liste:
322 l.extend(child.get_sd_utilisees())
325 def get_liste_mc_inconnus(self):
327 Retourne la liste des mots-clés inconnus dans self
330 if self.reste_val != {}:
331 for k,v in self.reste_val.items() :
332 l_mc.append([self,k,v])
333 for child in self.mc_liste :
334 if child.isvalid() : continue
335 l_child = child.get_liste_mc_inconnus()
342 def verif_condition_bloc(self):
344 Evalue les conditions de tous les blocs fils possibles
345 (en fonction du catalogue donc de la définition) de self
346 et retourne deux listes :
347 - la première contient les noms des blocs à rajouter
348 - la seconde contient les noms des blocs à supprimer
352 dict = self.cree_dict_valeurs(self.mc_liste)
353 for k,v in self.definition.entites.items():
354 #dict = self.cree_dict_valeurs(self.mc_liste)
356 if v.verif_presence(dict) :
357 # le bloc doit être présent
358 if not self.get_child(k,restreint = 'oui'):
359 # le bloc n'est pas présent et il doit être créé
360 liste_ajouts.append(k)
362 # le bloc doit être absent
363 if self.get_child(k,restreint = 'oui'):
364 # le bloc est présent : il faut l'enlever
365 liste_retraits.append(k)
366 return liste_ajouts,liste_retraits