Salome HOME
PN pour notation scientifique
[tools/eficas.git] / Editeur / configuration.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     Ce module sert pour charger les paramètres de configuration d'EFICAS
23 """
24 # Modules Python
25 import os,sys,string,types
26 import traceback
27
28 # Modules Eficas
29 from widgets import showinfo,showerror,askretrycancel
30 import utils
31
32 class CONFIG:
33   def __init__(self,appli,rep_ini):
34       # si appli == None on est en mode commande (hors EFICAS)
35       self.appli = appli  
36       if self.appli:self.parent=appli.top
37       else:self.parent=None
38       self.rep_ini = rep_ini
39       self.rep_user = utils.get_rep_user()
40       self.lecture_parametres()
41
42   def lecture_parametres(self):
43       """
44          Cette méthode teste l'existence du fichier editeur.ini au bon endroit et lance
45          son interprétation
46       """
47       fic_ini = os.path.join(self.rep_ini,'editeur.ini')
48       if not os.path.exists(fic_ini) or not os.path.isfile(fic_ini):
49         if self.appli :
50           showerror("Erreur","Impossible de trouver le fichier %s ! \n Prévenez la maintenance ..." %fic_ini)
51         else:
52           print "Impossible de trouver le fichier %s ! \n Prévenez la maintenance ..." %fic_ini
53         sys.exit(0)
54       self.fic_ini = fic_ini
55       self.init_liste_param()
56       self.lecture_fichier_ini_standard()
57       self.lecture_fichier_ini_utilisateur()
58
59   def lecture_fichier_ini_standard(self):
60       """
61       Relit les paramètres du fichier eficas.ini
62       """
63       txt = utils.read_file(self.fic_ini)
64       d={}
65       try:
66          exec txt in d
67       except:
68          l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
69          showerror("Erreur","Une erreur s'est produite dans la relecture du fichier de configuration : "
70                        + self.fic_ini+"\n"+string.join(l[2:]))
71          print "Erreur à la lecture du fichier de configuration : %s" % self.fic_ini 
72          print string.join(l[2:])
73          sys.exit()
74       for attr in self.l_nom_param:
75           nom_attr,statut,defaut = attr
76           #valeur = d.get(nom_attr,None)
77           valeur = d.get(nom_attr,defaut)
78           if not valeur and statut=='o':
79               showerror("Erreur","Une erreur s'est produite dans la relecture du fichier de configuration : "
80                        + self.fic_ini+"\n EFICAS va vous demander les nouveaux paramètres")
81               return
82           setattr(self,nom_attr,valeur)
83       self.init_liste_param()
84
85   def lecture_fichier_ini_utilisateur(self):
86       """
87       Surcharge les paramètres standards par les paramètres utilisateur s'ils existent
88       """
89       self.fic_ini_utilisateur = os.path.join(self.rep_user,'eficas.ini')
90       if not os.path.isfile(self.fic_ini_utilisateur):
91           # pas de fichier de configuration utilisateur --> on passe
92           return
93       txt = utils.read_file(self.fic_ini_utilisateur)
94       d={}
95       try:
96           exec txt in d
97       except :
98           showinfo("Erreur","Impossible d'interpréter le fichier de configuration utilisateur : %s" %self.fic_ini_utilisateur)
99           traceback.print_exc()
100           return
101       for attr in self.l_nom_param:
102           nom_attr,statut,defaut = attr
103           valeur = d.get(nom_attr,None)
104           if valeur :
105               setattr(self,nom_attr,valeur)
106       self.init_liste_param()
107
108   def init_liste_param(self):
109       """
110       Génère la liste des paramètres
111       l_param est une liste de tuples où chaque tuple est de la forme :
112       (label,nature,nom_var,defaut)
113       """
114       self.l_param=[]
115       # répertoire initial pour OPEN/SAVE des fichiers de commande
116       # Par defaut, EFICAS utilise le repertoire utilisateur $HOME/Eficas_install
117       # Il est possible de specifier dans editeur.ini ou eficas.ini un autre chemin
118       # Ce peut etre un chemin absolu ou le repertoire courant (os.curdir)
119       if hasattr(self,'initialdir'):
120           self.l_param.append(("Répertoire initial pour Open/save des fichiers de commande",'rep','initialdir',self.initialdir))
121       else:
122           self.l_param.append(("Répertoire initial pour Open/save des fichiers de commande",'rep','initialdir',self.rep_user))
123       # répertoire de travail
124       if hasattr(self,'rep_travail'):
125           self.l_param.append(("Répertoire de travail",'rep','rep_travail',self.rep_travail))
126       else:
127           self.l_param.append(("Répertoire de travail",'rep','rep_travail',
128                                os.path.join(self.rep_user,'uaster','tmp_eficas')))
129       # répertoire des catalogues matériaux
130       if hasattr(self,'rep_mat'):
131           self.l_param.append(("Répertoire materiaux",'rep','rep_mat',self.rep_mat))
132       else:
133           self.l_param.append(("Répertoire materiaux",'rep','rep_mat','/aster/v4/materiau'))
134       # chemin d'accès exécutable acrobat reader
135       if hasattr(self,'exec_acrobat'):
136           self.l_param.append(("Ligne de commande Acrobat Reader",'file','exec_acrobat',self.exec_acrobat))
137       else:
138           self.l_param.append(("Ligne de commande Acrobat Reader",'file','exec_acrobat',self.rep_user))
139       # répertoire contenant la doc Aster
140       if hasattr(self,'path_doc'):
141           self.l_param.append(("Chemin d'accès à la doc Aster",'rep','path_doc',self.path_doc))
142       else:
143           self.l_param.append(("Chemin d'accès à la doc Aster",'rep','path_doc',self.rep_user))
144       # chemin(s) d'accès au(x) catalogue(s)
145       if hasattr(self,'catalogues'):
146           self.l_param.append(("Versions du code ",'cata','catalogues',self.catalogues))
147       else:
148           self.l_param.append(("Versions du code ",'cata','catalogues',os.path.join(self.rep_ini,'..','Cata/cata.py')))
149       # attribut développeur
150       if hasattr(self,'isdeveloppeur'):
151           self.l_param.append(("Etes-vous développeur ?",'YesNo','isdeveloppeur',self.isdeveloppeur))
152       else:
153           self.l_param.append(("Etes-vous développeur ?",'YesNo','isdeveloppeur','NON'))
154       # répertoire où sont contenus les catalogues développeurs
155       if hasattr(self,'path_cata_dev') and hasattr(self,'isdeveloppeur') and self.isdeveloppeur == 'OUI':
156           self.l_param.append(("Chemin d'accès aux catalogues développeurs",'rep','path_cata_dev',self.path_cata_dev))
157       else:
158           self.l_param.append(("Chemin d'accès aux catalogues développeurs",'rep','path_cata_dev',
159                                os.path.join(self.rep_user,'cata')))
160       self.l_param = tuple(self.l_param)
161       self.l_nom_param=[]
162       statut='o'
163       for tup in self.l_param:
164           if tup[1] == 'YesNo':
165               # les paramètres suivant tup sont facultatifs ...
166               statut='f'
167           self.l_nom_param.append((tup[2],statut,tup[3])) # nom,statut,defaut
168
169   def affichage_fichier_ini(self):
170       """
171       Affichage des valeurs des paramètres relus par Eficas
172       """
173       import widgets
174       result = widgets.Formulaire(self.parent,
175                                   obj_pere = self,
176                                   titre = "Paramètres nécessaires à la configuration d'EFICAS",
177                                   texte = "Voici les paramètres que requiert Eficas",
178                                   items = self.l_param,
179                                   mode='display',
180                                   commande=('Modifier',self.creation_fichier_ini_si_possible))
181       if result.resultat :
182           print 'on sauvegarde les nouveaux paramètres :',result.resultat
183           self.save_param_ini(result.resultat)
184
185   def save_param_ini(self,dico):
186       """
187       Sauvegarde les nouveaux paramètres dans le fichier de configuration utilisateur
188       """
189       f=open(self.fic_ini_utilisateur,'w+')
190       for k,v in dico.items():
191          if k == 'catalogues' :
192             f.write(k + '\t=\t' + str(v) + '\n')
193          else:
194             f.write(k + '\t=\t"' + str(v) + '"\n')
195       f.close()
196       self.lecture_fichier_ini_utilisateur()
197
198   def creation_fichier_ini_si_possible(self):
199       return self.creation_fichier_ini(mode='ignorer_annuler')
200
201   def creation_fichier_ini(self,mode='considerer_annuler'):
202       """
203       Récupération des valeurs des paramétres requis pour la création du fichier
204       eficas.ini
205       """
206       import widgets
207       texte = "EFICAS a besoin de certains renseignements pour se configurer\n"+\
208               "Veuillez remplir TOUS les champs ci-dessous et appuyer sur 'Valider'\n"+\
209               "Si vous annulez, EFICAS ne se lancera pas !!"
210       items = self.l_param
211       result = widgets.Formulaire(self.parent,
212                                   obj_pere = self,
213                                   titre = "Saisie des données indispensables à la configuration d'EFICAS",
214                                   texte = texte,
215                                   items = items,
216                                   mode='query')
217       if not result.resultat :
218           if mode == 'considerer_annuler':
219              test = askretrycancel("Erreur","Données incorrectes !")
220              if not test:
221                  # XXX On sort d'EFICAS, je suppose
222                  self.appli.exitEFICAS()
223              else:
224                  self.creation_fichier_ini()
225           else:
226               return None
227       else :
228           self.save_param_ini(result.resultat)
229           return result.resultat
230
231 def make_config(appli,rep):
232     return CONFIG(appli,rep)
233
234