2 # -*- coding: utf-8 -*-
5 # Un "Objet" dispose de tout ce qui est nécessaire pour extraire
6 # les données (accès au MS-SQL) et pour en faire le rendu final
7 # (accès au système de template)
9 # Il analyse également l'environnement WSGI afin d'en extraire
10 # les données de filtrage (extrait des arguments de l'URL, après le ?)
11 # et de les transformer en critères SQL (where, limit, order)
14 from pymssql
import connect
16 # le système de template
17 from template
import ejinja
19 # le système d'analyse des variables HTTP
20 from paste
.request
import parse_formvars
22 # accès à la configuration (données pour la connexion MS-SQL)
24 sys
.path
.append('/home/thomas/public_html/')
28 """Objet de base : dispose d'un accès à MS-SQL (lire les données) et d'un accès à jinja (rendu des données)"""
30 def __init__(self
, environ
):
31 """Conserve l'environnement WSGI et traduction des variables HTTP (filtres) en SQL"""
32 self
.environ
= environ
33 parse_formvars(environ
) # extraction des variables de query_string et POST
34 self
.filters
= environ
['paste.parsed_formvars'][0].dict_of_lists() # puis traduction en dictionnaire {var1:[val1,val2], ...}
35 # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
37 if hasattr(self
,'accept_like_filters'):
38 for filter in self
.accept_like_filters
:
39 if filter in self
.filters
:
41 for v
in self
.filters
[filter]:
42 or_list
.append("%s like '%s'" % (filter,v
.replace('*','%')))
43 sqlwhere
.append('(' + ' or '.join(or_list
) + ')')
44 # TODO : ajouter ici filtres min_*/max_*, avant/apres
45 self
.sqlwhere
= ' and '.join(sqlwhere
)
46 # filtrage : valeur en cas de limite ("top n" en ODBC), 200 maxi
47 if 'limite' in self
.filters
:
48 self
.sqllimit
= min( int(self
.filters
['limite'][0]), 200 )
51 # TODO : ajouter filtres tri_asc/tri_desc
54 def template(self
,template
):
55 """Retourne un environnement de rendu"""
56 self
.outputformat
= self
.environ
['wsgiorg.routing_args'][1].get('format','xml')
57 if not self
.outputformat
== 'debug':
58 modele
= '%s.%s' % (template
,self
.outputformat
)
61 return ejinja
.get_template( modele
)
64 """Retourne un curseur vers la base de données"""
65 if not hasattr(self
,'db_connect'):
66 self
.db_connect
= connect(host
=rest_config
.host
,user
=rest_config
.user
,password
=rest_config
.password
,database
=rest_config
.database
)
67 if not hasattr(self
,'db_cursor'):
68 self
.db_cursor
= self
.db_connect
.cursor()
72 """Destructeur : coupe la connexion à MSSQL à la mort de l'objet"""
73 # (normalement ça se fait tout seul mais j'en suis pas sûr sûr)
74 if hasattr(self
,'db_connect'):
77 # exception levée quand une requete SQL ne revoit rien
78 class ObjetInconnu(Exception):
79 def __init__(self
, type):