1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
21 Ce module sert à lire un catalogue et à construire
22 un objet CataItem pour Eficas.
23 Il s'appuie sur la classe READERCATA
27 import os,sys,py_compile
31 from tkMessageBox import showinfo,showerror
37 import analyse_catalogue
38 from Noyau.N_CR import CR
39 from widgets import Fenetre
40 from utils import init_rep_cata_dev
43 import autre_analyse_cata
50 ("Rapport de validation catalogue",'visuCRCATA'),
57 def __init__(self,appli,parent):
60 self.code=self.appli.code
61 self.appli.format_fichier.set('python')
67 Ouvre le catalogue standard du code courant, cad le catalogue présent
68 dans le répertoire Cata
70 message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
71 splash._splash.configure(text = message1)
72 if len(self.appli.CONFIGURATION.catalogues) == 1:
73 self.fic_cata = self.appli.CONFIGURATION.catalogues[0][2]
74 self.code = self.appli.CONFIGURATION.catalogues[0][0]
75 self.version_code = self.appli.CONFIGURATION.catalogues[0][1]
76 self.appli.format_fichier.set(self.appli.CONFIGURATION.catalogues[0][3])
77 elif len(self.appli.CONFIGURATION.catalogues) == 0:
78 # aucun catalogue défini dans le fichier Accas/editeur.ini
79 if self.code == 'ASTER' :
80 self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata.py')
81 elif self.code == 'SATURNE' :
82 self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata_saturne.py')
83 elif self.code == 'DESCARTES':
84 self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata_descartes.py')
89 # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur
90 # lequel il veut utiliser ...
91 self.ask_choix_catalogue()
92 if self.fic_cata == None :
95 # détermination de fic_cata_c et fic_cata_p
96 self.fic_cata_c = self.fic_cata + 'c'
97 self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
98 print "Debut compil cata: ",time.clock()
99 # compilation éventuelle du catalogue
100 test = self.compile_cata(self.fic_cata,self.fic_cata_c)
101 print "Fin compil cata: ",time.clock()
102 if not test : showerror("Compilation catalogue","Impossible de compiler le catalogue %s" %self.fic_cata)
103 # import du catalogue
104 print "Debut import_cata: ",time.clock()
105 self.cata = self.import_cata(self.fic_cata)
106 print "Fin import_cata: ",time.clock()
107 if not self.cata : showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
109 # analyse du catalogue (ordre des mots-clés)
111 print "Debut Retrouve_Ordre: ",time.clock()
112 # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
113 # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
114 # des mots clés à la création
115 #self.Retrouve_Ordre_Cata_Standard()
116 self.Retrouve_Ordre_Cata_Standard_autre()
117 print "Fin Retrouve_Ordre: ",time.clock()
119 # analyse des données liées à l'IHM : UIinfo
121 print "Debut UIinfo: ",time.clock()
122 uiinfo.traite_UIinfo(self.cata)
123 print "Fin UIinfo: ",time.clock()
125 # chargement et analyse des catalogues développeur (le cas échéant)
127 if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
128 init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
129 fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
130 if os.path.isfile(fic_cata_dev):
131 # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
132 test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
134 showinfo("Compilation catalogue développeur",
135 "Erreur dans la compilation du catalogue développeur")
136 self.cata = (self.cata,)
138 self.cata_dev =self.import_cata(fic_cata_dev)
139 #self.Retrouve_Ordre_Cata_Developpeur()
140 self.Retrouve_Ordre_Cata_Developpeur_autre()
141 self.cata = (self.cata,self.cata_dev)
143 self.cata = (self.cata,)
145 self.cata = (self.cata,)
147 def import_cata(self,cata):
149 Réalise l'import du catalogue dont le chemin d'accès est donné par cata
152 splash._splash.configure(text = "Chargement du catalogue")
153 nom_cata = os.path.splitext(os.path.basename(cata))[0]
154 rep_cata = os.path.dirname(cata)
155 sys.path[:0] = [rep_cata]
157 f,p,d = imp.find_module(nom_cata)
158 o = imp.load_module(nom_cata,f,p,d)
161 traceback.print_exc()
164 def Retrouve_Ordre_Cata_Standard_autre(self):
166 Construit une structure de données dans le catalogue qui permet
167 à EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
168 Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
169 contient le nom des mots clés dans le bon ordre
171 self.cata_ordonne_dico=autre_analyse_cata.analyse_catalogue(self.cata)
173 def Retrouve_Ordre_Cata_Standard(self):
175 Retrouve l'ordre des mots-clés dans le catalogue, cad :
176 - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
177 l'ordre des mots-clés dans le catalogue
178 - s'il n'a pas été modifié, relie le fichier pickle
180 time1 = os.path.getmtime(self.fic_cata)
182 time2 = os.path.getmtime(self.fic_cata_p)
186 # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
187 self.Get_Ordre_Cata()
189 # le catalogue a été modifié depuis le dernier "pickle" :
190 # il faut retrouver l'ordre du catalogue et refaire pickle
191 self.Get_Ordre_Cata(mode='cata')
192 self.appli.affiche_infos("Catalogue standard chargé")
194 def Retrouve_Ordre_Cata_Developpeur(self):
196 Retrouve l'ordre des mots-clés dans le catalogue, cad :
197 - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
198 l'ordre des mots-clés dans le catalogue
199 - s'il n'a pas été modifié, relie le fichier pickle
201 if self.code != 'ASTER' : return
202 fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
203 message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
204 splash._splash.configure(text = message,barre='oui')
205 cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
206 self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
207 cata_dev_ordonne_dico = cata_dev_ordonne.entites
208 self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
209 self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
211 def Retrouve_Ordre_Cata_Developpeur_autre(self):
213 Retrouve l'ordre des mots-clés dans le catalogue, cad :
214 - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
215 l'ordre des mots-clés dans le catalogue
216 - s'il n'a pas été modifié, relie le fichier pickle
218 if self.code != 'ASTER' : return
219 message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
220 splash._splash.configure(text = message,barre='oui')
221 cata_dev_ordonne_dico = autre_analyse_cata.analyse_catalogue(self.cata_dev)
222 self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
223 self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
225 def Get_Ordre_Cata(self,mode='pickle'):
227 Retrouve l'ordre du catalogue :
228 - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
229 - mode='cata' : force l'analyse du catalogue directement sans relire le pickle
231 if mode == 'pickle' :
233 f = open(self.fic_cata_p)
234 u = cPickle.Unpickler(f)
235 splash._splash.configure(text = "Analyse du catalogue")
236 self.cata_ordonne_dico = u.load()
239 # on peut ne pas arriver à relire le fichier pickle s'il a été altéré
240 # ou (le plus probable) s'il a été créé sous un autre OS
241 self.Get_Ordre_Cata(mode='cata')
243 splash._splash.configure(text = "Analyse du catalogue",barre='oui')
244 cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
245 self.cata_ordonne_cr = cata_ordonne.cr
246 self.cata_ordonne_dico = cata_ordonne.entites
247 splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
248 f = open(self.fic_cata_p,'w+')
249 p = cPickle.Pickler(f)
250 p.dump(self.cata_ordonne_dico)
253 raise Exception("Appel à un mode inconnu de Get_Ordre_Cata : %s" % mode)
256 def ask_choix_catalogue(self):
258 Ouvre une fenêtre de sélection du catalogue dans le cas où plusieurs
259 ont été définis dans Accas/editeur.ini
261 # construction du dictionnaire et de la liste des catalogues
262 self.dico_catalogues = {}
264 for catalogue in self.appli.CONFIGURATION.catalogues:
265 if catalogue[0] == self.code :
266 self.dico_catalogues[catalogue[1]] = catalogue
267 if len(catalogue) == 5 :
268 if catalogue[4]=='defaut' : defaut = catalogue[1]
269 liste_choix = self.dico_catalogues.keys()
271 # test si plusieurs catalogues ou non
272 if len(liste_choix) == 0:
273 showerror("Aucun catalogue déclaré pour %s" %self.code)
275 elif len(liste_choix) == 1:
276 self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
277 self.version_code = liste_choix[0]
279 # création d'une boîte de dialogue modale
280 self.fenetre_choix_cata = Pmw.Dialog(self.parent,
281 buttons=('OK','ANNULER'),
282 defaultbutton = 'OK',
283 title = "Choix d'une version du code %s" %self.code,
284 command = self.chooseCata)
285 # construction des radioboutons
286 label = `len(liste_choix)`+' versions du code %s sont disponibles\n' %self.code
287 label = label + 'Veuillez choisir celle avec laquelle vous souhaitez travailler :'
288 self.radiobutton = Pmw.RadioSelect(self.fenetre_choix_cata.interior(),
289 buttontype='radiobutton',
292 label_font = fontes.standard,
294 for choix in liste_choix :
295 self.radiobutton.add(choix)
297 # aucun catalogue par défaut n'a été spécifié dans Accas/editeur.ini
298 defaut = liste_choix[0]
299 self.radiobutton.invoke(defaut)
300 self.radiobutton.pack(fill='x',padx=10,pady=10)
301 # centrage de la fenêtre
302 self.fenetre_choix_cata.activate(geometry='centerscreenalways')
304 def chooseCata(self,txt):
306 Méthode activée lorsque l'utilisateur a fait son choix et cliqué sur 'OK' ou sur 'ANNULER'
309 version_cata = self.radiobutton.getcurselection()
310 self.fic_cata = self.dico_catalogues[version_cata][2]
311 self.version_code = version_cata
312 self.appli.format_fichier.set(self.dico_catalogues[version_cata][3])
313 self.fenetre_choix_cata.destroy()
315 self.parent.destroy()
317 def compile_cata(self,cata,catac):
319 Teste si le catalogue a bien besoin d'être recompilé et si oui, le compile et
320 affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
323 time1 = os.path.getmtime(cata)
325 time2 = os.path.getmtime(catac)
330 # le catalogue doit être recompilé avant d'être importé
331 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
332 py_compile.compile(cata)
338 #--------------------------------------------------------------------------------
339 # Méthodes concernant la barre de progression lors de l'analyse du catalogue
340 #--------------------------------------------------------------------------------
342 def configure_barre(self,nbcommandes):
343 """ Configure la barre de progression en lui passant comme paramètre le
344 nombre de commandes du catalogue qui lui sert à déterminer la longueur de son incrément """
346 splash._splash.configure(barre='oui',ratio = nbcommandes)
350 def update_barre(self):
351 """ Update la position de la barre de progression : la fait progresser de son incrément """
353 splash._splash.update_barre()
357 def visuCRCATA(self):
359 Méthode permettant l'affichage du rapport de validation
361 cr = CR( debut = "Début rapport de validation du catalogue",
362 fin = "Fin rapport de validation du catalogue")
363 titre="rapport de validation du catalogue"
364 if hasattr(self,'cata_ordonne_cr') :
365 cr.add(self.cata_ordonne_cr)
366 if hasattr(self,'cata_dev_ordonne_cr') :
367 cr.add(self.cata_dev_ordonne_cr)
368 for cata in self.cata:
369 if hasattr(cata,'JdC'):
370 cr.add(cata.JdC.report())
372 self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)