factorisation gestion des filtres
[restcoda.git] / objetsql.py
index c4d3804..74bd55c 100644 (file)
@@ -8,7 +8,7 @@
 #
 # Il analyse également l'environnement WSGI afin d'en extraire
 # les données de filtrage (extrait des arguments de l'URL, après le ?)
-#
+# et de les transformer en critères SQL (where, limit, order)
 
 # l'accès à MS-SQL
 from pymssql import connect
@@ -29,10 +29,29 @@ import rest_config
 class ObjetSQL(object):
     """Objet de base : dispose d'un accès à MS-SQL (lire les données) et d'un accès à jinja (rendu des données)"""
     def __init__(self, environ):
-        """Conserve l'environnement WSGI et analyse les variables HTTP"""
+        """Conserve l'environnement WSGI et traduction des variables HTTP (filtres) en SQL"""
        self.environ = environ
         parse_formvars(environ)                                            # extraction des variables de query_string et POST
        self.filters = environ['paste.parsed_formvars'][0].dict_of_lists() # puis traduction en dictionnaire {var1:[val1,val2], ...}
+       # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
+        sqlwhere = []
+        if hasattr(self,'accept_like_filters'):
+           for filter in self.accept_like_filters:
+                if filter in self.filters:
+                   or_list = []
+                   for v in self.filters[filter]:
+                       or_list.append("%s like '%s'" % (filter,v.replace('*','%')))
+                    sqlwhere.append('(' + ' or '.join(or_list) + ')')
+       # TODO : ajouter ici filtres min_*/max_*, avant/apres 
+       self.sqlwhere = ' and '.join(sqlwhere)
+       # filtrage : valeur en cas de limite ("top n" en ODBC), 200 maxi
+       if 'limite' in self.filters:
+           self.sqllimit = min( int(self.filters['limite'][0]), 200 )
+       else:
+           self.sqllimit = 50
+       # TODO : ajouter filtres tri_asc/tri_desc
+       self.sqlorder = ''
+
     def template(self,template):
         """Retourne un environnement de rendu"""
         self.outputformat = self.environ['wsgiorg.routing_args'][1].get('format','xml')