Package zephir :: Package utils :: Module creolewrap
[hide private]
[frames] | no frames]

Source Code for Module zephir.utils.creolewrap

  1  # -*- coding: UTF-8 -*- 
  2  ########################################################################### 
  3  # Eole NG - 2007   
  4  # Copyright Pole de Competence Eole  (Ministere Education - Academie Dijon) 
  5  # Licence CeCill  cf /root/LicenceEole.txt 
  6  # eole@ac-dijon.fr  
  7  #   
  8  # creolewrap.py 
  9  #   
 10  # classe abstraite permettant de gérer les configurations 
 11  # creole1 et creole2 dans zephir 
 12  #        
 13  ########################################################################### 
 14   
 15  import os 
 16  # import creole1 et creole2 
 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   
25 -class ZephirDict:
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 # initialisiation du dictionnaire 44 self.dico = dico.DicoEole(dico_zephir=dicos) 45 # dictionnaire des valeurs par défaut ou déjà remplies 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 # on parse ce dico 53 dico_actuel=dico.DicoEole(dico_zephir=[lines]).ParseDico() 54 55 if dico_actuel is not None: 56 # des valeurs ont déjà été saisies 57 dico_final = {} 58 # on réinsère les données existantes dans le dictionnaire 59 for variable, data in self.dico.dictionnaire.items(): 60 # si la variable existait déjà, on reprend sa valeur 61 if dico_actuel.has_key(data[0]): 62 data[1] = dico_actuel[data[0]][0] 63 dico_final[variable] = data 64 # on remet le dictionnaire modifié en place dans self.dico 65 self.dico.dictionnaire = dico_final 66 self.liste_vars = self.dico.liste_vars 67 68 elif self.version == 'creole2': 69 # initialisiation du dictionnaire 70 self.dico = EoleDict(logfile='/dev/null') 71 self.dicos = [] 72 # chargement de tous les dictionnaires disponibles 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 # lecture des valeurs actuelles selon le mode demandé 78 if config_file != "": 79 self.dico.load_values(config_file) 80 elif os.path.isfile(confdir+os.sep+'module.eol'): 81 # on prend les valeurs par défaut du module 82 self.dico.load_values(confdir+os.sep+'module.eol') 83 # création d'un liste pour ordonner les variables 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 # création de self.liste_vars 90 ind = 0 91 self.liste_vars = {} 92 for var in self.vars: 93 self.liste_vars[var] = ind 94 ind += 1
95
96 - def init_from_zephir(self,dicos):
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 # initialisiation du dictionnaire 107 self.dico = EoleDict(logfile='/dev/null') 108 self.dicos = [base64.decodestring(dico_zeph) for dico_zeph in dicos[:-1]] 109 # chargement de tous les dictionnaires disponibles 110 for xml_dict in self.dicos: 111 self.dico.read_string(xml_dict) 112 # chargement des valeurs actuelles 113 self.dico.store._sections = eval(dicos[-1]) 114 self.dico._load_values() 115 # création d'un liste pour ordonner les variables 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
127 - def get_value(self,var):
128 return self.dico.get_value(var)
129
130 - def get_enumeration(self, var):
131 vals = [] 132 allow_other = False 133 if self.version == 'creole1': 134 conditions = self.dico.dictionnaire[self.dico.liste_vars[var]][3] 135 # recherche des enumérations 136 for cond in conditions: 137 if cond.startswith('enumeration'): 138 try: 139 vals = eval(cond.split('??')[1]) 140 except: 141 # si rien n'est spécifié, on propose oui,non par défaut 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 # récupération des valeurs possibles 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
158 - def get_first(self):
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
167 - def get_next(self):
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
177 - def get_var(self, varname=None):
178 """retourne les paramètres d'une variable creole1/2 179 """ 180 return self._get_var_details(varname)
181
182 - def _get_var_details(self, varname=None):
183 """adapte la représentation des variables creole1/2 pour zephir 184 """ 185 # récupération des infos 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 # liste_funcs = checks.remove('obligatoire') 213 else: 214 obligatoire = False 215 liste_funcs = checks 216 data = name, [val], description, hidden, obligatoire, liste_funcs 217 218 return data
219
220 - def get_prec_value(self, varname):
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 # XXX FIXME : gestion des variables multivaluées !! 228 # (retourner aussi une liste pour creole 1) 229 elif self.version == 'creole1': 230 try: 231 value = self.dico.get_var(varname)[1] 232 except: 233 value = '' 234 return value
235
236 - def get_default_value(self, varname):
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 # XXX FIXME : gestion des variables multivaluées !! 244 # (retourner aussi une liste pour creole 1) 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 # sauvegarde du fichier de valeurs 268 self.dico.save_values(file,force) 269 # on retourne le dictionnaire des valeurs pour recréer le ConfigParser 270 data = [str(self.dico.store._sections)] 271 return data
272
273 - def get_dict(self):
274 # on envoie le dictionnaire sous forme de fichier texte 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
287 - def get_menu(self, expert=False):
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 # on met toutes les variables (dans l'ordre de saisie) dans une famille "general". 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 # vars =[self.dico.dictionnaire[numvar][0] for numvar in range(len(self.dico.dictionnaire))] 302 # menu.append(['general', False, vars]) 303 304 else: 305 # liste des familles normales 306 for family in self.dico.family_order: 307 data = self.dico.families[family] 308 if not data['mode'] == 'expert': 309 # on récupère la liste des variables à afficher dans l'ordre 310 vars = data['vars'] 311 menu.append([family.encode(charset), data['hidden'], vars]) 312 # liste des familles expert 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
321 - def parsedico(self):
322 # renvoie la configuration sous forme d'un dictionnaire {variable:valeur} 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