/usr/share/pyshared/Ihm/I_MCCOMPO.py is in eficas 6.4.0-1-1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 | # -*- coding: utf-8 -*-
# CONFIGURATION MANAGEMENT OF EDF VERSION
# ======================================================================
# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
# (AT YOUR OPTION) ANY LATER VERSION.
#
# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
#
# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
#
#
# ======================================================================
"""
"""
import string,types,sys
from copy import copy
import traceback
from Noyau.N_MCLIST import MCList
from Noyau.N_MCSIMP import MCSIMP
from Noyau.N_MCFACT import MCFACT
from Noyau.N_MCBLOC import MCBLOC
import I_OBJECT
import Validation
import CONNECTOR
class MCCOMPO(I_OBJECT.OBJECT):
def getlabeltext(self):
"""
Retourne le label de self
utilisé pour l'affichage dans l'arbre
"""
return self.nom
def get_liste_mc_ordonnee(self,liste,dico):
"""
Retourne la liste ordonnée (suivant le catalogue) des mots-clés
d'une entité composée dont le chemin complet est donné sous forme
d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
il faut encore réarranger cette liste (certains mots-clés déjà
présents ne doivent plus être proposés, règles ...)
"""
return self.filtre_liste_mc(self.get_liste_mc_ordonnee_brute(liste,dico))
def get_liste_mc_ordonnee_brute(self,liste,dico):
"""
Retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
d'une entité composée dont le chemin complet est donné sous forme
d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
"""
for arg in liste:
objet_cata = dico[arg]
dico=objet_cata.entites
l=[]
specifique=0
for obj in dico.keys() :
if not(hasattr(dico[obj],'cache')) or dico[obj].cache==0 :
l.append(obj)
else :
specifique=1
if specifique == 1 : return l
return objet_cata.ordre_mc
def filtre_liste_mc(self,liste_brute):
"""
Cette méthode est appelée par EFICAS afin de présenter à
l'utilisateur la liste des enfants possibles de self actualisée
en fonction du contexte de self. En clair, sont supprimés de la
liste des possibles (fournie par la définition), les mots-clés
exclus par les règles de self et les mots-clés ne pouvant plus
être répétés
"""
liste = copy(liste_brute)
liste_mc_presents = self.liste_mc_presents()
# on enlève les mots-clés non permis par les règles
for regle in self.definition.regles:
# la méthode purge_liste est à développer pour chaque règle qui
# influe sur la liste de choix à proposer à l'utilisateur
# --> EXCLUS,UN_PARMI,PRESENT_ABSENT
liste = regle.purge_liste(liste,liste_mc_presents)
# on enlève les mots-clés dont l'occurrence est déjà atteinte
liste_copy = copy(liste)
for k in liste_copy:
objet = self.get_child(k,restreint = 'oui')
if objet != None :
# l'objet est déjà présent : il faut distinguer plusieurs cas
if isinstance(objet,MCSIMP):
# un mot-clé simple ne peut pas être répété
liste.remove(k)
elif isinstance(objet,MCBLOC):
# un bloc conditionnel ne doit pas apparaître dans la liste de choix
liste.remove(k)
elif isinstance(objet,MCFACT):
# un mot-clé facteur ne peut pas être répété plus de self.max fois
if objet.definition.max == 1:
liste.remove(k)
elif isinstance(objet,MCList):
try :
nb_occur_maxi = objet[0].definition.max
if len(objet) >= nb_occur_maxi:
liste.remove(k)
except:
pass
else :
#XXX CCAR : les MCNUPLET ne sont pas traités
if CONTEXT.debug : print ' ',k,' est un objet de type inconnu :',type(objet)
else :
# l'objet est absent : on enlève de la liste les blocs
if self.definition.entites[k].statut=='c' :
liste.remove(k)
if self.definition.entites[k].label=='BLOC':
liste.remove(k)
# Pour corriger les exces qui pourraient etre commis dans la methode purge_liste
# des regles, on essaie de compenser comme suit :
# on ajoute les mots cles facteurs presents dont l'occurence n'est pas atteinte
for k in liste_mc_presents:
if k in liste:continue
objet = self.get_child(k,restreint = 'oui')
if isinstance(objet,MCFACT):
# un mot-clé facteur ne peut pas être répété plus de self.max fois
if objet.definition.max > 1:
liste.append(k)
elif isinstance(objet,MCList):
nb_occur_maxi = objet[0].definition.max
if len(objet) < nb_occur_maxi:
liste.append(k)
return liste
def liste_mc_presents(self):
"""
Retourne la liste des noms des mots-clés fils de self présents construite
à partir de self.mc_liste
"""
l=[]
for v in self.mc_liste:
k=v.nom
l.append(k)
return l
def get_index_child(self,nom_fils):
"""
Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
Permet de savoir à quelle position il faut ajouter un nouveau mot-clé
"""
cata_ordonne = self.jdc.cata_ordonne_dico
liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),cata_ordonne)
liste_noms_mc_presents = self.liste_mc_presents()
index=0
for nom in liste_noms_mc_ordonnee:
if nom == nom_fils:break
if nom not in liste_noms_mc_presents :continue
index=index+1
return index
def ordonne_liste_mc(self,liste_mc_a_ordonner,liste_noms_mc_ordonnee):
"""
Retourne liste_mc_a_ordonner ordonnée suivant l'ordre
donné par liste_noms_mc_ordonnee
"""
liste = []
# on transforme liste_a_ordonner en un dictionnaire (plus facile à consulter)
d_mc = {}
for mc in liste_mc_a_ordonner:
d_mc[mc.nom]=mc
# on construit la liste des objets ordonnés
for nom_mc in liste_noms_mc_ordonnee:
if d_mc.has_key(nom_mc):
liste.append(d_mc.get(nom_mc))
# on la retourne
return liste
def suppentite(self,objet) :
"""
Supprime le fils 'objet' de self :
Retourne 1 si la suppression a pu être effectuée,
Retourne 0 dans le cas contraire
"""
if not objet in self.mc_liste:
# Impossible de supprimer objet. Il n'est pas dans mc_liste
return 0
self.init_modif()
self.mc_liste.remove(objet)
CONNECTOR.Emit(self,"supp",objet)
objet.delete_mc_global()
objet.update_condition_bloc()
objet.supprime()
self.etape.modified()
self.fin_modif()
return 1
def isoblig(self):
return 0
def addentite(self,name,pos=None):
"""
Ajoute le mot-cle name à la liste des mots-cles de
l'objet MCCOMPOSE
"""
self.init_modif()
if type(name)==types.StringType :
# on est en mode création d'un motcle
if self.ispermis(name) == 0 : return 0
objet=self.definition.entites[name](val=None,nom=name,parent=self)
else :
# dans ce cas on est en mode copie d'un motcle
objet = name
# Appel de la methode qui fait le menage dans les references
# sur les concepts produits (verification que les concepts existent
# dans le contexte de la commande courante).
objet.verif_existence_sd()
# On verifie que l'ajout d'objet est autorise
if self.ispermis(objet) == 0:
self.jdc.appli.affiche_alerte("Erreur","L'objet %s ne peut être un fils de %s" %(objet.nom,
self.nom))
self.fin_modif()
return 0
# On cherche s'il existe deja un mot cle de meme nom
old_obj = self.get_child(objet.nom,restreint = 'oui')
if not old_obj :
# on normalize l'objet
objet=objet.normalize()
# Le mot cle n'existe pas encore. On l'ajoute a la position
# demandee (pos)
if pos == None :
self.mc_liste.append(objet)
else :
self.mc_liste.insert(pos,objet)
# Il ne faut pas oublier de reaffecter le parent d'obj (si copie)
objet.reparent(self)
CONNECTOR.Emit(self,"add",objet)
objet.update_mc_global()
objet.update_condition_bloc()
self.fin_modif()
return objet
else:
# Le mot cle existe deja. Si le mot cle est repetable,
# on cree une liste d'objets. Dans le cas contraire,
# on emet un message d'erreur.
if not old_obj.isrepetable():
self.jdc.appli.affiche_alerte("Erreur","L'objet %s ne peut pas être répété" %objet.nom)
self.fin_modif()
return 0
else:
# une liste d'objets de même type existe déjà
old_obj.addentite(objet)
self.fin_modif()
return old_obj
def ispermis(self,fils):
"""
Retourne 1 si l'objet de nom nom_fils
est bien permis, cad peut bien être un fils de self,
Retourne 0 sinon
"""
if type(fils) == types.StringType :
# on veut juste savoir si self peut avoir un fils de nom 'fils'
if self.definition.entites.has_key(fils):
return 1
else :
return 0
elif type(fils) == types.InstanceType:
# fils est un objet (commande,mcf,mclist)
# on est dans le cas d'une tentative de copie de l'objet
# on veut savoir si l'objet peut bien être un fils de self :
# la vérification du nom de suffit pas (plusieurs commandes
# ont le même mot-clé facteur AFFE ... et c'est l'utilisateur
# qui choisit le père d'où un risque d'erreur)
if not self.definition.entites.has_key(fils.nom):
return 0
else:
if fils.parent.nom != self.nom : return 0
return 1
def update_concept(self,sd):
for child in self.mc_liste :
child.update_concept(sd)
def delete_concept(self,sd):
"""
Inputs :
- sd=concept detruit
Fonction :
Mettre a jour les fils de l objet suite à la disparition du
concept sd
Seuls les mots cles simples MCSIMP font un traitement autre que
de transmettre aux fils
"""
for child in self.mc_liste :
child.delete_concept(sd)
def replace_concept(self,old_sd,sd):
"""
Inputs :
- old_sd=concept remplace
- sd = nouveau concept
Fonction :
Mettre a jour les fils de l objet suite au remplacement du
concept old_sd
"""
for child in self.mc_liste :
child.replace_concept(old_sd,sd)
def get_liste_mc_inconnus(self):
"""
Retourne la liste des mots-clés inconnus dans self
"""
l_mc = []
if self.reste_val != {}:
for k,v in self.reste_val.items() :
l_mc.append([self,k,v])
for child in self.mc_liste :
if child.isvalid() : continue
l_child = child.get_liste_mc_inconnus()
for mc in l_child:
l = [self]
l.extend(mc)
l_mc.append(l)
return l_mc
def deep_update_condition_bloc(self):
"""
Parcourt l'arborescence des mcobject et realise l'update
des blocs conditionnels par appel de la methode update_condition_bloc
"""
self._update_condition_bloc()
for mcobj in self.mc_liste:
if hasattr(mcobj,"deep_update_condition_bloc"):
mcobj.deep_update_condition_bloc()
def update_condition_bloc(self):
"""
Realise l'update des blocs conditionnels fils de self
et propage au parent
"""
self._update_condition_bloc()
if self.parent:self.parent.update_condition_bloc()
def _update_condition_bloc(self):
"""
Realise l'update des blocs conditionnels fils de self
"""
dict = self.cree_dict_condition(self.mc_liste,condition=1)
for k,v in self.definition.entites.items():
if v.label != 'BLOC' :continue
globs= self.jdc and self.jdc.condition_context or {}
bloc=self.get_child(k,restreint = 'oui')
presence=v.verif_presence(dict,globs)
if presence and not bloc:
# le bloc doit être présent
# mais le bloc n'est pas présent et il doit être créé
#print "AJOUT BLOC",k
pos=self.get_index_child(k)
self.addentite(k,pos)
if not presence and bloc:
# le bloc devrait être absent
# le bloc est présent : il faut l'enlever
#print "SUPPRESSION BLOC",k,bloc
self.suppentite(bloc)
def verif_condition_bloc(self):
"""
Evalue les conditions de tous les blocs fils possibles
(en fonction du catalogue donc de la définition) de self
et retourne deux listes :
- la première contient les noms des blocs à rajouter
- la seconde contient les noms des blocs à supprimer
"""
liste_ajouts = []
liste_retraits = []
dict = self.cree_dict_condition(self.mc_liste,condition=1)
for k,v in self.definition.entites.items():
if v.label=='BLOC' :
globs= self.jdc and self.jdc.condition_context or {}
if v.verif_presence(dict,globs):
# le bloc doit être présent
if not self.get_child(k,restreint = 'oui'):
# le bloc n'est pas présent et il doit être créé
liste_ajouts.append(k)
else :
# le bloc doit être absent
if self.get_child(k,restreint = 'oui'):
# le bloc est présent : il faut l'enlever
liste_retraits.append(k)
return liste_ajouts,liste_retraits
def verif_existence_sd(self):
"""
Vérifie que les structures de données utilisées dans self existent bien dans le contexte
avant étape, sinon enlève la référence à ces concepts
"""
for motcle in self.mc_liste :
motcle.verif_existence_sd()
def update_mc_global(self):
"""
Met a jour les mots cles globaux enregistrés dans l'étape parente
et dans le jdc parent.
Un mot cle compose ne peut pas etre global. Il se contente de passer
la requete a ses fils.
"""
for motcle in self.mc_liste :
motcle.update_mc_global()
def delete_mc_global(self):
for motcle in self.mc_liste :
motcle.delete_mc_global()
try :
motcle.update_mc_global()
except :
pass
def init_modif_up(self):
Validation.V_MCCOMPO.MCCOMPO.init_modif_up(self)
CONNECTOR.Emit(self,"valid")
|