more grid changes
This commit is contained in:
parent
230a0d7775
commit
efd06fad4b
7 changed files with 53 additions and 47 deletions
|
@ -56,6 +56,9 @@ class AlchemyGrid(Grid):
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
return getattr(self._formalchemy_grid, attr)
|
return getattr(self._formalchemy_grid, attr)
|
||||||
|
|
||||||
|
def checkbox(self, row):
|
||||||
|
return tags.checkbox('check-'+row.uuid)
|
||||||
|
|
||||||
def column_header(self, field):
|
def column_header(self, field):
|
||||||
cls = ''
|
cls = ''
|
||||||
label = field.label()
|
label = field.label()
|
||||||
|
|
|
@ -56,6 +56,10 @@ class Grid(edbob.Object):
|
||||||
super(Grid, self).__init__(**kwargs)
|
super(Grid, self).__init__(**kwargs)
|
||||||
self.request = request
|
self.request = request
|
||||||
|
|
||||||
|
def add_column(self, name, label, callback):
|
||||||
|
self.extra_columns.append(
|
||||||
|
edbob.Object(name=name, label=label, callback=callback))
|
||||||
|
|
||||||
def column_header(self, field):
|
def column_header(self, field):
|
||||||
return literal('<th field="%s">%s</th>' % (field.name, field.label))
|
return literal('<th field="%s">%s</th>' % (field.name, field.label))
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
``edbob.pyramid.grids.search`` -- Grid Search Filters
|
``edbob.pyramid.grids.search`` -- Grid Search Filters
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import re
|
from sqlalchemy import or_
|
||||||
|
|
||||||
from webhelpers.html import tags
|
from webhelpers.html import tags
|
||||||
from webhelpers.html import literal
|
from webhelpers.html import literal
|
||||||
|
@ -143,12 +143,20 @@ def filter_ilike(field):
|
||||||
built in for "ILIKE" queries applied to ``field``.
|
built in for "ILIKE" queries applied to ``field``.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return {
|
def ilike(query, value):
|
||||||
'lk':
|
if value:
|
||||||
lambda q, v: q.filter(field.ilike('%%%s%%' % v)) if v else q,
|
query = query.filter(field.ilike('%%%s%%' % value))
|
||||||
'nl':
|
return query
|
||||||
lambda q, v: q.filter(~field.ilike('%%%s%%' % v)) if v else q,
|
|
||||||
}
|
def not_ilike(query, value):
|
||||||
|
if value:
|
||||||
|
query = query.filter(or_(
|
||||||
|
field == None,
|
||||||
|
~field.ilike('%%%s%%' % value),
|
||||||
|
))
|
||||||
|
return query
|
||||||
|
|
||||||
|
return {'lk': ilike, 'nl': not_ilike}
|
||||||
|
|
||||||
|
|
||||||
def get_filter_config(name, request, filter_map, **kwargs):
|
def get_filter_config(name, request, filter_map, **kwargs):
|
||||||
|
@ -235,38 +243,23 @@ def get_search_form(request, filter_map, config):
|
||||||
return search
|
return search
|
||||||
|
|
||||||
|
|
||||||
# def filter_query(query, config, join_map={}):
|
|
||||||
# filter_map = config['filter_map']
|
|
||||||
# if config.get('search'):
|
|
||||||
# search = config['search'].config
|
|
||||||
# joins = config.setdefault('joins', [])
|
|
||||||
# include_filter = re.compile(r'^include_filter_(.*)$')
|
|
||||||
# for key in search:
|
|
||||||
# m = include_filter.match(key)
|
|
||||||
# if m and search[key]:
|
|
||||||
# field = m.group(1)
|
|
||||||
# if field in join_map and field not in joins:
|
|
||||||
# query = join_map[field](query)
|
|
||||||
# joins.append(field)
|
|
||||||
# value = search.get(field)
|
|
||||||
# if value:
|
|
||||||
# f = filter_map[field][search['filter_type_'+field]]
|
|
||||||
# query = f(query, value)
|
|
||||||
# return query
|
|
||||||
|
|
||||||
|
|
||||||
def filter_query(query, config, filter_map, join_map):
|
def filter_query(query, config, filter_map, join_map):
|
||||||
|
"""
|
||||||
|
Filters ``query`` according to ``config`` and ``filter_map``. ``join_map``
|
||||||
|
is used, if necessary, to join additional tables to the base query. The
|
||||||
|
filtered query is returned.
|
||||||
|
"""
|
||||||
|
|
||||||
joins = config.setdefault('joins', [])
|
joins = config.setdefault('joins', [])
|
||||||
include_filter = re.compile(r'^include_filter_(.*)$')
|
|
||||||
for key in config:
|
for key in config:
|
||||||
m = include_filter.match(key)
|
if key.startswith('include_filter_') and config[key]:
|
||||||
if m and config[key]:
|
field = key[15:]
|
||||||
field = m.group(1)
|
|
||||||
if field in join_map and field not in joins:
|
if field in join_map and field not in joins:
|
||||||
query = join_map[field](query)
|
query = join_map[field](query)
|
||||||
joins.append(field)
|
joins.append(field)
|
||||||
value = config.get(field)
|
value = config.get(field)
|
||||||
if value:
|
if value:
|
||||||
f = filter_map[field][config['filter_type_'+field]]
|
fmap = filter_map[field]
|
||||||
query = f(query, value)
|
filt = fmap[config['filter_type_'+field]]
|
||||||
|
query = filt(query, value)
|
||||||
return query
|
return query
|
||||||
|
|
|
@ -269,16 +269,16 @@ $(function() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('div.grid.checkable table thead th.checkbox input[type=checkbox]').live('click', function() {
|
$('div.grid table thead th.checkbox input[type=checkbox]').live('click', function() {
|
||||||
var checked = $(this).is(':checked');
|
var checked = $(this).is(':checked');
|
||||||
var table = $(this).parents('table:first');
|
var table = $(this).parents('table:first');
|
||||||
table.find('tbody tr').each(function() {
|
table.find('tbody tr').each(function() {
|
||||||
$(this).find('td.checkbox input[type=checkbox]').attr('checked', checked);
|
$(this).find('td.checkbox input[type=checkbox]').attr('checked', checked);
|
||||||
if (checked) {
|
// if (checked) {
|
||||||
$(this).addClass('selected');
|
// $(this).addClass('selected');
|
||||||
} else {
|
// } else {
|
||||||
$(this).removeClass('selected');
|
// $(this).removeClass('selected');
|
||||||
}
|
// }
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
% if checkboxes:
|
% if grid.checkboxes:
|
||||||
<th class="checkbox">${h.checkbox('check-all')}</th>
|
<th class="checkbox">${h.checkbox('check-all')}</th>
|
||||||
% endif
|
% endif
|
||||||
% for field in grid.iter_fields():
|
% for field in grid.iter_fields():
|
||||||
|
@ -38,7 +38,8 @@
|
||||||
% if grid.pager:
|
% if grid.pager:
|
||||||
<div class="pager">
|
<div class="pager">
|
||||||
<p class="showing">
|
<p class="showing">
|
||||||
${grid.pager.pager('showing $first_item thru $last_item of $item_count (page $page of $page_count)')}
|
showing ${grid.pager.first_item} thru ${grid.pager.last_item} of ${grid.pager.item_count}
|
||||||
|
(page ${grid.pager.page} of ${grid.pager.page_count})
|
||||||
</p>
|
</p>
|
||||||
<p class="page-links">
|
<p class="page-links">
|
||||||
${h.select('grid-page-count', grid.pager.items_per_page, grid.page_count_options())}
|
${h.select('grid-page-count', grid.pager.items_per_page, grid.page_count_options())}
|
||||||
|
|
|
@ -46,17 +46,18 @@ class AlchemyGridView(GridView):
|
||||||
def query(self):
|
def query(self):
|
||||||
return self.make_query()
|
return self.make_query()
|
||||||
|
|
||||||
def make_grid(self, data, **kwargs):
|
def make_grid(self, **kwargs):
|
||||||
|
kwargs.setdefault('checkboxes', self.checkboxes)
|
||||||
kwargs.setdefault('partial_only', self.partial_only)
|
kwargs.setdefault('partial_only', self.partial_only)
|
||||||
return grids.AlchemyGrid(
|
return grids.AlchemyGrid(
|
||||||
self.request, self.mapped_class, data, **kwargs)
|
self.request, self.mapped_class, self._data, **kwargs)
|
||||||
|
|
||||||
def grid(self, data):
|
def grid(self):
|
||||||
return self.make_grid(data)
|
return self.make_grid()
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
query = self.query()
|
self._data = self.query()
|
||||||
grid = self.grid(query)
|
grid = self.grid()
|
||||||
return grids.util.render_grid(grid)
|
return grids.util.render_grid(grid)
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,6 +92,7 @@ class SortableAlchemyGridView(AlchemyGridView):
|
||||||
return self.make_query()
|
return self.make_query()
|
||||||
|
|
||||||
def make_grid(self, **kwargs):
|
def make_grid(self, **kwargs):
|
||||||
|
kwargs.setdefault('checkboxes', self.checkboxes)
|
||||||
kwargs.setdefault('partial_only', self.partial_only)
|
kwargs.setdefault('partial_only', self.partial_only)
|
||||||
return grids.AlchemyGrid(
|
return grids.AlchemyGrid(
|
||||||
self.request, self.mapped_class, self._data,
|
self.request, self.mapped_class, self._data,
|
||||||
|
@ -152,6 +154,7 @@ class SearchableAlchemyGridView(PagedAlchemyGridView):
|
||||||
query = Session.query(self.mapped_class)
|
query = Session.query(self.mapped_class)
|
||||||
query = grids.search.filter_query(
|
query = grids.search.filter_query(
|
||||||
query, self._filter_config, self.filter_map(), join_map)
|
query, self._filter_config, self.filter_map(), join_map)
|
||||||
|
self._sort_config['joins'] = self._filter_config['joins']
|
||||||
query = grids.util.sort_query(
|
query = grids.util.sort_query(
|
||||||
query, self._sort_config, self.sort_map(), join_map)
|
query, self._sort_config, self.sort_map(), join_map)
|
||||||
return query
|
return query
|
||||||
|
|
|
@ -39,9 +39,11 @@ class GridView(View):
|
||||||
route_url = None
|
route_url = None
|
||||||
renderer = None
|
renderer = None
|
||||||
permission = None
|
permission = None
|
||||||
|
checkboxes = False
|
||||||
partial_only = False
|
partial_only = False
|
||||||
|
|
||||||
def make_grid(self, **kwargs):
|
def make_grid(self, **kwargs):
|
||||||
|
kwargs.setdefault('checkboxes', self.checkboxes)
|
||||||
kwargs.setdefault('partial_only', self.partial_only)
|
kwargs.setdefault('partial_only', self.partial_only)
|
||||||
return grids.Grid(self.request, **kwargs)
|
return grids.Grid(self.request, **kwargs)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue