improve Crud view

This commit is contained in:
Lance Edgar 2012-08-15 09:31:57 -07:00
parent 7805018f13
commit 30991b5076

View file

@ -28,8 +28,8 @@
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from edbob.pyramid import forms
from edbob.pyramid import Session from edbob.pyramid import Session
from edbob.pyramid.forms.formalchemy.fieldset import FieldSet
from edbob.util import requires_impl from edbob.util import requires_impl
@ -50,6 +50,10 @@ class Crud(object):
def mapped_class(self): def mapped_class(self):
pass pass
@property
def crud_title(self):
return self.mapped_class.__name__
@property @property
@requires_impl(is_property=True) @requires_impl(is_property=True)
def home_route(self): def home_route(self):
@ -68,7 +72,12 @@ class Crud(object):
kwargs['action_url'] = self.request.current_route_url() kwargs['action_url'] = self.request.current_route_url()
if 'home_url' not in kwargs: if 'home_url' not in kwargs:
kwargs['home_url'] = self.home_url kwargs['home_url'] = self.home_url
return forms.make_fieldset(model, **kwargs)
kwargs.setdefault('session', Session())
fs = FieldSet(model, **kwargs)
fs.create = model is self.mapped_class
fs.update = not fs.create
return fs
def fieldset(self, obj): def fieldset(self, obj):
return self.make_fieldset(obj) return self.make_fieldset(obj)
@ -88,20 +97,21 @@ class Crud(object):
fs.rebind(data=self.request.params) fs.rebind(data=self.request.params)
if fs.validate(): if fs.validate():
result = None
fs.sync() fs.sync()
result = self.post_sync(fs) Session.add(fs.model)
if not result: Session.flush()
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'))
result = self.post_sync(fs)
if result: if result:
return result return result
# Session.add(fs.model)
# Session.flush()
if fs.create:
self.flash_create(fs.model)
else:
self.flash_update(fs.model)
if self.request.params.get('add-another') == '1': if self.request.params.get('add-another') == '1':
return HTTPFound(location=self.request.current_route_url()) return HTTPFound(location=self.request.current_route_url())
@ -133,11 +143,29 @@ class Crud(object):
uuid = self.request.matchdict['uuid'] uuid = self.request.matchdict['uuid']
model = Session.query(self.mapped_class).get(uuid) if uuid else None model = Session.query(self.mapped_class).get(uuid) if uuid else None
assert model assert model
result = self.pre_delete(model)
if result:
return result
Session.delete(model) Session.delete(model)
self.request.session.flash("The %s has been deleted." % Session.flush() # Don't set flash message if delete fails.
self.mapped_class.__name__) self.flash_delete(model)
return HTTPFound(location=self.home_url) return HTTPFound(location=self.home_url)
def flash_create(self, model):
self.request.session.flash("%s \"%s\" has been created." %
(self.crud_title, model))
def flash_delete(self, model):
self.request.session.flash("%s \"%s\" has been deleted." %
(self.crud_title, model))
def flash_update(self, model):
self.request.session.flash("%s \"%s\" has been updated." %
(self.crud_title, model))
def pre_delete(self, model):
pass
@classmethod @classmethod
def add_routes(cls, config): def add_routes(cls, config):
route_name_prefix = cls.route_prefix or cls.mapped_class.__name__.lower() route_name_prefix = cls.route_prefix or cls.mapped_class.__name__.lower()