Commit | Line | Data |
---|---|---|
30e64411 TN |
1 | #!/usr/bin/python |
2 | # -*- coding: utf-8 -*- | |
3 | ||
10a46ce2 | 4 | # |
65f02320 | 5 | # Un "Objet" dispose de tout ce qui est nécessaire pour extraire |
10a46ce2 TN |
6 | # les données (accès au MS-SQL) et pour en faire le rendu final |
7 | # (accès au système de template) | |
8 | # | |
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 ?) | |
b417907c | 11 | # et de les transformer en critères SQL (where, limit, order) |
30e64411 | 12 | |
10a46ce2 | 13 | # l'accès à MS-SQL |
30e64411 TN |
14 | from pymssql import connect |
15 | ||
10a46ce2 TN |
16 | # le système de template |
17 | from jinja import Environment, FileSystemLoader | |
f60ed9f0 | 18 | ejinja = Environment(loader=FileSystemLoader('/home/thomas/public_html/modeles/')) |
10a46ce2 TN |
19 | |
20 | # le système d'analyse des variables HTTP | |
30e64411 TN |
21 | from paste.request import parse_formvars |
22 | ||
10a46ce2 | 23 | # accès à la configuration (données pour la connexion MS-SQL) |
30e64411 TN |
24 | import sys |
25 | sys.path.append('/home/thomas/public_html/') | |
26 | import rest_config | |
27 | ||
10a46ce2 | 28 | |
65f02320 | 29 | class Objet(object): |
10a46ce2 | 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)""" |
d238c393 | 31 | |
30e64411 | 32 | def __init__(self, environ): |
b417907c | 33 | """Conserve l'environnement WSGI et traduction des variables HTTP (filtres) en SQL""" |
30e64411 TN |
34 | self.environ = environ |
35 | parse_formvars(environ) # extraction des variables de query_string et POST | |
36 | self.filters = environ['paste.parsed_formvars'][0].dict_of_lists() # puis traduction en dictionnaire {var1:[val1,val2], ...} | |
b417907c TN |
37 | # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where |
38 | sqlwhere = [] | |
39 | if hasattr(self,'accept_like_filters'): | |
40 | for filter in self.accept_like_filters: | |
41 | if filter in self.filters: | |
42 | or_list = [] | |
43 | for v in self.filters[filter]: | |
44 | or_list.append("%s like '%s'" % (filter,v.replace('*','%'))) | |
45 | sqlwhere.append('(' + ' or '.join(or_list) + ')') | |
46 | # TODO : ajouter ici filtres min_*/max_*, avant/apres | |
47 | self.sqlwhere = ' and '.join(sqlwhere) | |
48 | # filtrage : valeur en cas de limite ("top n" en ODBC), 200 maxi | |
49 | if 'limite' in self.filters: | |
50 | self.sqllimit = min( int(self.filters['limite'][0]), 200 ) | |
51 | else: | |
52 | self.sqllimit = 50 | |
53 | # TODO : ajouter filtres tri_asc/tri_desc | |
54 | self.sqlorder = '' | |
55 | ||
30e64411 | 56 | def template(self,template): |
10a46ce2 | 57 | """Retourne un environnement de rendu""" |
30e64411 | 58 | self.outputformat = self.environ['wsgiorg.routing_args'][1].get('format','xml') |
d238c393 TN |
59 | if not self.outputformat == 'debug': |
60 | modele = '%s.%s' % (template,self.outputformat) | |
61 | else: | |
62 | modele = 'debug' | |
63 | return ejinja.get_template( modele ) | |
64 | ||
30e64411 | 65 | def cursor(self): |
10a46ce2 | 66 | """Retourne un curseur vers la base de données""" |
30e64411 TN |
67 | if not hasattr(self,'db_connect'): |
68 | self.db_connect = connect(host=rest_config.host,user=rest_config.user,password=rest_config.password,database=rest_config.database) | |
69 | if not hasattr(self,'db_cursor'): | |
70 | self.db_cursor = self.db_connect.cursor() | |
71 | return self.db_cursor | |
d238c393 | 72 | |
30e64411 | 73 | def __del__(self): |
10a46ce2 TN |
74 | """Destructeur : coupe la connexion à MSSQL à la mort de l'objet""" |
75 | # (normalement ça se fait tout seul mais j'en suis pas sûr sûr) | |
30e64411 TN |
76 | if hasattr(self,'db_connect'): |
77 | db_connect.close() | |
78 | ||
d238c393 | 79 | # exception levée quand une requete SQL ne revoit rien |
65f02320 | 80 | class ObjetInconnu(Exception): |
ef44a84b TN |
81 | def __init__(self, type): |
82 | self.type = type | |
83 | def __str__(self): | |
84 | return self.type | |
85 |