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