1
2
3
4
5
6
7
8
9
10
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
19 import psycopg2 as PgSQL
20
21 import sys,os,shutil
22
24 """serveur XMLRPC zephir pour la gestion des établissements
25 """
26
28
29 self.dbpool = db_connect()
30 self.dbpool.noisy = 0
31 XMLRPC.__init__(self)
32 self.parent = parent
33
34
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
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
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
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
85 query = """select * from etablissements"""
86 return self.dbpool.runQuery(query).addCallbacks(self._got_etabs,db_client_failed,callbackArgs=[cred_user])
87
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
95 """lit les types établissement et renvoie un dictionnaire
96 """
97 cursor=cx.cursor()
98
99 cursor.execute("""select id,libelle from types_etab""")
100 result = cursor.fetchall()
101 cursor.close()
102 num_types = {}
103
104 for row in result:
105 num_types[row[1].upper()]=row[0]
106
107 return num_types
108
109
111 """importe des établissements depuis un fichier csv"""
112
113
114
115 query = """select rne from etablissements"""
116 return self.dbpool.runQuery(query).addCallbacks(self._import_etab,db_client_failed,callbackArgs=[cred_user,data])
117
119
120 existants = [rne[0] for rne in liste_rne]
121 nouveaux = []
122 cx = PgSQL.connect(database=config.DB_NAME,user=config.DB_USER,password=config.DB_PASSWD)
123 num_types = self._load_types(cx)
124 cx.close()
125 errors=[]
126
127 missing=[]
128 for etab in data:
129 libelle = etab[3]
130 if libelle.strip() == "":
131 libelle = "INDEFINI"
132 etab[3] = libelle
133 if libelle.upper() not in num_types.keys():
134 if libelle.upper() not in missing:
135 missing.append(libelle.upper())
136
137 if missing != []:
138 dict_miss = []
139 for miss in missing:
140 dict_miss.append({'miss':miss})
141 cx = PgSQL.connect(database=config.DB_NAME,user=config.DB_USER,password=config.DB_PASSWD)
142 cursor=cx.cursor()
143
144 cursor.executemany("insert into types_etab (libelle) values (%(miss)s)", dict_miss)
145 cursor.close()
146 cx.commit()
147
148 num_types = self._load_types(cx)
149 cx.close()
150
151
152 for etab in data:
153 rne = etab[0]
154
155 libelle = etab[3] + " " + etab[4]
156 cp = etab[5]
157 adresse = " "
158 ville = etab[6]
159 telephone = etab[9]
160 fax = etab[8]
161 mail = etab[7]
162 responsable = "inconnu"
163 remarques = ""
164
165 if num_types.has_key(etab[3].upper()):
166 type_etab = num_types[etab[3].upper()]
167 if rne in existants:
168
169 update_infos = {'libelle':libelle,
170 'adresse':adresse,
171 'ville':ville,
172 'cp':cp,
173 'tel':telephone,
174 'fax':fax,
175 'mail':mail,
176 'responsable':responsable,
177 'remarques':remarques,
178 'type':type_etab}
179 res = self.xmlrpc_edit_etab(cred_user, rne, update_infos)
180
181
182 existants.remove(rne)
183 else:
184 try:
185 res = self.xmlrpc_add_etab(cred_user,rne,libelle,adresse,ville,cp,telephone,fax,mail,responsable,remarques,type_etab)
186 nouveaux.append([rne, libelle])
187 except:
188 log.msg("Erreur à la création de l'établissement %s" % rne)
189 traceback.print_exc()
190 if errors != []:
191 return 0,u('erreur : %s' % errors)
192 else:
193 return 1, u((existants, nouveaux))
194
195
196 - def xmlrpc_add_etab(self,cred_user,rne,libelle,adresse,ville,cp,telephone,fax,mail,responsable,remarques,type_etab):
197 """ajoute un établissement"""
198
199 if (rne and libelle and type_etab):
200
201 query = """insert into etablissements values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
202 params = (rne, libelle, adresse, telephone, fax, mail, responsable, remarques, type_etab, ville.upper(), cp)
203
204 return self.dbpool.runOperation(query, params).addCallbacks(self._add_etab, db_client_failed,callbackArgs=[rne, cred_user])
205 else:
206
207 return 0,u('arguments manquants')
208
209 - def _add_etab(self,resultat, rne, cred_user):
210 """met en place l'arborescence zephir de l'établissement """
211
212 try:
213 self.parent.s_pool.check_etab_credential(cred_user, rne)
214 except:
215 log.msg("acces non permis , ajout d'une restriction")
216 self.parent.s_pool.add_restriction(cred_user,'rne',rne)
217
218 etab_dir = os.path.abspath(config.PATH_ZEPHIR)+'/conf/'+rne
219 try:
220 os.makedirs(etab_dir)
221 except:
222 return 0,u("erreur de création du répertoire de l'établissement")
223 else:
224 return 1,u(rne)
225
227 """supprime un établissement"""
228 self.parent.s_pool.check_etab_credential(cred_user, rne)
229
230 query = """select id from serveurs where rne=%s"""
231 return self.dbpool.runQuery(query, (rne,)).addCallbacks(self._del_etab, db_client_failed,callbackArgs=[rne])
232
234 """supprime l'établissement dans la base de données"""
235 if len(data) > 0:
236
237 return 0, u("Suppression impossible, il existe des serveurs rattachés à cet établissement")
238
239
240 try:
241 file_conf = open('/etc/uucp/config_zephir','r')
242 conf_uucp = file_conf.readlines()
243 file_conf.close()
244 except:
245 return 0, u("""erreur de lecture de /etc/uucp/config_zephir""")
246 try:
247 for sysfile in os.listdir('/etc/uucp/serveurs'):
248 if sysfile.startswith(rne+'-'):
249
250 os.unlink('/etc/uucp/serveurs'+os.sep+sysfile)
251
252 conf_uucp.remove('sysfile /etc/uucp/serveurs/'+sysfile+'\n')
253 except:
254
255 pass
256
257
258 try:
259
260 file_pwd = open('/etc/uucp/passwd_zephir','r')
261 pwd_uucp = file_pwd.readlines()
262 file_pwd.close()
263
264 for line in pwd_uucp:
265 if line.startswith(rne+'-'):
266 pwd_uucp.remove(line)
267
268 file_pwd = open('/etc/uucp/passwd_zephir','w')
269 file_pwd.writelines(pwd_uucp)
270 file_pwd.close()
271 except:
272 return 0, u("""erreur de mise à jour du fichier des mots de passe""")
273
274
275 try:
276 file_conf = open('/etc/uucp/config_zephir','w')
277 file_conf.writelines(conf_uucp)
278 file_conf.close()
279 except:
280 return 0, u("""erreur d'écriture dans /etc/uucp/config_zephir""")
281
282 query = """delete from etablissements where rne=%s"""
283 return self.dbpool.runOperation(query, (rne,)).addCallbacks(self._del_etab2, db_client_failed,callbackArgs=[rne])
284
286 """supprime l'arborescence de l'établissement"""
287 etab_dir = os.path.abspath(config.PATH_ZEPHIR)+'/conf/'+rne
288
289 try:
290 shutil.rmtree(etab_dir)
291 except:
292 return 0,u("""erreur de supression du répertoire de l'établissement""")
293 else:
294 log.msg("établissement %s supprimé" % rne)
295 return 1,u('ok')
296
297
299 """modification d'un établissement
300 cette fonction prend en compte un dictionnaire qui indique les
301 champs à modifier et leur nouvelle valeur. l'application cliente
302 doit s'assurer que ces champs existent dans la base
303 ex: zephir.etabs.edit_etab('R620001X',{'libelle':'bla bla','type':1})"""
304 self.parent.s_pool.check_etab_credential(cred_user, rne)
305
306 if dico_modifs == {}:
307 return 1,u('ok')
308 if 'rne' in dico_modifs.keys():
309 return 0,u('modification du rne interdit')
310
311 query=["update etablissements set "]
312 params = []
313 for cle in dico_modifs.keys():
314 query.append(str(cle))
315 query.append("=%s")
316 params.append(str(dico_modifs[cle]))
317 query.append(", ")
318 string_fin=""" where rne=%s"""
319 params.append(rne)
320 query="".join(query)[:-2]
321 query += string_fin
322 return self.dbpool.runOperation(query, params).addCallbacks(lambda x:(1,'ok'), db_client_failed)
323
325 """Recherche multi-critères d'un établissement
326 select * from etablissements where nom_champ like '%%libelle%%'
327 { rne, libelle, cp, type, ville }
328 """
329
330 query=["select * from etablissements where "]
331 params = []
332 for nom_champ in d.keys():
333 if d[nom_champ] != "":
334 if nom_champ == 'type':
335 query.append(str(nom_champ) + " = %s and ")
336 params.append(int(d[nom_champ]))
337 else:
338 query.append(str(nom_champ) + " ilike %s and ")
339 params.append(str(d[nom_champ]))
340
341 query = "".join(query)[:-4]
342 query += "order by RNE"
343 return self.dbpool.runQuery(query, params).addCallbacks(self._got_etabs, db_client_failed, callbackArgs=[cred_user])
344
346 """Récupération des types d'établissement existants
347 """
348 query = """select * from types_etab order by libelle"""
349 return self.dbpool.runQuery(query).addCallbacks(self._got_types,db_client_failed)
350
351
353 """ajoute un type d'établissement dans la base de données"""
354
355 if (libelle):
356 query = """insert into types_etab (libelle) values (%s)"""
357
358 return self.dbpool.runOperation(query, (libelle,)).addCallbacks(lambda x:(1,'ok'), db_client_failed)
359 else:
360
361 return 0,u('libellé manquant')
362
364 """ajoute un type d'établissement dans la base de données"""
365
366 if (id_type):
367 query = """delete from types_etab where id=%s"""
368
369 return self.dbpool.runOperation(query, (int(id_type),)).addCallbacks(lambda x:(1,'ok'), db_client_failed)
370 else:
371
372 return 0,u('identifiant manquant')
373