event integration plus docs

This commit is contained in:
Andrew Mleczko
2011-06-17 18:04:47 +02:00
parent 5a26067255
commit ac6deaeb93
3 changed files with 42 additions and 4 deletions
+11
View File
@@ -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
===
+30 -4
View File
@@ -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')
+1
View File
@@ -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.