factorisation gestion des filtres
authorThomas NOEL <thomas@new-dev.(none)>
Fri, 4 Jul 2008 16:58:56 +0000 (12:58 -0400)
committerThomas NOEL <thomas.noel@auf.org>
Fri, 4 Jul 2008 16:58:56 +0000 (12:58 -0400)
document.py
objetsql.py
utilisateur.py

index cf231f3..d2aac0f 100644 (file)
@@ -18,29 +18,10 @@ class Document(ObjetSQL):
         super(Document, self).__init__(environ)
         self.code_document = code_document
         self.prefix_template = prefix_template
-       # TODO : voir si on peut faire le filtrage dans "objetsql"
-       # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
-        sqlwhere = []
-       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 filtres min_*/max_*, avant/apres dans ce sqlwhere
-       self.sqlwhere = ''
-       for f in sqlwhere:
-           self.sqlwhere += ' and ' + f
-       # filtrage : valeur en cas de limite ("top n" en ODBC), 100 maxi
-       if 'limite' in self.filters:
-           self.sqllimit = min( int(self.filters['limite'][0]), 100 )
-       else:
-           self.sqllimit = 30
-       # filtrage : si aucun statut n'est spécifié, on prend "statut like non%"
-       if not 'statut' in self.filters:
-           self.sqlwhere += " and (statut like 'non%') "
-       # TODO : ajouter filtres tri_asc/tri_desc
-       self.sqlorder = ''
+        # filtrage : si aucun statut n'est spécifié, on prend "statut like non%"
+       if self.sqlwhere != '': self.sqlwhere = ' and ' + self.sqlwhere
+        if not 'statut' in self.filters:
+            self.sqlwhere = " and (statut like 'non%') " + self.sqlwhere
 
     def _get_index(self, code):
         """renvoie une liste de documents"""
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')
index 4f49585..f184361 100644 (file)
@@ -13,24 +13,6 @@ class utilisateur(ObjetSQL):
     accept_like_filters = [ 'code', 'nom', 'nom_connexion', 'implantation' ]
     def __init__(self, environ):
         super(utilisateur, self).__init__(environ)
-       # TODO : voir si on peut faire le filtrage dans "objetsql"
-       # filtrage : on extrait la liste des filtres "acceptes" pour en faire des where
-        sqlwhere = []
-       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 filtres min_*/max_*, avant/apres dans ce sqlwhere
-       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 _get_index(self):
         """renvoie une liste d'utilisateur"""