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.
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.
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.
20 # ======================================================================
22 Ce module sert a lire un catalogue et a construire
23 un objet CataItem pour Eficas.
24 Il s'appuie sur la classe READERCATA
28 import os,sys,py_compile
35 from Noyau.N_CR import CR
36 from Editeur.utils import init_rep_cata_dev
38 from Editeur import analyse_catalogue
39 from Editeur import autre_analyse_cata
40 from Editeur import uiinfo
41 from monChoixCata import MonChoixCata
49 def __init__(self,appli,parent):
52 self.code=self.appli.code
53 self.appli.format_fichier='python'
54 self.appli.appliEficas.format_fichier='python'
55 self.version_code=self.appli.version_code
56 self.version_cata=None
63 Ouvre le catalogue standard du code courant, cad le catalogue présent
64 dans le répertoire Cata
66 message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
67 self.configure_barre(4)
69 liste_cata_possibles=[]
70 for catalogue in self.appli.CONFIGURATION.catalogues:
71 if catalogue[0] == self.code :
72 liste_cata_possibles.append(catalogue)
74 if len(liste_cata_possibles)==0:
75 QMessageBox.critical( self.parent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
76 self.appli.parent.ui.close()
79 if self.version_code is not None:
80 # La version a ete fixee
81 for cata in liste_cata_possibles:
82 if self.version_code == cata[1]:
83 self.fic_cata = cata[2]
84 self.appli.format_fichier=cata[3]
85 self.appli.appliEficas.format_fichier=cata[3]
86 elif len(liste_cata_possibles)==1:
87 self.fic_cata = liste_cata_possibles[0][2]
88 self.version_code = liste_cata_possibles[0][1]
89 self.appli.format_fichier=liste_cata_possibles[0][3]
90 self.appli.appliEficas.format_fichier=liste_cata_possibles[0][3]
91 lab=QString("Eficas V1.")
93 lab+=QString(" pour ")
94 lab+=QString(self.code)
95 lab+=QString(" avec le catalogue ")
96 lab+=self.version_code
98 # souci pour les includes
99 self.appli.parent.ui.setCaption(lab)
102 #qApp.mainWidget().setCaption(lab)
104 # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
105 # lequel il veut utiliser ...
106 self.ask_choix_catalogue()
108 if self.fic_cata == None :
109 print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
112 self.determineMater()
115 # détermination de fic_cata_c et fic_cata_p
116 self.fic_cata_c = self.fic_cata + 'c'
117 self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
119 # import du catalogue
120 self.cata = self.import_cata(self.fic_cata)
123 QMessageBox.critical( self.parent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
124 self.appli.parent.ui.close()
127 # analyse du catalogue (ordre des mots-clés)
129 # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
130 # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
131 # des mots clés a la création
132 self.Retrouve_Ordre_Cata_Standard_autre()
136 # analyse des données liées a l'IHM : UIinfo
138 uiinfo.traite_UIinfo(self.cata)
142 # traitement des clefs documentaires
144 self.traite_clefs_documentaires()
146 # chargement et analyse des catalogues développeur (le cas échéant)
148 if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
149 init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
150 fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
151 if os.path.isfile(fic_cata_dev):
152 # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
153 test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
155 showinfo("Compilation catalogue développeur",
156 "Erreur dans la compilation du catalogue développeur")
157 self.cata = (self.cata,)
159 self.cata_dev =self.import_cata(fic_cata_dev)
160 #self.Retrouve_Ordre_Cata_Developpeur()
161 self.Retrouve_Ordre_Cata_Developpeur_autre()
162 self.cata = (self.cata,self.cata_dev)
164 self.cata = (self.cata,)
166 self.cata = (self.cata,)
167 titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
168 titre=self.appli.titre+titreSuite
170 self.appli.top.title(titre)
171 self.appli.titre=titre
173 def determineMater(self) :
174 # Determinination du repertoire materiau
175 v_codeSansPoint=self.version_code
176 v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
177 chaine="rep_mat_"+v_codeSansPoint
178 if hasattr(self.appli.CONFIGURATION,chaine):
179 a=getattr(self.appli.CONFIGURATION,chaine)
182 a=self.appli.CONFIGURATION.dRepMat[self.version_code]
184 if self.code == "ASTER" :
185 print "Probleme avec le repertoire materiau"
187 self.appli.CONFIGURATION.rep_mat=a
189 def import_cata(self,cata):
191 Réalise l'import du catalogue dont le chemin d'acca¨s est donné par cata
193 nom_cata = os.path.splitext(os.path.basename(cata))[0]
194 rep_cata = os.path.dirname(cata)
195 sys.path[:0] = [rep_cata]
197 o=__import__(nom_cata)
200 traceback.print_exc()
203 def Retrouve_Ordre_Cata_Standard_autre(self):
205 Construit une structure de données dans le catalogue qui permet
206 a EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
207 Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
208 contient le nom des mots clés dans le bon ordre
210 self.cata_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
212 def Retrouve_Ordre_Cata_Standard(self):
214 Retrouve l'ordre des mots-clés dans le catalogue, cad :
215 - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
216 l'ordre des mots-clés dans le catalogue
217 - s'il n'a pas été modifié, relie le fichier pickle
219 time1 = os.path.getmtime(self.fic_cata)
221 time2 = os.path.getmtime(self.fic_cata_p)
225 # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
226 self.Get_Ordre_Cata()
228 # le catalogue a été modifié depuis le dernier "pickle" :
229 # il faut retrouver l'ordre du catalogue et refaire pickle
230 self.Get_Ordre_Cata(mode='cata')
231 self.appli.affiche_infos("Catalogue standard chargé")
233 def Retrouve_Ordre_Cata_Developpeur(self):
235 Retrouve l'ordre des mots-clés dans le catalogue, cad :
236 - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
237 l'ordre des mots-clés dans le catalogue
238 - s'il n'a pas été modifié, relie le fichier pickle
240 if self.code != 'ASTER' : return
241 fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
242 message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
243 cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
244 self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
245 cata_dev_ordonne_dico = cata_dev_ordonne.entites
246 self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
247 self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
249 def Retrouve_Ordre_Cata_Developpeur_autre(self):
251 Retrouve l'ordre des mots-clés dans le catalogue, cad :
252 - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
253 l'ordre des mots-clés dans le catalogue
254 - s'il n'a pas été modifié, relie le fichier pickle
256 if self.code != 'ASTER' : return
257 message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
258 cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
259 self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
260 self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
262 def Get_Ordre_Cata(self,mode='pickle'):
264 Retrouve l'ordre du catalogue :
265 - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
266 - mode='cata' : force l'analyse du catalogue directement sans relire le pickle
268 if mode == 'pickle' :
270 f = open(self.fic_cata_p)
271 u = cPickle.Unpickler(f)
272 self.cata_ordonne_dico = u.load()
275 # on peut ne pas arriver a relire le fichier pickle s'il a été altéré
276 # ou (le plus probable) s'il a été créé sous un autre OS
277 self.Get_Ordre_Cata(mode='cata')
279 cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
280 self.cata_ordonne_cr = cata_ordonne.cr
281 self.cata_ordonne_dico = cata_ordonne.entites
282 f = open(self.fic_cata_p,'w+')
283 p = cPickle.Pickler(f)
284 p.dump(self.cata_ordonne_dico)
287 raise Exception("Appel a un mode inconnu de Get_Ordre_Cata : %s" % mode)
290 def ask_choix_catalogue(self):
292 Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
293 ont été définis dans Accas/editeur.ini
295 # construction du dictionnaire et de la liste des catalogues
296 self.dico_catalogues = {}
298 for catalogue in self.appli.CONFIGURATION.catalogues:
299 if catalogue[0] == self.code :
300 self.dico_catalogues[catalogue[1]] = catalogue
301 if len(catalogue) == 5 :
302 if catalogue[4]=='defaut' : defaut = catalogue[1]
303 liste_choix = self.dico_catalogues.keys()
306 lab=QString("Eficas V1.")
307 lab+=QString(version)
308 lab+=QString(" pour ")
309 lab+=QString(self.code)
310 lab+=QString(" avec le catalogue ")
312 # teste si plusieurs catalogues ou non
313 if len(liste_choix) == 0:
314 QMessageBox.critical( self.parent, "", "Aucun catalogue déclaré pour %s" %self.code)
315 self.appli.parent.ui.close()
318 # création d'une boite de dialogue modale
319 widgetChoix=MonChoixCata(liste_choix,self, self.parent, "", True )
320 ret=widgetChoix.exec_loop()
322 lab=QString("Eficas V1.")
323 lab+=QString(version)
324 lab+=QString(" pour ")
325 lab+=QString(self.code)
326 lab+=QString(" avec le catalogue ")
327 if ret == QDialog.Accepted:
328 self.version_cata=str(self.version_cata)
329 self.fic_cata = self.dico_catalogues[self.version_cata][2]
330 self.version_code = self.version_cata
331 self.appli.format_fichier = self.dico_catalogues[self.version_cata][3]
332 self.appli.appliEficas.format_fichier = self.dico_catalogues[self.version_cata][3]
333 lab+=self.version_cata
334 self.appli.parent.ui.setCaption(lab)
335 #qApp.mainWidget().setCaption(lab)
340 def compile_cata(self,cata,catac):
342 Teste si le catalogue a bien besoin d'etre recompilé et si oui, le compile et
343 affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
346 time1 = os.path.getmtime(cata)
348 time2 = os.path.getmtime(catac)
353 # le catalogue doit etre recompilé avant d'etre importé
354 if self.appli.test == 0 :
355 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
356 py_compile.compile(cata)
362 #--------------------------------------------------------------------------------
363 # Méthodes concernant la barre de progression lors de l'analyse du catalogue
364 #--------------------------------------------------------------------------------
366 def configure_barre(self,nbcommandes):
367 """ Configure la barre de progression en lui passant comme parama¨tre le
368 nombre de commandes du catalogue qui lui sert a déterminer la longueur de son incrément """
370 if self.appli.test == 0 :
371 splash._splash.configure(barre='oui',ratio = nbcommandes)
375 def update_barre(self):
376 """ Update la position de la barre de progression : la fait progresser de son incrément """
378 if self.appli.test == 0 :
379 splash._splash.update_barre()
383 def visuCRCATA(self):
385 Méthode permettant l'affichage du rapport de validation
387 cr = CR( debut = "Début rapport de validation du catalogue",
388 fin = "Fin rapport de validation du catalogue")
389 titre="rapport de validation du catalogue"
390 if hasattr(self,'cata_ordonne_cr') :
391 cr.add(self.cata_ordonne_cr)
392 if hasattr(self,'cata_dev_ordonne_cr') :
393 cr.add(self.cata_dev_ordonne_cr)
394 for cata in self.cata:
395 if hasattr(cata,'JdC'):
396 cr.add(cata.JdC.report())
398 self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
401 def traite_clefs_documentaires(self):
403 self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
404 f=open(self.fic_cata_clef)
406 #print "Pas de fichier associé contenant des clefs documentaires"
410 for l in f.readlines():
414 dict_clef_docu[clef]=docu
415 for oper in self.cata.JdC.commandes:
416 if dict_clef_docu.has_key(oper.nom):
417 oper.docu=dict_clef_docu[oper.nom]