diff --git a/pyramid_formalchemy/__init__.py b/pyramid_formalchemy/__init__.py index 68695fd..f830575 100644 --- a/pyramid_formalchemy/__init__.py +++ b/pyramid_formalchemy/__init__.py @@ -1,19 +1,23 @@ # -*- coding: utf-8 -*- -def include(config): +def includeme(config): """include formalchemy's zcml""" - config.load_zcml('pyramid.includes:configure.zcml') - config.load_zcml('pyramid_formalchemy:configure.zcml') - config.load_zcml('pyramid_formalchemy:view.zcml') + config.add_static_view('fa_admin', 'pyramid_formalchemy:static') + config.add_directive('formalchemy_admin', 'pyramid_formalchemy.formalchemy_admin') def include_jquery(config): """include formalchemy and fa.jquery's zcml """ - config.load_zcml('pyramid.includes:configure.zcml') - config.load_zcml('pyramid_formalchemy:configure.zcml') - config.load_zcml('fa.jquery:configure.zcml') + config.add_static_view('fa_admin', 'fa.jquery:static') -def configure(config, models=None, forms=None, session_factory=None, package=None, prefix='/admin', use_jquery=True): + +def formalchemy_admin(config, route_name, + factory='pyramid_formalchemy.resources.Models', + view='pyramid_formalchemy.views.ModelView', + package=None, models=None, forms=None, session_factory=None): """configure formalchemy's admin interface""" + + kw = dict(route_name=route_name, view=view) + if models: models = config.maybe_dotted(models) if forms: @@ -29,19 +33,88 @@ def configure(config, models=None, forms=None, session_factory=None, package=Non if not session_factory: session_factory = config.maybe_dotted('%s.models.DBSession' % package) - config.registry.settings.update({ - 'fa.models': models, - 'fa.forms': forms, - 'fa.session_factory': session_factory, - }) + factory_args = { + '__models__': models, + '__forms__': forms, + '__session_factory__': session_factory, + '__fa_route_name__': route_name, + } - prefix = prefix.rstrip('/') - if not prefix: - prefix = '/' + factory = config.maybe_dotted(factory) + + factory = type('%s_%s' % (factory.__name__, route_name), (factory,), factory_args) + + config.add_route(route_name, '%s/*traverse' % route_name, + factory=factory) + + config.add_view(context=factory, + renderer='pyramid_formalchemy:templates/admin/models.pt', + attr='models', + request_method='GET', + permission='view', + **kw) + + config.add_view(context='pyramid_formalchemy.resources.ModelListing', + renderer='pyramid_formalchemy:templates/admin/listing.pt', + attr='listing', + request_method='GET', + permission='view', + **kw) + + config.add_view(context='pyramid_formalchemy.resources.ModelListing', + renderer='pyramid_formalchemy:templates/admin/new.pt', + name='new', + attr='new', + request_method='GET', + permission='new', + **kw) + config.add_view(context='pyramid_formalchemy.resources.ModelListing', + renderer='pyramid_formalchemy:templates/admin/new.pt', + attr='create', + request_method='POST', + permission='new', + **kw) + + config.add_view(context='pyramid_formalchemy.resources.Model', + renderer='pyramid_formalchemy:templates/admin/edit.pt', + name='edit', + attr='edit', + request_method='GET', + permission='edit', + **kw) + config.add_view(context='pyramid_formalchemy.resources.Model', + renderer='pyramid_formalchemy:templates/admin/edit.pt', + name='edit', + attr='update', + request_method='POST', + permission='edit', + **kw) + config.add_view(context='pyramid_formalchemy.resources.Model', + renderer='json', + attr='update', + request_method='POST', + permission='edit', + **kw) + + config.add_view(context='pyramid_formalchemy.resources.Model', + renderer='pyramid_formalchemy:templates/admin/edit.pt', + name='delete', + attr='delete', + request_method='POST', + permission='delete', + **kw) + config.add_view(context='pyramid_formalchemy.resources.Model', + renderer='pyramid_formalchemy:templates/admin/edit.pt', + attr='delete', + request_method='DELETE', + permission='delete', + **kw) + + config.add_view(context='pyramid_formalchemy.resources.Model', + renderer='pyramid_formalchemy:templates/admin/show.pt', + request_method='GET', + permission='view', + name='', + attr='show', + **kw) - if use_jquery: - config.add_route('fa_admin', '%s/*traverse' % prefix, - factory='pyramid_formalchemy.resources.AdminView') - else: - config.add_route('fa_admin', '%s/*traverse' % prefix, - factory='pyramid_formalchemy.resources.AdminView') diff --git a/pyramid_formalchemy/configure.zcml b/pyramid_formalchemy/configure.zcml deleted file mode 100644 index 940a647..0000000 --- a/pyramid_formalchemy/configure.zcml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/pyramid_formalchemy/resources.py b/pyramid_formalchemy/resources.py index c1e9e5a..5d2180b 100644 --- a/pyramid_formalchemy/resources.py +++ b/pyramid_formalchemy/resources.py @@ -1,12 +1,25 @@ # -*- coding: utf-8 -*- -class AdminView(object): - def __init__(self, request): +class Base(object): + + def __init__(self, request, name): + self.__name__ = name + self.__parent__ = None self.request = request + if hasattr(self, '__fa_route_name__'): + request.forms = self.__forms__ + request.model = self.__models__ + request.route_name = self.__fa_route_name__ + request.session_factory = self.__session_factory__ + +class Models(Base): + + def __init__(self, request): + Base.__init__(self, request, None) request.model_name = None request.model_id = None request.format = 'html' - self.__parent__ = self.__name__ = None + def __getitem__(self, item): if item in ('json', 'xhr'): self.request.format = item @@ -15,25 +28,25 @@ class AdminView(object): model.__parent__ = self return model -class ModelListing(object): +class ModelListing(Base): + def __init__(self, request, name): - self.request = request + Base.__init__(self, request, name) request.model_name = name - self.__name__ = name - self.__parent__ = None + def __getitem__(self, item): if item in ('json', 'xhr'): self.request.format = item return self if item in ('new',): raise KeyError() - model = ModelItem(self.request, item) + model = Model(self.request, item) model.__parent__ = self return model -class ModelItem(object): +class Model(Base): + def __init__(self, request, name): + Base.__init__(self, request, name) request.model_id = name - self.__name__ = name - self.__parent__ = None diff --git a/pyramid_formalchemy/templates/admin/listing.pt b/pyramid_formalchemy/templates/admin/listing.pt index a0ae26a..fcbe0bb 100644 --- a/pyramid_formalchemy/templates/admin/listing.pt +++ b/pyramid_formalchemy/templates/admin/listing.pt @@ -5,7 +5,7 @@

