mode debug : demander le format .debug
[restcoda.git] / objet.py
CommitLineData
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
14from pymssql import connect
15
10a46ce2
TN
16# le système de template
17from jinja import Environment, FileSystemLoader
f60ed9f0 18ejinja = Environment(loader=FileSystemLoader('/home/thomas/public_html/modeles/'))
10a46ce2
TN
19
20# le système d'analyse des variables HTTP
30e64411
TN
21from paste.request import parse_formvars
22
10a46ce2 23# accès à la configuration (données pour la connexion MS-SQL)
30e64411
TN
24import sys
25sys.path.append('/home/thomas/public_html/')
26import rest_config
27
10a46ce2 28
65f02320 29class 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 80class ObjetInconnu(Exception):
ef44a84b
TN
81 def __init__(self, type):
82 self.type = type
83 def __str__(self):
84 return self.type
85