1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import os
16
17 import dico, base64
18 from copy import copy
19 from creole.cfgparser import EoleDict
20 from creole.error import TypeEoleError
21 from zephir.config import charset
22 from creole import eosfunc
23 from glob import glob
24
26 """sert de wrapper par dessus les dictionnaires creole1 et creole2
27 """
28
29 - def __init__(self, dicos=[], confdir='', mode='config', version='creole2'):
30 """initialise un objet dictionnaire avec la bonne api
31 """
32 self.version = version
33 config_file = ""
34 if confdir != '':
35 if mode == 'modif_config' and os.path.isfile(confdir+os.sep+'zephir.eol'):
36 config_file = confdir+os.sep+'zephir.eol'
37 elif mode in ['config','modif_config','modif_dico']:
38 if os.path.isfile(confdir+os.sep+'dico.eol'):
39 config_file = confdir+os.sep+'dico.eol'
40 elif os.path.isfile(confdir+os.sep+'module.eol'):
41 config_file = confdir+os.sep+'module.eol'
42 if self.version == 'creole1':
43
44 self.dico = dico.DicoEole(dico_zephir=dicos)
45
46 dico_actuel = None
47 if config_file != "":
48 fic = open(config_file)
49 data = fic.readlines()
50 lines = [ unicode(line,'ISO-8859-1').encode(charset) for line in data ]
51 fic.close()
52
53 dico_actuel=dico.DicoEole(dico_zephir=[lines]).ParseDico()
54
55 if dico_actuel is not None:
56
57 dico_final = {}
58
59 for variable, data in self.dico.dictionnaire.items():
60
61 if dico_actuel.has_key(data[0]):
62 data[1] = dico_actuel[data[0]][0]
63 dico_final[variable] = data
64
65 self.dico.dictionnaire = dico_final
66 self.liste_vars = self.dico.liste_vars
67
68 elif self.version == 'creole2':
69
70 self.dico = EoleDict(logfile='/dev/null')
71 self.dicos = []
72
73 for creoledir in dicos:
74 if os.path.isdir(creoledir):
75 self.dicos.extend(glob(creoledir + '/*.xml'))
76 self.dico.read_dir(creoledir)
77
78 if config_file != "":
79 self.dico.load_values(config_file)
80 elif os.path.isfile(confdir+os.sep+'module.eol'):
81
82 self.dico.load_values(confdir+os.sep+'module.eol')
83
84 self.index = 0
85 self.vars = []
86 for family in self.dico.family_order:
87 for var in self.dico.families[family]['vars']:
88 self.vars.append(var)
89
90 ind = 0
91 self.liste_vars = {}
92 for var in self.vars:
93 self.liste_vars[var] = ind
94 ind += 1
95
97 """charge les dictionnaire depuis une liste de chaines xml
98 @param dicos: contenu des dictionnaires à implémenter + valeurs actuelles en fin de liste
99 """
100 if self.version == 'creole1':
101 dicos = base64.decodestring(dicos)
102 dicos = [dicos.splitlines(True)]
103 self.dico = dico.DicoEole(dico_zephir=dicos)
104 self.liste_vars = self.dico.liste_vars
105 elif self.version == 'creole2':
106
107 self.dico = EoleDict(logfile='/dev/null')
108 self.dicos = [base64.decodestring(dico_zeph) for dico_zeph in dicos[:-1]]
109
110 for xml_dict in self.dicos:
111 self.dico.read_string(xml_dict)
112
113 self.dico.store._sections = eval(dicos[-1])
114 self.dico._load_values()
115
116 self.index = 0
117 self.vars = []
118 for family in self.dico.family_order:
119 for var in self.dico.families[family]['vars']:
120 self.vars.append(var)
121 ind = 0
122 self.liste_vars = {}
123 for var in self.vars:
124 self.liste_vars[var] = ind
125 ind += 1
126
129
131 vals = []
132 allow_other = False
133 if self.version == 'creole1':
134 conditions = self.dico.dictionnaire[self.dico.liste_vars[var]][3]
135
136 for cond in conditions:
137 if cond.startswith('enumeration'):
138 try:
139 vals = eval(cond.split('??')[1])
140 except:
141
142 vals = ['oui','non']
143 break
144 elif self.version == 'creole2':
145 eolvar = self.dico.get_variable(var)
146 checks = eolvar.checks
147 for check in checks:
148 if check[0] == u'valid_enum':
149
150 for param in check[1]:
151 if param['name'] == 'checkval':
152 if param['value'] == "False":
153 allow_other = True
154 else:
155 vals.extend(eval(param['value']))
156 return vals, allow_other
157
159 """retourne les paramètres de la variable nom,valeur,libelle,variable cachée
160 """
161 if self.version == 'creole1':
162 self.dico.get_first()
163 elif self.version == 'creole2':
164 self.index = 0
165 return self._get_var_details()
166
168 if self.version == 'creole1':
169 self.dico.get_next()
170 elif self.version == 'creole2':
171 self.index = self.index + 1
172 try:
173 return self._get_var_details()
174 except:
175 raise dico.PositionError, 'fin de la liste des variables'
176
178 """retourne les paramètres d'une variable creole1/2
179 """
180 return self._get_var_details(varname)
181
183 """adapte la représentation des variables creole1/2 pour zephir
184 """
185
186 if self.version == 'creole2':
187 if varname != None:
188 var = self.dico.get_variable(varname)
189 self.index = self.vars.index(varname)
190 else:
191 var = self.dico.get_variable(self.vars[self.index])
192 obligatoire = False
193 if 'obligatoire' in [ check[0] for check in var.checks ]:
194 obligatoire = True
195 mime = var.mime
196 val = var.get_value()
197 if type(val) != list:
198 val = [val]
199 if val ==[]:
200 val = ['']
201 data = var.name, val, var.description, var.hidden, obligatoire, mime
202 elif self.version == 'creole1':
203 if varname != None:
204 name, val, description, hidden = self.dico.get_var(varname)
205 else:
206 name, val, description, hidden = self.dico.get_current()
207 checks = self.dico.dictionnaire[self.dico.liste_vars[name]][3]
208 if 'obligatoire' in checks:
209 obligatoire = True
210 liste_funcs = copy(checks)
211 liste_funcs.remove('obligatoire')
212
213 else:
214 obligatoire = False
215 liste_funcs = checks
216 data = name, [val], description, hidden, obligatoire, liste_funcs
217
218 return data
219
221 """ renvoit la valeur précédente """
222 if self.version == 'creole2':
223 try:
224 value = self.dico.get_prec_value(varname)[0]
225 except:
226 value = ''
227
228
229 elif self.version == 'creole1':
230 try:
231 value = self.dico.get_var(varname)[1]
232 except:
233 value = ''
234 return value
235
237 """ renvoit la valeur par défaut """
238 if self.version == 'creole2':
239 try:
240 value = self.dico.get_value(varname, default=True)[0]
241 except:
242 value = ''
243
244
245 elif self.version == 'creole1':
246 try:
247 value = self.dico.get_var(varname)[1]
248 except:
249 value = ''
250 return value
251
252 - def set_value(self, value, invisible=False, force=False):
253 if self.version == 'creole1':
254 if type(value) == list:
255 value = value[0]
256 self.dico.set_value(value, invisible, force=force)
257 elif self.version == 'creole2':
258 try:
259 self.dico.set_value(self.vars[self.index], value, force=force)
260 except Exception, e:
261 raise dico.InvalidDataError, e.args[0]
262
263 - def save(self, file='/dev/null', force=False, encode=False):
264 if self.version == 'creole1':
265 data = self.dico.save(file, encode=encode)
266 elif self.version == 'creole2':
267
268 self.dico.save_values(file,force)
269
270 data = [str(self.dico.store._sections)]
271 return data
272
274
275 data = []
276 if self.version == 'creole2':
277 for dic in self.dicos:
278 f = open(dic)
279 content = f.read()
280 f.close()
281 data.append(base64.encodestring(content))
282 data.extend(self.save(force=True))
283 return data
284 elif self.version == 'creole1':
285 return [base64.encodestring(self.save())]
286
288 """retourne les familles et les variables dans l'ordre de saisie
289 @param expert: mode de saisie (non expert par défaut)
290 @return: renvoie une liste ordonnée de familles [famille, liste_vars]
291 """
292 menu = []
293 if self.version == 'creole1':
294
295 middle = len(self.dico.dictionnaire)/2
296 end = len(self.dico.dictionnaire)-middle
297 vars1 = [self.dico.dictionnaire[numvar][0] for numvar in range(middle)]
298 vars2 = [self.dico.dictionnaire[middle + numvar][0] for numvar in range(end)]
299 menu.append(['general', False, vars1])
300 menu.append(['general_1', False, vars2])
301
302
303
304 else:
305
306 for family in self.dico.family_order:
307 data = self.dico.families[family]
308 if not data['mode'] == 'expert':
309
310 vars = data['vars']
311 menu.append([family.encode(charset), data['hidden'], vars])
312
313 if expert == True:
314 for family in self.dico.family_order:
315 data = self.dico.families[family]
316 if data['mode'] == 'expert':
317 vars = data['vars']
318 menu.append([family.encode(charset), data['hidden'], vars])
319 return menu
320
322
323 data = {}
324 if self.version == 'creole1':
325 for varname, values in self.dico.ParseDico().items():
326 data[varname] = values[0]
327 else:
328 for varname in self.dico.variables.keys():
329 data[varname] = ", ".join(self.dico.get_value(varname))
330 return data
331