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 jinja
import Environment
, FileSystemLoader
18 ejinja
= Environment(loader
=FileSystemLoader('/home/thomas/public_html/templates/'))
20 # le système d'analyse des variables HTTP
21 from paste
.request
import parse_formvars
23 # accès à la configuration (données pour la connexion MS-SQL)
25 sys
.path
.append('/home/thomas/public_html/')
30 """Objet de base : dispose d'un accès à MS-SQL (lire les données) et d'un accès à jinja (rendu des données)"""
31 def __init__(self
, environ
):
32 """Conserve l'environnement WSGI et traduction des variables HTTP (filtres) en SQL"""
33 self
.environ
= environ
34 parse_formvars(environ
) # extraction des variables de query_string et POST
35 self
.filters
= environ
['paste.parsed_formvars'][0].dict_of_lists() # puis traduction en dictionnaire {var1:[val1,val2], ...}
36 # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
38 if hasattr(self
,'accept_like_filters'):
39 for filter in self
.accept_like_filters
:
40 if filter in self
.filters
:
42 for v
in self
.filters
[filter]:
43 or_list
.append("%s like '%s'" % (filter,v
.replace('*','%')))
44 sqlwhere
.append('(' + ' or '.join(or_list
) + ')')
45 # TODO : ajouter ici filtres min_*/max_*, avant/apres
46 self
.sqlwhere
= ' and '.join(sqlwhere
)
47 # filtrage : valeur en cas de limite ("top n" en ODBC), 200 maxi
48 if 'limite' in self
.filters
:
49 self
.sqllimit
= min( int(self
.filters
['limite'][0]), 200 )
52 # TODO : ajouter filtres tri_asc/tri_desc
55 def template(self
,template
):
56 """Retourne un environnement de rendu"""
57 self
.outputformat
= self
.environ
['wsgiorg.routing_args'][1].get('format','xml')
58 return ejinja
.get_template('%s.%s' % (template
,self
.outputformat
))
60 """Retourne un curseur vers la base de données"""
61 if not hasattr(self
,'db_connect'):
62 self
.db_connect
= connect(host
=rest_config
.host
,user
=rest_config
.user
,password
=rest_config
.password
,database
=rest_config
.database
)
63 if not hasattr(self
,'db_cursor'):
64 self
.db_cursor
= self
.db_connect
.cursor()
67 """Destructeur : coupe la connexion à MSSQL à la mort de l'objet"""
68 # (normalement ça se fait tout seul mais j'en suis pas sûr sûr)
69 if hasattr(self
,'db_connect'):
72 class ObjetInconnu(Exception):
73 def __init__(self
, type):