add Crud pyramid view class

This commit is contained in:
Lance Edgar 2012-07-09 10:27:30 -05:00
parent 19dc86f4a9
commit e1abfa3e3f

View file

@ -37,9 +37,117 @@ from pyramid.httpexceptions import HTTPFound, HTTPException
# from rattail.db.perms import has_permission
# from rattail.pyramid.forms.formalchemy import Grid
from edbob.db import Base
from edbob.pyramid import forms
from edbob.pyramid import Session
from edbob.util import requires_impl
class Crud(object):
def __init__(self, request):
self.request = request
@property
@requires_impl(is_property=True)
def mapped_class(self):
raise NotImplementedError
@property
@requires_impl(is_property=True)
def list_route(self):
raise NotImplementedError
@property
def list_url(self):
return self.request.route_url(self.list_route)
def make_fieldset(self, model, **kwargs):
if 'action_url' not in kwargs:
kwargs['action_url'] = self.request.current_route_url()
if 'list_url' not in kwargs:
kwargs['list_url'] = self.list_url
return forms.make_fieldset(model, **kwargs)
def fieldset(self, obj):
"""
Creates, configures and returns the fieldset.
.. note::
You more than likely will want to override this.
"""
fs = self.make_fieldset(obj)
return fs
def crud(self, obj):
fs = self.fieldset(obj)
if not fs.readonly and self.request.POST:
fs.rebind(data=self.request.params)
if fs.validate():
with transaction.manager:
fs.sync()
Session.add(fs.model)
Session.flush()
self.request.session.flash('%s "%s" has been %s.' % (
fs.crud_title, fs.get_display_text(),
'updated' if fs.edit else 'created'))
if self.request.params.get('add-another') == '1':
return HTTPFound(location=self.request.current_route_url())
return HTTPFound(location=self.list_url)
# TODO: This probably needs attention.
if not fs.edit:
fs.allow_continue = True
return {'fieldset': fs, 'crud': True}
def new(self):
return self.crud(self.mapped_class)
def edit(self):
uuid = self.request.matchdict['uuid']
obj = Session.query(self.mapped_class).get(uuid) if uuid else None
assert obj
return self.crud(obj)
def delete(self):
uuid = self.request.matchdict['uuid']
obj = Session.query(self.mapped_class).get(uuid) if uuid else None
assert obj
with transaction.manager:
Session.delete(obj)
return HTTPFound(location=self.request.route_url(self.list_route))
@classmethod
def add_routes(cls, config, route_prefix, url_prefix, template_prefix=None, permission_prefix=None):
"""
Add standard routes (i.e. 'new', 'edit' and 'delete') for the mapped
class to the config object.
"""
if not template_prefix:
template_prefix = url_prefix
if not permission_prefix:
permission_prefix = route_prefix
config.add_route('%s.new' % route_prefix, '%s/new' % url_prefix)
config.add_view(cls, attr='new', route_name='%s.new' % route_prefix, renderer='%s/crud.mako' % template_prefix,
permission='%s.create' % permission_prefix, http_cache=0)
config.add_route('%s.edit' % route_prefix, '%s/{uuid}/edit' % url_prefix)
config.add_view(cls, attr='edit', route_name='%s.edit' % route_prefix, renderer='%s/crud.mako' % template_prefix,
permission='%s.edit' % permission_prefix, http_cache=0)
config.add_route('%s.delete' % route_prefix, '%s/{uuid}/delete' % url_prefix)
config.add_view(cls, attr='delete', route_name='%s.delete' % route_prefix,
permission='%s.delete' % permission_prefix, http_cache=0)
def crud(request, cls, fieldset_factory, home=None, delete=None, post_sync=None, pre_render=None):
"""
Adds a common CRUD mechanism for objects.