refactor config in the pyramid 1.0 way

This commit is contained in:
Gael Pasgrimaud
2011-02-11 22:57:00 +01:00
parent e6a08e20e5
commit 8f276954bf
12 changed files with 152 additions and 268 deletions
+95 -22
View File
@@ -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')
-9
View File
@@ -1,9 +0,0 @@
<?xml version="1.0"?>
<configure xmlns="http://pylonshq.com/pyramid">
<static
name="fa_admin"
path="pyramid_formalchemy:static"
/>
</configure>
+24 -11
View File
@@ -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
@@ -5,7 +5,7 @@
<table class="layout-grid" tal:content="structure fs.render()" />
<p>
<a class="ui-widget-header ui-widget-link ui-corner-all"
tal:attributes="href request.route_url('fa_admin', traverse='%s/new' % request.model_name)">
tal:attributes="href request.route_url(request.route_name, traverse='%s/new' % request.model_name)">
<span class="ui-icon ui-icon-circle-plus"></span>
${F_('New')} ${model_name}
</a>
@@ -26,7 +26,7 @@
<input type="submit" value="${F_('Save')}" />
</a>
<a class="ui-widget-header ui-widget-link ui-corner-all"
tal:attributes="href request.route_url('fa_admin', traverse=request.model_name)">
tal:attributes="href request.route_url(request.route_name, traverse=request.model_name)">
<span class="ui-icon ui-icon-circle-arrow-w"></span>
${F_('Cancel')}
</a>
@@ -3,7 +3,7 @@
<div metal:fill-slot="main">
<div tal:repeat="item models">
<div>
<a tal:attributes="href request.route_url('fa_admin', traverse=item)"
<a tal:attributes="href request.route_url(request.route_name, traverse=item)"
tal:content="item"></a>
</div>
</div>
+1 -1
View File
@@ -2,7 +2,7 @@
<body>
<div metal:fill-slot="main">
<form method="POST" enctype="multipart/form-data"
tal:attributes="action request.route_url('fa_admin', traverse=request.model_name)"
tal:attributes="action request.route_url(request.route_name, traverse=request.model_name)"
>
<div tal:content="structure fs.render()" />
<div metal:use-macro="main.macros['buttons']">
@@ -1,76 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
<head>
<title>The Pyramid Web Application Development Framework</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<meta name="keywords" content="python web application" />
<meta name="description" content="pyramid web application" />
<link rel="shortcut icon" href="${request.static_url('pyramid_formalchemy:static/favicon.ico')}" />
<link rel="stylesheet" href="${request.static_url('pyramid_formalchemy:static/pylons.css')}" type="text/css" media="screen" charset="utf-8" />
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Neuton&amp;subset=latin" type="text/css" media="screen" charset="utf-8" />
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Nobile:regular,italic,bold,bolditalic&amp;subset=latin" type="text/css" media="screen" charset="utf-8" />
<!--[if lte IE 6]>
<link rel="stylesheet" href="${request.static_url('pyramid_formalchemy:static/ie6.css')}" type="text/css" media="screen" charset="utf-8" />
<![endif]-->
</head>
<body>
<div id="wrap">
<div id="top">
<div class="top align-center">
<div><img src="${request.static_url('pyramid_formalchemy:static/pyramid.png')}" width="750" height="169" alt="pyramid"/></div>
</div>
</div>
<div id="middle">
<div class="middle align-center">
<p class="app-welcome">
Welcome to <span class="app-name">${project}</span>, an application generated by<br/>
the Pyramid web application development framework.
</p>
</div>
</div>
<div id="bottom">
<div class="bottom">
<div id="left" class="align-right">
<h2>Search documentation</h2>
<form method="get" action="http://docs.pylonshq.com/pyramid/dev/search.html">
<input type="text" id="q" name="q" value="" />
<input type="submit" id="x" value="Go" />
</form>
</div>
<div id="right" class="align-left">
<h2>Pyramid links</h2>
<ul class="links">
<li>
<a href="http://pylonshq.com">Pylons Website</a>
</li>
<li>
<a href="http://docs.pylonshq.com/pyramid/dev/#narrative-documentation">Narrative Documentation</a>
</li>
<li>
<a href="http://docs.pylonshq.com/pyramid/dev/#api-documentation">API Documentation</a>
</li>
<li>
<a href="http://docs.pylonshq.com/pyramid/dev/#tutorials">Tutorials</a>
</li>
<li>
<a href="http://docs.pylonshq.com/pyramid/dev/#change-history">Change History</a>
</li>
<li>
<a href="http://docs.pylonshq.com/pyramid/dev/#sample-applications">Sample Applications</a>
</li>
<li>
<a href="http://docs.pylonshq.com/pyramid/dev/#support-and-development">Support and Development</a>
</li>
<li>
<a href="irc://irc.freenode.net#pyramid">IRC Channel</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div id="footer">
<div class="footer">© Copyright 2008-2011, Agendaless Consulting.</div>
</div>
</body>
</html>
-115
View File
@@ -1,115 +0,0 @@
<?xml version="1.0"?>
<configure xmlns="http://pylonshq.com/pyramid">
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.AdminView"
view="pyramid_formalchemy.views.ModelView"
attr="models"
request_method="GET"
renderer="pyramid_formalchemy:templates/admin/models.pt"
/>
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelListing"
view="pyramid_formalchemy.views.ModelView"
attr="listing"
request_method="GET"
renderer="pyramid_formalchemy:templates/admin/listing.pt"
/>
<view
name="new"
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelListing"
view="pyramid_formalchemy.views.ModelView"
attr="new"
request_method="GET"
renderer="pyramid_formalchemy:templates/admin/new.pt"
/>
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelListing"
view="pyramid_formalchemy.views.ModelView"
attr="create"
request_method="POST"
renderer="pyramid_formalchemy:templates/admin/new.pt"
/>
<view
name="edit"
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="edit"
request_method="GET"
renderer="pyramid_formalchemy:templates/admin/edit.pt"
/>
<view
name="edit"
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="update"
request_method="POST"
renderer="pyramid_formalchemy:templates/admin/edit.pt"
/>
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="update"
request_method="POST"
renderer="json"
/>
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="update"
request_method="PUT"
renderer="json"
/>
<view
name="delete"
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="delete"
request_method="POST"
renderer="pyramid_formalchemy:templates/admin/edit.pt"
/>
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="delete"
request_method="DELETE"
renderer="pyramid_formalchemy:templates/admin/edit.pt"
/>
<view
name=""
route_name="fa_admin"
context="pyramid_formalchemy.resources.ModelItem"
view="pyramid_formalchemy.views.ModelView"
attr="show"
request_method="GET"
renderer="pyramid_formalchemy:templates/admin/show.pt"
/>
</configure>
+26 -25
View File
@@ -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)
+2 -5
View File
@@ -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()
+1 -1
View File
@@ -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',