more grid changes

This commit is contained in:
Lance Edgar 2012-08-06 14:55:48 -07:00
parent 230a0d7775
commit efd06fad4b
7 changed files with 53 additions and 47 deletions

View file

@ -56,6 +56,9 @@ class AlchemyGrid(Grid):
def __getattr__(self, attr):
return getattr(self._formalchemy_grid, attr)
def checkbox(self, row):
return tags.checkbox('check-'+row.uuid)
def column_header(self, field):
cls = ''
label = field.label()

View file

@ -56,6 +56,10 @@ class Grid(edbob.Object):
super(Grid, self).__init__(**kwargs)
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):
return literal('<th field="%s">%s</th>' % (field.name, field.label))

View file

@ -26,7 +26,7 @@
``edbob.pyramid.grids.search`` -- Grid Search Filters
"""
import re
from sqlalchemy import or_
from webhelpers.html import tags
from webhelpers.html import literal
@ -143,12 +143,20 @@ def filter_ilike(field):
built in for "ILIKE" queries applied to ``field``.
"""
return {
'lk':
lambda q, v: q.filter(field.ilike('%%%s%%' % v)) if v else q,
'nl':
lambda q, v: q.filter(~field.ilike('%%%s%%' % v)) if v else q,
}
def ilike(query, value):
if value:
query = query.filter(field.ilike('%%%s%%' % value))
return query
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):
@ -235,38 +243,23 @@ def get_search_form(request, filter_map, config):
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):
"""
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', [])
include_filter = re.compile(r'^include_filter_(.*)$')
for key in config:
m = include_filter.match(key)
if m and config[key]:
field = m.group(1)
if key.startswith('include_filter_') and config[key]:
field = key[15:]
if field in join_map and field not in joins:
query = join_map[field](query)
joins.append(field)
value = config.get(field)
if value:
f = filter_map[field][config['filter_type_'+field]]
query = f(query, value)
fmap = filter_map[field]
filt = fmap[config['filter_type_'+field]]
query = filt(query, value)
return query

View file

@ -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 table = $(this).parents('table:first');
table.find('tbody tr').each(function() {
$(this).find('td.checkbox input[type=checkbox]').attr('checked', checked);
if (checked) {
$(this).addClass('selected');
} else {
$(this).removeClass('selected');
}
// if (checked) {
// $(this).addClass('selected');
// } else {
// $(this).removeClass('selected');
// }
});
});

View file

@ -2,7 +2,7 @@
<table>
<thead>
<tr>
% if checkboxes:
% if grid.checkboxes:
<th class="checkbox">${h.checkbox('check-all')}</th>
% endif
% for field in grid.iter_fields():
@ -38,7 +38,8 @@
% if grid.pager:
<div class="pager">
<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 class="page-links">
${h.select('grid-page-count', grid.pager.items_per_page, grid.page_count_options())}

View file

@ -46,17 +46,18 @@ class AlchemyGridView(GridView):
def query(self):
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)
return grids.AlchemyGrid(
self.request, self.mapped_class, data, **kwargs)
self.request, self.mapped_class, self._data, **kwargs)
def grid(self, data):
return self.make_grid(data)
def grid(self):
return self.make_grid()
def __call__(self):
query = self.query()
grid = self.grid(query)
self._data = self.query()
grid = self.grid()
return grids.util.render_grid(grid)
@ -91,6 +92,7 @@ class SortableAlchemyGridView(AlchemyGridView):
return self.make_query()
def make_grid(self, **kwargs):
kwargs.setdefault('checkboxes', self.checkboxes)
kwargs.setdefault('partial_only', self.partial_only)
return grids.AlchemyGrid(
self.request, self.mapped_class, self._data,
@ -152,6 +154,7 @@ class SearchableAlchemyGridView(PagedAlchemyGridView):
query = Session.query(self.mapped_class)
query = grids.search.filter_query(
query, self._filter_config, self.filter_map(), join_map)
self._sort_config['joins'] = self._filter_config['joins']
query = grids.util.sort_query(
query, self._sort_config, self.sort_map(), join_map)
return query

View file

@ -39,9 +39,11 @@ class GridView(View):
route_url = None
renderer = None
permission = None
checkboxes = False
partial_only = False
def make_grid(self, **kwargs):
kwargs.setdefault('checkboxes', self.checkboxes)
kwargs.setdefault('partial_only', self.partial_only)
return grids.Grid(self.request, **kwargs)