From ac6deaeb93c04d1dcae4408aa2ada380057dbf2f Mon Sep 17 00:00:00 2001 From: Andrew Mleczko Date: Fri, 17 Jun 2011 18:04:47 +0200 Subject: [PATCH] event integration plus docs --- docs/index.txt | 11 ++++++++++ pyramid_formalchemy/views.py | 34 +++++++++++++++++++++++++++---- pyramidapp/pyramidapp/__init__.py | 1 + 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/docs/index.txt b/docs/index.txt index 6e2683a..97b03c8 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -118,6 +118,17 @@ You can also add an ``__acl__`` attribute to your model class: .. literalinclude:: ../pyramidapp/pyramidapp/models.py :pyobject: Bar +Event subscription +================== + +``pyramid_formalchemy`` provides four events: ``IBeforeValidateEvent``, +``IAfterSyncEvent``, ``IBeforeDeleteEvent`` and ``IBeforeRenderEvent``. +There are also two more specific render evnts: ``IBeforeShowRenderEvent`` +and ``IBeforeEditRenderEvent``. You can use ``pyramid_formalchemy.events.subscriber`` +decorator to subscribe: + +.. literalinclude:: ../pyramidapp/pyramidapp/events.py + Api === diff --git a/pyramid_formalchemy/views.py b/pyramid_formalchemy/views.py index 4be9245..31c96fb 100644 --- a/pyramid_formalchemy/views.py +++ b/pyramid_formalchemy/views.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import zope.component.event +from zope.interface import alsoProvides from webhelpers.paginate import Page from sqlalchemy.orm import class_mapper from formalchemy.fields import _pk @@ -12,7 +14,7 @@ from pyramid.security import has_permission from pyramid import httpexceptions as exc from pyramid.exceptions import NotFound from pyramid_formalchemy.utils import TemplateEngine -import logging +from pyramid_formalchemy import events try: from formalchemy.ext.couchdb import Document @@ -88,6 +90,14 @@ class ModelView(object): self.session.merge(fs.model) else: self.session.add(fs.model) + event = events.AfterSyncEvent(fs.model, fs, self.request) + zope.component.event.objectEventNotify(event) + + def validate(self, fs): + """validate fieldset""" + event = events.BeforeValidateEvent(fs.model, fs, self.request) + zope.component.event.objectEventNotify(event) + return fs.validate() def breadcrumb(self, fs=None, **kwargs): """return items to build the breadcrumb""" @@ -113,6 +123,7 @@ class ModelView(object): return meth(**kwargs) else: raise NotFound() + kwargs.update( main = get_renderer('pyramid_formalchemy:templates/admin/master.pt').implementation(), model_name=request.model_name, @@ -271,10 +282,10 @@ class ModelView(object): try: fs = fs.bind(data=data, session=self.session, request=request) - except Exception, e: + except Exception: # non SA forms fs = fs.bind(self.context.get_model(), data=data, session=self.session, request=request) - if fs.validate(): + if self.validate(fs): fs.sync() self.sync(fs) self.session.flush() @@ -293,6 +304,11 @@ class ModelView(object): id = self.request.model_id fs = self.get_fieldset(suffix='View', id=id) fs.readonly = True + + event = events.BeforeRenderEvent(self.request.model_instance, self.request, fs=fs) + alsoProvides(event, events.IBeforeShowRenderEvent) + zope.component.event.objectEventNotify(event) + return self.render(fs=fs, action='show', id=id) def new(self, **kwargs): @@ -303,6 +319,11 @@ class ModelView(object): def edit(self, id=None, **kwargs): id = self.request.model_id fs = self.get_fieldset(suffix='Edit', id=id) + + event = events.BeforeRenderEvent(self.request.model_instance, self.request, fs=fs) + alsoProvides(event, events.IBeforeEditRenderEvent) + zope.component.event.objectEventNotify(event) + return self.render(fs=fs, action='edit', id=id) def update(self, **kwargs): @@ -310,7 +331,7 @@ class ModelView(object): id = request.model_id fs = self.get_fieldset(suffix='Edit', id=id) fs = fs.bind(request=request) - if fs.validate(): + if self.validate(fs): fs.sync() self.sync(fs, id) self.session.flush() @@ -329,10 +350,15 @@ class ModelView(object): def delete(self, **kwargs): request = self.request record = request.model_instance + + event = events.BeforeDeleteEvent(record, self.request) + zope.component.event.objectEventNotify(event) + if record: self.session.delete(record) else: raise NotFound() + if request.format == 'html': if request.is_xhr or request.format == 'xhr': return Response(content_type='text/plain') diff --git a/pyramidapp/pyramidapp/__init__.py b/pyramidapp/pyramidapp/__init__.py index 147bc6f..6ee7931 100644 --- a/pyramidapp/pyramidapp/__init__.py +++ b/pyramidapp/pyramidapp/__init__.py @@ -2,6 +2,7 @@ from pyramid.config import Configurator from sqlalchemy import engine_from_config from pyramidapp.models import initialize_sql +from pyramidapp import events; events #pyflakes def main(global_config, **settings): """ This function returns a Pyramid WSGI application.