+ tal:attributes="href request.route_url(request.route_name, traverse='%s/new' % request.model_name)"> ${F_('New')} ${model_name} diff --git a/pyramid_formalchemy/templates/admin/master.pt b/pyramid_formalchemy/templates/admin/master.pt index 4ac20b7..2200071 100644 --- a/pyramid_formalchemy/templates/admin/master.pt +++ b/pyramid_formalchemy/templates/admin/master.pt @@ -26,7 +26,7 @@ + tal:attributes="href request.route_url(request.route_name, traverse=request.model_name)"> ${F_('Cancel')} diff --git a/pyramid_formalchemy/templates/admin/models.pt b/pyramid_formalchemy/templates/admin/models.pt index ac0ed9b..2a57b57 100644 --- a/pyramid_formalchemy/templates/admin/models.pt +++ b/pyramid_formalchemy/templates/admin/models.pt @@ -3,7 +3,7 @@

-
diff --git a/pyramid_formalchemy/templates/admin/new.pt b/pyramid_formalchemy/templates/admin/new.pt index 1941bcf..a06b8cb 100644 --- a/pyramid_formalchemy/templates/admin/new.pt +++ b/pyramid_formalchemy/templates/admin/new.pt @@ -2,7 +2,7 @@
diff --git a/pyramid_formalchemy/templates/mytemplate.pt b/pyramid_formalchemy/templates/mytemplate.pt deleted file mode 100644 index 076856b..0000000 --- a/pyramid_formalchemy/templates/mytemplate.pt +++ /dev/null @@ -1,76 +0,0 @@ - - - - The Pyramid Web Application Development Framework - - - - - - - - - - -
-
-
-
pyramid
-
-
-
-
-

- Welcome to ${project}, an application generated by
- the Pyramid web application development framework. -

-
-
-
-
-
-

Search documentation

