From d886a393c12cef33f9bf8fb865281c9116c658b3 Mon Sep 17 00:00:00 2001 From: banderson Date: Sun, 10 Mar 2013 00:21:26 -0700 Subject: [PATCH 1/7] allow filtering grids by non-string columns --- fa/jquery/pyramid/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fa/jquery/pyramid/__init__.py b/fa/jquery/pyramid/__init__.py index 351837e..8c20054 100755 --- a/fa/jquery/pyramid/__init__.py +++ b/fa/jquery/pyramid/__init__.py @@ -114,6 +114,7 @@ def update_grid(self, grid, *args, **kwargs): for field in grid.render_fields.values(): metadata = dict(search=0, sortable=1, id=field.key, name=field.key) searchoptions = dict(sopt=['eq', 'cn']) + limitedsearch = False if field.is_relation: metadata.update(width=100, sortable=0) elif isinstance(field.type, (utils.Color, utils.Slider)): @@ -125,10 +126,18 @@ def update_grid(self, grid, *args, **kwargs): metadata.update(search=1) elif isinstance(field.type, (fatypes.Date, fatypes.Integer)): metadata.update(width=70, align='center') + metadata.update(search=1) + limitedsearch = True elif isinstance(field.type, fatypes.DateTime): metadata.update(width=120, align='center') + metadata.update(search=1) + limitedsearch = True elif isinstance(field.type, fatypes.Boolean): metadata.update(width=30, align='center') + metadata.update(search=1) + limitedsearch = True + if limitedsearch: + searchoptions = dict(sopt=['eq']) if metadata['search']: metadata['searchoptions'] = searchoptions metadata = dict(json=dumps(metadata)) From 747523509e87a4297b587dbaef370f896a5b28c2 Mon Sep 17 00:00:00 2001 From: banderson Date: Sun, 10 Mar 2013 00:30:02 -0700 Subject: [PATCH 2/7] change version number --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3593782..68831de 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup, find_packages -version = '0.9.5' +version = '0.9.5-bluej100' long_description = open("README.txt").read() long_description += """ From cabe83d33019126274a2bcac1cca84b5f1c95191 Mon Sep 17 00:00:00 2001 From: banderson Date: Sun, 10 Mar 2013 00:38:08 -0700 Subject: [PATCH 3/7] allow filtering by not-equals --- fa/jquery/pyramid/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fa/jquery/pyramid/__init__.py b/fa/jquery/pyramid/__init__.py index 8c20054..d4a8a14 100755 --- a/fa/jquery/pyramid/__init__.py +++ b/fa/jquery/pyramid/__init__.py @@ -113,7 +113,7 @@ def update_grid(self, grid, *args, **kwargs): metadatas = ('width', 'align', 'fixed', 'search', 'stype', 'searchoptions') for field in grid.render_fields.values(): metadata = dict(search=0, sortable=1, id=field.key, name=field.key) - searchoptions = dict(sopt=['eq', 'cn']) + searchoptions = dict(sopt=['eq', 'ne', 'cn']) limitedsearch = False if field.is_relation: metadata.update(width=100, sortable=0) @@ -137,7 +137,7 @@ def update_grid(self, grid, *args, **kwargs): metadata.update(search=1) limitedsearch = True if limitedsearch: - searchoptions = dict(sopt=['eq']) + searchoptions = dict(sopt=['eq', 'ne']) if metadata['search']: metadata['searchoptions'] = searchoptions metadata = dict(json=dumps(metadata)) From aac26eae6512e15cc4195de0629f60b031960e78 Mon Sep 17 00:00:00 2001 From: banderson Date: Sun, 10 Mar 2013 00:43:55 -0700 Subject: [PATCH 4/7] allow filtering by not-equals --- fa/jquery/pyramid/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fa/jquery/pyramid/__init__.py b/fa/jquery/pyramid/__init__.py index d4a8a14..0940141 100755 --- a/fa/jquery/pyramid/__init__.py +++ b/fa/jquery/pyramid/__init__.py @@ -78,6 +78,8 @@ def get_page(self, **kwargs): if op == 'cn': value = '%%%s%%' % value filter = field.ilike(value) + else if op == 'ne': + filter = field!=value else: filter = field==value collection = collection.filter(filter) From e30fbd979c5140719172e54c030817035e9bcffa Mon Sep 17 00:00:00 2001 From: banderson Date: Sun, 10 Mar 2013 00:48:38 -0700 Subject: [PATCH 5/7] allow filtering by not-equals --- fa/jquery/pyramid/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fa/jquery/pyramid/__init__.py b/fa/jquery/pyramid/__init__.py index 0940141..8f73758 100755 --- a/fa/jquery/pyramid/__init__.py +++ b/fa/jquery/pyramid/__init__.py @@ -78,7 +78,7 @@ def get_page(self, **kwargs): if op == 'cn': value = '%%%s%%' % value filter = field.ilike(value) - else if op == 'ne': + elif op == 'ne': filter = field!=value else: filter = field==value From 8e8ac11ed332c25291383d5325ad93eace5fbf61 Mon Sep 17 00:00:00 2001 From: Braden Anderson Date: Sun, 10 Mar 2013 01:05:22 -0700 Subject: [PATCH 6/7] revert version change --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 68831de..3593782 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ from setuptools import setup, find_packages -version = '0.9.5-bluej100' +version = '0.9.5' long_description = open("README.txt").read() long_description += """ From c6d69c5f57208e070861766925e6a2fe616b913b Mon Sep 17 00:00:00 2001 From: banderson Date: Mon, 11 Mar 2013 01:41:24 -0600 Subject: [PATCH 7/7] enable jqGrid multipleSearch --- fa/jquery/pyramid/__init__.py | 35 ++++++++++++++++++++++++-------- fa/jquery/resources/fa.jqgrid.js | 2 +- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/fa/jquery/pyramid/__init__.py b/fa/jquery/pyramid/__init__.py index 8f73758..a56fca3 100755 --- a/fa/jquery/pyramid/__init__.py +++ b/fa/jquery/pyramid/__init__.py @@ -25,6 +25,9 @@ from fa.jquery.renderers import ellipsys import logging +import json +from sqlalchemy import or_, and_ + _ = TranslationStringFactory('fa_jquery') class ModelView(Base): @@ -73,21 +76,35 @@ def get_page(self, **kwargs): if 'searchField' in params: field = fields.get(params['searchField'], None) if field: - op = params['searchOper'] - value = params['searchString'] - if op == 'cn': - value = '%%%s%%' % value - filter = field.ilike(value) - elif op == 'ne': - filter = field!=value - else: - filter = field==value + filter = self.get_page_search_filter(field, params['searchOper'], params['searchString']) collection = collection.filter(filter) + if 'filters' in params: + filters = json.loads(params['filters']) + clauses = [] + for rule in filters['rules']: + field = fields.get(rule['field'], None) + if field: + filter = self.get_page_search_filter(field, rule['op'], rule['data']) + clauses.append(filter) + if filters['groupOp'] == 'AND': + collection = collection.filter(and_(*clauses)) + else: + collection = collection.filter(or_(*clauses)) kwargs.update(collection=collection) if 'items_per_page' not in kwargs: kwargs.update(items_per_page=int(self.request.GET.get('rows', 20))) return Base.get_page(self, **kwargs) + def get_page_search_filter(self, field, op, value): + if op == 'cn': + value = '%%%s%%' % value + filter = field.ilike(value) + elif op == 'ne': + filter = field!=value + else: + filter = field==value + return filter + def render_xhr_format(self, fs=None, **kwargs): resp = Base.render_xhr_format(self, fs=fs, **kwargs) if fs and self.request.POST and 'field' not in self.request.GET: diff --git a/fa/jquery/resources/fa.jqgrid.js b/fa/jquery/resources/fa.jqgrid.js index 60c3338..1432d5a 100644 --- a/fa/jquery/resources/fa.jqgrid.js +++ b/fa/jquery/resources/fa.jqgrid.js @@ -31,7 +31,7 @@ $.fa.extend({ options['pager_id'] = '#'+pager.attr('id'); table.jqGrid(settings); table.jqGrid('navGrid', options.pager_id, - {search:true}); + {search:true}, {},{},{},{multipleSearch:true}); $('#add_'+table.attr('id')) .unbind('click') .click(function() { editRow(); });