gestion ObjetSQLInconnuError et debug SQL dispo dans le template
[restcoda.git] / utilisateur.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 #
5 # Classe pour un utilisateur
6 # (export de la vue auf_v_acces_users)
7
8 from objetsql import ObjetSQL, ObjetSQLInconnuError
9 from utils import dict_fetchone
10
11 class utilisateur(ObjetSQL):
12 """objet utilisateur CODA"""
13 accept_like_filters = [ 'code', 'nom', 'nom_connexion', 'implantation' ]
14 def __init__(self, environ):
15 super(utilisateur, self).__init__(environ)
16 # TODO : voir si on peut faire le filtrage dans "objetsql"
17 # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
18 sqlwhere = []
19 for filter in self.accept_like_filters:
20 if filter in self.filters:
21 or_list = []
22 for v in self.filters[filter]:
23 or_list.append("%s like '%s'" % (filter,v.replace('*','%')))
24 sqlwhere.append('(' + ' or '.join(or_list) + ')')
25 # TODO : ajouter filtres min_*/max_*, avant/apres dans ce sqlwhere
26 self.sqlwhere = ' and '.join(sqlwhere)
27 # filtrage : valeur en cas de limite ("top n" en ODBC), 200 maxi
28 if 'limite' in self.filters:
29 self.sqllimit = min( int(self.filters['limite'][0]), 200 )
30 else:
31 self.sqllimit = 50
32 # TODO : ajouter filtres tri_asc/tri_desc
33 self.sqlorder = ''
34
35 def _get_index(self):
36 """renvoie une liste d'utilisateur"""
37 # connexion a la base de données
38 cursor = self.cursor()
39 if self.sqlwhere != '': self.sqlwhere = ' where ' + self.sqlwhere
40 # extraction des données
41 request = "select top %d * from auf_v_acces_users %s order by date_connexion desc" % ( self.sqllimit, self.sqlwhere )
42 cursor.execute( request )
43 items = []
44 while 1:
45 item = dict_fetchone( cursor )
46 if item == None: break
47 items.append(item)
48 index = {}
49 index['filtres'] = self.filters
50 index['utilisateurs'] = items
51 index['requete_sql'] = request
52 return index
53
54 def _get_utilisateur(self,code):
55 """renvoie un utilisateur"""
56 cursor = self.cursor()
57 if self.sqlwhere != '': self.sqlwhere = ' and ' + self.sqlwhere
58 request = "select top 1 * from auf_v_acces_users where (code like '%s') %s" % (code, self.sqlwhere)
59 cursor.execute( request )
60 utilisateur = dict_fetchone(cursor)
61 if utilisateur == None:
62 raise ObjetSQLInconnuError('utilisateur')
63 utilisateur['requete_sql'] = request
64 return utilisateur
65
66 def index(self):
67 """renvoie une liste d'utilisateurs formatée"""
68 template = self.template('utilisateur-index') # préparation du modèle
69 index = self._get_index( ) # extraction des documents concernés
70 output = template.render( index ) # formattage via le modèle
71 return self.outputformat, output
72
73 def show(self):
74 """renvoie un utilisateur formaté"""
75 code = self.environ['wsgiorg.routing_args'][1]['id'].replace('*','%').upper()
76 template = self.template( 'utilisateur' )
77 utilisateur = self._get_utilisateur( code )
78 output = template.render( utilisateur )
79 return self.outputformat, output
80