add Grid pyramid view class

This commit is contained in:
Lance Edgar 2012-07-09 10:27:57 -05:00
parent e1abfa3e3f
commit 83321c8873

133
edbob/pyramid/views/grid.py Normal file
View file

@ -0,0 +1,133 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
################################################################################
#
# edbob -- Pythonic Software Framework
# Copyright © 2010-2012 Lance Edgar
#
# This file is part of edbob.
#
# edbob is free software: you can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# edbob is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
# more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with edbob. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
``edbob.pyramid.views.grid`` -- Base Grid View
"""
from edbob.pyramid import filters
from edbob.pyramid import forms
from edbob.pyramid import grids
from edbob.pyramid import Session
from edbob.util import requires_impl
class Grid(object):
@property
@requires_impl(is_property=True)
def mapped_class(self):
raise NotImplementedError
@property
@requires_impl(is_property=True)
def route_name(self):
raise NotImplementedError
@property
@requires_impl(is_property=True)
def route_prefix(self):
raise NotImplementedError
def __init__(self, request):
self.request = request
def make_filter_map(self, **kwargs):
return filters.get_filter_map(self.mapped_class, **kwargs)
def filter_map(self):
return self.make_filter_map()
def make_search_config(self, fmap, **kwargs):
return filters.get_search_config(self.route_name, self.request, fmap,
**kwargs)
def search_config(self, fmap):
return self.make_search_config(fmap)
def search_form(self, config):
return filters.get_search_form(config)
def make_sort_map(self, *args):
return grids.get_sort_map(self.mapped_class, names=args or None)
def sort_map(self):
return self.make_sort_map()
def make_grid_config(self, search, fmap, deletable=True, **kwargs):
return grids.get_grid_config(
self.route_name, self.request, search,
filter_map=fmap, deletable=deletable, **kwargs)
def grid_config(self, search, fmap):
return self.make_grid_config(search, fmap)
def make_query(self, config):
smap = self.sort_map()
q = Session.query(self.mapped_class)
q = filters.filter_query(q, config)
q = grids.sort_query(q, config, smap)
return q
def query(self, config):
return self.make_query(config)
def make_grid(self, data, config, gridurl=None, objurl=None, delurl=None):
if not gridurl:
gridurl = self.request.route_url(self.route_name)
if not objurl:
objurl = '%s.edit' % self.route_prefix
if not delurl:
delurl = '%s.delete' % self.route_prefix
g = forms.AlchemyGrid(
self.mapped_class, data, config,
gridurl=gridurl, objurl=objurl, delurl=delurl)
return g
def grid(self, data, config):
g = self.make_grid(data, config)
g.configure(readonly=True)
return g
def __call__(self):
fmap = self.filter_map()
config = self.search_config(fmap)
search = self.search_form(config)
config = self.grid_config(search, fmap)
grid = grids.get_pager(self.query, config)
g = self.grid(grid, config)
grid = g.render(class_='clickable %s' % self.mapped_class.__name__)
return grids.render_grid(self.request, grid, search)
@classmethod
def add_route(cls, config, route_name, url_prefix, template_prefix=None, permission=None):
if not template_prefix:
template_prefix = url_prefix
if not permission:
permission = route_name
config.add_route(route_name, url_prefix)
config.add_view(cls, route_name=route_name, renderer='%s/index.mako' % template_prefix,
permission=permission, http_cache=0)