diff --git a/pyramid_formalchemy/__init__.py b/pyramid_formalchemy/__init__.py index 37c76a1..58efe68 100644 --- a/pyramid_formalchemy/__init__.py +++ b/pyramid_formalchemy/__init__.py @@ -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', diff --git a/pyramid_formalchemy/resources.py b/pyramid_formalchemy/resources.py index a8aa13c..a82a8ce 100644 --- a/pyramid_formalchemy/resources.py +++ b/pyramid_formalchemy/resources.py @@ -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: diff --git a/pyramidapp/pyramidapp/__init__.py b/pyramidapp/pyramidapp/__init__.py index e73ae23..147bc6f 100644 --- a/pyramidapp/pyramidapp/__init__.py +++ b/pyramidapp/pyramidapp/__init__.py @@ -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()