- - - - -
- -
-
-
- - - \ No newline at end of file diff --git a/pyramid_formalchemy/view.zcml b/pyramid_formalchemy/view.zcml deleted file mode 100644 index f71f2e7..0000000 --- a/pyramid_formalchemy/view.zcml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pyramid_formalchemy/views.py b/pyramid_formalchemy/views.py index 5ce1da9..746e35c 100644 --- a/pyramid_formalchemy/views.py +++ b/pyramid_formalchemy/views.py @@ -46,11 +46,9 @@ class ModelView(object): def __init__(self, context, request): self.context = context self.request = request - self.settings = request.registry.settings - self.model = self.settings['fa.models'] - self.forms = self.settings.get('fa.forms', None) - self.FieldSet = self.settings.get('fa.fieldset', FieldSet) - self.Grid = self.settings.get('fa.grid', Grid) + + self.FieldSet = FieldSet + self.Grid = Grid @property def model_name(self): @@ -61,22 +59,22 @@ class ModelView(object): return None def route_url(self, *args): - return self.request.route_url('fa_admin', traverse='/'.join([str(a) for a in args])) + return self.request.route_url(self.request.route_name, traverse='/'.join([str(a) for a in args])) def Session(self): """return a Session object. You **must** override this.""" - return self.settings['fa.session_factory']() + return self.request.session_factory() def models(self, **kwargs): """Models index page""" request = self.request models = {} - if isinstance(self.model, list): - for model in self.model: + if isinstance(request.model, list): + for model in request.model: key = model.__name__ models[key] = self.route_url(key, request.format) else: - for key, obj in self.model.__dict__.iteritems(): + for key, obj in request.model.__dict__.iteritems(): if not key.startswith('_'): if Document is not None: try: @@ -95,32 +93,33 @@ class ModelView(object): return self.render(models=models) def get_model(self): - if isinstance(self.model, list): - for model in self.model: + request = self.request + if isinstance(request.model, list): + for model in request.model: if model.__name__ == self.model_name: return model - elif hasattr(self.model, self.model_name): - return getattr(self.model, self.model_name) + elif hasattr(request.model, self.model_name): + return getattr(request.model, self.model_name) raise NotFound() def get_fieldset(self, id): - if self.forms and hasattr(self.forms, self.model_name): - fs = getattr(self.forms, self.model_name) + if request.forms and hasattr(request.forms, self.model_name): + fs = getattr(request.forms, self.model_name) fs.engine = fs.engine or self.engine return id and fs.bind(self.get(id)) or fs raise KeyError(self.model_name) def get_add_fieldset(self): - if self.forms and hasattr(self.forms, '%sAdd' % self.model_name): - fs = getattr(self.forms, '%sAdd' % self.model_name) + if request.forms and hasattr(request.forms, '%sAdd' % self.model_name): + fs = getattr(request.forms, '%sAdd' % self.model_name) fs.engine = fs.engine or self.engine return fs return self.get_fieldset(id=None) def get_grid(self): model_name = self.model_name - if self.forms and hasattr(self.forms, '%sGrid' % model_name): - g = getattr(self.forms, '%sGrid' % model_name) + if request.forms and hasattr(request.forms, '%sGrid' % model_name): + g = getattr(request.forms, '%sGrid' % model_name) g.engine = g.engine or self.engine g.readonly = True self.update_grid(g) @@ -191,7 +190,7 @@ class ModelView(object): data = dict(fields=fields) pk = _pk(fs.model) if pk: - data['item_url'] = request.route_url('fa_admin', traverse='%s/json/%s' % (self.model_name, pk)) + data['item_url'] = self.route_url(self.model_name, 'json', pk) else: data = {} data.update(kwargs) @@ -265,8 +264,9 @@ class ModelView(object): fs.engine = fs.engine or self.engine return fs """ - if self.forms and hasattr(self.forms, self.model_name): - fs = getattr(self.forms, self.model_name) + request = self.request + if request.forms and hasattr(request.forms, self.model_name): + fs = getattr(request.forms, self.model_name) fs.engine = fs.engine or self.engine return id and fs.bind(self.get(id)) or fs fs = self.FieldSet(self.get(id)) @@ -300,9 +300,10 @@ class ModelView(object): self.update_grid(grid) return grid """ + request = self.request model_name = self.model_name - if self.forms and hasattr(self.forms, '%sGrid' % model_name): - g = getattr(self.forms, '%sGrid' % model_name) + if request.forms and hasattr(request.forms, '%sGrid' % model_name): + g = getattr(request.forms, '%sGrid' % model_name) g.engine = g.engine or self.engine g.readonly = True self.update_grid(g) diff --git a/pyramidapp/pyramidapp/__init__.py b/pyramidapp/pyramidapp/__init__.py index 6e274d1..c990135 100644 --- a/pyramidapp/pyramidapp/__init__.py +++ b/pyramidapp/pyramidapp/__init__.py @@ -3,9 +3,6 @@ from sqlalchemy import engine_from_config from pyramidapp.models import initialize_sql -# import -import pyramid_formalchemy - def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ @@ -17,8 +14,8 @@ def main(global_config, **settings): view_renderer='templates/mytemplate.pt') # pyramid_formalchemy's configuration - pyramid_formalchemy.include(config) - pyramid_formalchemy.configure(config, package='pyramidapp') + config.include('pyramid_formalchemy') + config.formalchemy_admin('admin', package='pyramidapp') return config.make_wsgi_app() diff --git a/setup.py b/setup.py index ad2bb72..5ed44a9 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ here = os.path.abspath(os.path.dirname(__file__)) README = open(os.path.join(here, 'README.txt')).read() CHANGES = open(os.path.join(here, 'CHANGES.txt')).read() -requires = ['pyramid', 'WebError', 'FormAlchemy'] +requires = ['pyramid>=1.0', 'WebError', 'FormAlchemy'] setup(name='pyramid_formalchemy', version='0.0',