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 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
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
137 cursor.executemany("insert into types_etab (libelle) values (%(miss)s)", dict_miss)
138 cursor.close()
139 cx.commit()
140
141 num_types = self._load_types(cx)
142 cx.close()
143
144
145 for etab in data:
146 rne = etab[0]
147
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
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
170 if (rne and libelle and type_etab):
171
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
175 return self.dbpool.runOperation(query, params).addCallbacks(self._add_etab, db_client_failed,callbackArgs=[rne, cred_user])
176 else:
177
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
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
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
197 """supprime un établissement"""
198 self.parent.s_pool.check_etab_credential(cred_user, rne)
199
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
204 """supprime l'établissement dans la base de données"""
205 if len(data) > 0:
206
207 return 0, u("Suppression impossible, il existe des serveurs rattachés à cet établissement")
208
209
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
220 os.unlink('/etc/uucp/serveurs'+os.sep+sysfile)
221
222 conf_uucp.remove('sysfile /etc/uucp/serveurs/'+sysfile+'\n')
223 except:
224
225 pass
226
227
228 try:
229
230 file_pwd = open('/etc/uucp/passwd_zephir','r')
231 pwd_uucp = file_pwd.readlines()
232 file_pwd.close()
233
234 for line in pwd_uucp:
235 if line.startswith(rne+'-'):
236 pwd_uucp.remove(line)
237
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
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
256 """supprime l'arborescence de l'établissement"""
257 etab_dir = os.path.abspath(config.PATH_ZEPHIR)+'/conf/'+rne
258
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
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
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
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
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
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
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
323 """ajoute un type d'établissement dans la base de données"""
324
325 if (libelle):
326 query = """insert into types_etab (libelle) values (E%s)"""
327
328 return self.dbpool.runOperation(query, (libelle,)).addCallbacks(lambda x:(1,'ok'), db_client_failed)
329 else:
330
331 return 0,u('libellé manquant')
332
334 """ajoute un type d'établissement dans la base de données"""
335
336 if (id_type):
337 query = """delete from types_etab where id=%s"""
338
339 return self.dbpool.runOperation(query, (int(id_type),)).addCallbacks(lambda x:(1,'ok'), db_client_failed)
340 else:
341
342 return 0,u('identifiant manquant')
343