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):
|
||||
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()
|
||||
|
|
|
@ -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))
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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');
|
||||
// }
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -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())}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue