Package zephir :: Package backend :: Module etabs_rpc
[frames] | no frames]

Source Code for Module zephir.backend.etabs_rpc

  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  # etabs_rpc.py 
  9  #   
 10  # fonctions xmlrpc pour la gestion des etablissement sous Zephir 
 11  #        
 12  ########################################################################### 
 13  from zephir.backend import config 
 14  from zephir.backend.config import u, log 
 15  from zephir.backend.db_utils import * 
 16  from zephir.backend.xmlrpceole import XMLRPCEole as XMLRPC 
 17   
 18  # import relatifs aux tables 
 19  import psycopg2 as PgSQL 
 20   
 21  import sys,os,shutil 
 22   
23 -class RPCEtabs(XMLRPC):
24 """serveur XMLRPC zephir pour la gestion des établissements 25 """ 26
27 - def __init__(self,parent):
28 # connexion à la base de données zephir 29 self.dbpool = db_connect() 30 self.dbpool.noisy = 0 31 XMLRPC.__init__(self) 32 self.parent = parent
33 34
35 - def _got_etabs(self, etabs, cred_user):
36 """formate la sortie de la table etablissements 37 """ 38 l=[] 39 for etab in etabs: 40 try: 41 self.parent.s_pool.check_etab_credential(cred_user, etab[0]) 42 except: 43 continue 44 l.append({'rne':etab[0], 45 'libelle':etab[1], 46 'adresse':etab[2], 47 'ville':etab[9], 48 'cp':etab[10], 49 'tel':etab[3], 50 'fax':etab[4], 51 'mail':etab[5], 52 'responsable':etab[6], 53 'remarques':etab[7], 54 'type':etab[8] 55 }) 56 return 1,u(l)
57
58 - def _got_libelle_ville_etabs(self,etabs):
59 """formate la sortie de la table etablissements 60 """ 61 l1=[] 62 l2=[] 63 for etab in etabs: 64 l1.append(etab[0]) 65 if etab[1] not in l2: 66 l2.append(etab[1]) 67 return 1,u([l1,l2])
68
69 - def _got_types(self,types_etab):
70 """formate la sortie des types d'établissement 71 """ 72 d={} 73 for t in types_etab: 74 d[str(t[0])]=u(t[1]) 75 return 1,[d]
76
77 - def xmlrpc_get_etab(self,cred_user, rne=None):
78 """Récupération des données d'un établissement (ou de tous) 79 """ 80 if rne: 81 query = """select * from etablissements where rne ilike %s""" 82 return self.dbpool.runQuery(query, (rne,)).addCallbacks(self._got_etabs,db_client_failed,callbackArgs=[cred_user]) 83 else: 84 # si pas de rne demandé, on renvoie tous les établissements connus 85 query = """select * from etablissements""" 86 return self.dbpool.runQuery(query).addCallbacks(self._got_etabs,db_client_failed,callbackArgs=[cred_user])
87
88 - def xmlrpc_get_libelle_etab(self,cred_user):
89 """Récupération des données d'un établissement (ou de tous) 90 """ 91 query = """select libelle, ville from etablissements order by ville""" 92 return self.dbpool.runQuery(query).addCallbacks(self._got_libelle_ville_etabs,db_client_failed)
93
94 - def _load_types(self,cx):
95 """lit les types établissement et renvoie un dictionnaire 96 """ 97 cursor=cx.cursor() 98 # on lit la base 99 cursor.execute("""select id,libelle from types_etab""") 100 result = cursor.fetchall() 101 cursor.close() 102 num_types = {} 103 # correspondance libelle -> n° 104 for row in result: 105 num_types[row[1].upper()]=row[0] 106 107 return num_types
108 109
110 - def xmlrpc_import_etab(self,cred_user, data):
111 """importe des établissements depuis un fichier csv""" 112 # recherche des types d'établissement 113 # from nomenclature import nomenclature_ramses 114 # correspondances des types etab 115 cx = PgSQL.connect(database=config.DB_NAME,user=config.DB_USER,password=config.DB_PASSWD) 116 num_types = self._load_types(cx) 117 cx.close() 118 errors=[] 119 # on commence par vérifier les types d'établissement 120 missing=[] 121 for etab in data: 122 libelle = etab[3] 123 if libelle.strip() == "": 124 libelle = "INDEFINI" 125 etab[3] = libelle 126 if libelle.upper() not in num_types.keys(): 127 if libelle.upper() not in missing: 128 missing.append(libelle.upper()) 129 130 if missing != []: 131 dict_miss = [] 132 for miss in missing: 133 dict_miss.append({'miss':miss}) 134 cx = PgSQL.connect(database=config.DB_NAME,user=config.DB_USER,password=config.DB_PASSWD) 135 cursor=cx.cursor() 136 # on ajoute les types non existants 137 cursor.executemany("insert into types_etab (libelle) values (%(miss)s)", dict_miss) 138 cursor.close() 139 cx.commit() 140 # on relit la base 141 num_types = self._load_types(cx) 142 cx.close() 143 144 # on ajoute les etablissements 145 for etab in data: 146 rne = etab[0] 147 # type_etab = nomenclature_ramses[etab[1] + '_' + etab[2]] 148 libelle = etab[3] + " " + etab[4] 149 cp = etab[5] 150 adresse = " " 151 ville = etab[6] 152 telephone = etab[9] 153 fax = etab[8] 154 mail = etab[7] 155 responsable = "non défini" 156 remarques = "" 157 # on récupère son n° de type 158 if num_types.has_key(etab[3].upper()): 159 type_etab = num_types[etab[3].upper()] 160 res = self.xmlrpc_add_etab(cred_user,rne,libelle,adresse,ville,cp,telephone,fax,mail,responsable,remarques,type_etab) 161 if errors != []: 162 return 0,u('erreur : %s' % errors) 163 else: 164 return 1,u("OK")
165 166
167 - def xmlrpc_add_etab(self,cred_user,rne,libelle,adresse,ville,cp,telephone,fax,mail,responsable,remarques,type_etab):
168 """ajoute un établissement""" 169 # on vérifie que les données obligatoires sont remplies 170 if (rne and libelle and type_etab): 171 # objet etab 172 query = """insert into etablissements values (%s,E%s,E%s,%s,%s,%s,E%s,E%s,%s,E%s,%s)""" 173 params = (rne, libelle, adresse, telephone, fax, mail, responsable, remarques, type_etab, ville.upper(), cp) 174 # on effectue l'insertion (l'existence est à tester dans l'application cliente) 175 return self.dbpool.runOperation(query, params).addCallbacks(self._add_etab, db_client_failed,callbackArgs=[rne, cred_user]) 176 else: 177 # des attributs manquent 178 return 0,u('arguments manquants')
179
180 - def _add_etab(self,resultat, rne, cred_user):
181 """met en place l'arborescence zephir de l'établissement """ 182 # si nécessaire, on donne les droits d'accès à l'établissement pour la personne qui l'a créé 183 try: 184 self.parent.s_pool.check_etab_credential(cred_user, rne) 185 except: 186 self.parent.s_pool.add_restriction(cred_user,'rne',rne) 187 # création de l'arborescence de l'établissement 188 etab_dir = os.path.abspath(config.PATH_ZEPHIR)+'/conf/'+rne 189 try: 190 os.makedirs(etab_dir) 191 except: 192 return 0,u("erreur de création du répertoire de l'établissement") 193 else: 194 return 1,u(rne)
195
196 - def xmlrpc_del_etab(self,cred_user,rne):
197 """supprime un établissement""" 198 self.parent.s_pool.check_etab_credential(cred_user, rne) 199 # on vérifie qu'il ne reste pas de serveurs 200 query = """select id from serveurs where rne=%s""" 201 return self.dbpool.runQuery(query, (rne,)).addCallbacks(self._del_etab, db_client_failed,callbackArgs=[rne])
202
203 - def _del_etab(self,data,rne):
204 """supprime l'établissement dans la base de données""" 205 if len(data) > 0: 206 # on n'autorise pas la supression si il reste des serveurs 207 return 0, u("Suppression impossible, il existe des serveurs rattachés à cet établissement") 208 209 # on supprime la configuration uucp de tous les serveurs correspondants 210 try: 211 file_conf = open('/etc/uucp/config_zephir','r') 212 conf_uucp = file_conf.readlines() 213 file_conf.close() 214 except: 215 return 0, u("""erreur de lecture de /etc/uucp/config_zephir""") 216 try: 217 for sysfile in os.listdir('/etc/uucp/serveurs'): 218 if sysfile.startswith(rne+'-'): 219 # on supprime le fichier de définition du serveur 220 os.unlink('/etc/uucp/serveurs'+os.sep+sysfile) 221 # on supprime la référence à ce fichier dans /etc/uucp/config 222 conf_uucp.remove('sysfile /etc/uucp/serveurs/'+sysfile+'\n') 223 except: 224 # si pas encore de serveurs -> pas de répertoire 225 pass 226 227 # supression des logins/mots de passes correpondants 228 try: 229 # lecture des infos de login 230 file_pwd = open('/etc/uucp/passwd_zephir','r') 231 pwd_uucp = file_pwd.readlines() 232 file_pwd.close() 233 # supression des lignes pour cet étab 234 for line in pwd_uucp: 235 if line.startswith(rne+'-'): 236 pwd_uucp.remove(line) 237 # sauvegarde de la liste 238 file_pwd = open('/etc/uucp/passwd_zephir','w') 239 file_pwd.writelines(pwd_uucp) 240 file_pwd.close() 241 except: 242 return 0, u("""erreur de mise à jour du fichier des mots de passe""") 243 244 # mise à jour du fichier /etc/uucp/config_zephir 245 try: 246 file_conf = open('/etc/uucp/config_zephir','w') 247 file_conf.writelines(conf_uucp) 248 file_conf.close() 249 except: 250 return 0, u("""erreur d'écriture dans /etc/uucp/config_zephir""") 251 252 query = """delete from etablissements where rne=%s""" 253 return self.dbpool.runOperation(query, (rne,)).addCallbacks(self._del_etab2, db_client_failed,callbackArgs=[rne])
254
255 - def _del_etab2(self,resultat,rne):
256 """supprime l'arborescence de l'établissement""" 257 etab_dir = os.path.abspath(config.PATH_ZEPHIR)+'/conf/'+rne 258 # supression de ce répertoire ? 259 try: 260 shutil.rmtree(etab_dir) 261 except: 262 return 0,u("""erreur de supression du répertoire de l'établissement""") 263 else: 264 log.msg("établissement %s supprimé" % rne) 265 return 1,u('ok')
266 267 # modification d'un etablissement
268 - def xmlrpc_edit_etab(self,cred_user,rne,dico_modifs):
269 """modification d'un établissement 270 cette fonction prend en compte un dictionnaire qui indique les 271 champs à modifier et leur nouvelle valeur. l'application cliente 272 doit s'assurer que ces champs existent dans la base 273 ex: zephir.etabs.edit_etab('R620001X',{'libelle':'bla bla','type':1})""" 274 self.parent.s_pool.check_etab_credential(cred_user, rne) 275 # on vérifie que l'identifiant n'est pas modifié 276 if dico_modifs == {}: 277 return 1,u('ok') 278 if 'rne' in dico_modifs.keys(): 279 return 0,u('modification du rne interdit') 280 # construction de la requête SQL de modification 281 query=["update etablissements set "] 282 params = [] 283 for cle in dico_modifs.keys(): 284 query.append(str(cle)) 285 query.append("=E%s") 286 params.append(str(dico_modifs[cle])) 287 query.append(", ") 288 string_fin=""" where rne=%s""" 289 params.append(rne) 290 query="".join(query)[:-2] 291 query += string_fin 292 return self.dbpool.runOperation(query, params).addCallbacks(lambda x:(1,'ok'), db_client_failed)
293
294 - def xmlrpc_rech_etab(self,cred_user,d):
295 """Recherche multi-critères d'un établissement 296 select * from etablissements where nom_champ like '%%libelle%%' 297 { rne, libelle, cp, type, ville } 298 """ 299 # construction de la requête SQL de recherche 300 query=["select * from etablissements where "] 301 params = [] 302 for nom_champ in d.keys(): 303 if d[nom_champ] != "": 304 if nom_champ == 'type': 305 query.append(str(nom_champ) + " = %s and ") 306 params.append(int(d[nom_champ])) 307 else: 308 query.append(str(nom_champ) + " ilike E%s and ") 309 params.append(str(d[nom_champ])) 310 311 query = "".join(query)[:-4] 312 query += "order by RNE" 313 return self.dbpool.runQuery(query, params).addCallbacks(self._got_etabs, db_client_failed, callbackArgs=[cred_user])
314
315 - def xmlrpc_get_types(self,cred_user):
316 """Récupération des types d'établissement existants 317 """ 318 query = """select * from types_etab order by libelle""" 319 return self.dbpool.runQuery(query).addCallbacks(self._got_types,db_client_failed)
320 321
322 - def xmlrpc_add_type(self,cred_user,libelle):
323 """ajoute un type d'établissement dans la base de données""" 324 # on vérifie que les données obligatoires sont remplies 325 if (libelle): 326 query = """insert into types_etab (libelle) values (E%s)""" 327 # on effectue l'insertion (l'existence est à tester dans l'application cliente) 328 return self.dbpool.runOperation(query, (libelle,)).addCallbacks(lambda x:(1,'ok'), db_client_failed) 329 else: 330 # des attributs manquent 331 return 0,u('libellé manquant')
332
333 - def xmlrpc_del_type(self,cred_user,id_type):
334 """ajoute un type d'établissement dans la base de données""" 335 # on vérifie que les données obligatoires sont remplies 336 if (id_type): 337 query = """delete from types_etab where id=%s""" 338 # on effectue l'insertion (l'existence est à tester dans l'application cliente) 339 return self.dbpool.runOperation(query, (int(id_type),)).addCallbacks(lambda x:(1,'ok'), db_client_failed) 340 else: 341 # des attributs manquent 342 return 0,u('identifiant manquant')
343