From e1abfa3e3f24161198f073bbc7c92b6d4e90fe6b Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 9 Jul 2012 10:27:30 -0500 Subject: [PATCH] add Crud pyramid view class --- edbob/pyramid/views/crud.py | 108 ++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/edbob/pyramid/views/crud.py b/edbob/pyramid/views/crud.py index 7e70f8d..b51b96e 100644 --- a/edbob/pyramid/views/crud.py +++ b/edbob/pyramid/views/crud.py @@ -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.