mirror of
https://github.com/wassname/pyramid_formalchemy.git
synced 2026-08-20 12:40:38 +08:00
add custom view registration
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user