add custom view registration

This commit is contained in:
Andrew Mleczko
2011-06-17 12:48:51 +02:00
parent 92a1821598
commit 2a96f45f16
3 changed files with 52 additions and 3 deletions
+24
View File
@@ -7,6 +7,30 @@ def includeme(config):
config.add_static_view('fa_admin', 'pyramid_formalchemy:static')
config.add_directive('formalchemy_admin', 'pyramid_formalchemy.formalchemy_admin')
config.add_directive('formalchemy_model', 'pyramid_formalchemy.formalchemy_model')
config.add_directive('formalchemy_model_view', 'pyramid_formalchemy.formalchemy_model_view')
config.registry.pyramid_formalchemy_views = {}
def formalchemy_model_view(config, route_name,
model=None,
name='',
view='pyramid_formalchemy.views.ModelView',
context='pyramid_formalchemy.resources.Model', **kwargs):
"""custom model view registration"""
model = config.maybe_dotted(model)
context = config.maybe_dotted(context)
mixin_name = '%sCustom%s_%s_%s' % (model.__name__, context.__name__,
route_name, kwargs.get('request_method','GET'))
factory = type(mixin_name, (context,), {})
config.registry.pyramid_formalchemy_views[factory.__name__] = factory
kw = dict(route_name=route_name, view=view)
kw.update(kwargs)
config.add_view(context=factory,
name=name,
**kw)
def formalchemy_model(config, route_name,
factory='pyramid_formalchemy.resources.ModelListing',
+9 -3
View File
@@ -78,9 +78,11 @@ class Models(Base):
self.request.model_name = item
model_class = self.get_model()
factory = type('%s_CustomFactory' % (model_class.__name__,), (ModelListing, model_class), {})
mixin_name = '%sCustom%s_%s_%s' % (model_class.__name__, ModelListing.__name__,
self.request.route_name, self.request.method)
mixin = type(mixin_name, (ModelListing, ), {})
factory = self.request.registry.pyramid_formalchemy_views.get(mixin.__name__, mixin)
model = factory(self.request, item)
model.__parent__ = self
if hasattr(model, '__acl__'):
# propagate permissions to parent
@@ -108,7 +110,11 @@ class ModelListing(Base):
if item in ('json', 'xhr'):
self.request.format = item
return self
factory = type('%s_CustomFactory' % (self.request.model_class.__name__,), (Model, self.request.model_class), {})
mixin_name = '%sCustom%s_%s_%s' % (self.request.model_class.__name__, Model.__name__,
self.request.route_name, self.request.method)
mixin = type(str(mixin_name), (Model, ), {})
factory = self.request.registry.pyramid_formalchemy_views.get(mixin.__name__, mixin)
try:
model = factory(self.request, item)
except NotFound:
+19
View File
@@ -22,6 +22,25 @@ def main(global_config, **settings):
# register an admin UI for a single model
config.formalchemy_model('foo', package='pyramidapp', model='pyramidapp.models.Foo')
# register custom model listing
config.formalchemy_model_view('admin',
model='pyramidapp.models.Foo',
context='pyramid_formalchemy.resources.ModelListing',
renderer='templates/foolisting.pt',
attr='listing',
request_method='GET',
permission='view')
# register custom model view
config.formalchemy_model_view('admin',
model='pyramidapp.models.Foo',
context='pyramid_formalchemy.resources.Model',
name='',
renderer='templates/fooshow.pt',
attr='show',
request_method='GET',
permission='view')
return config.make_wsgi_app()