Jun 20, 2011
Pyramid CRUD sprint summary
Pyramid CRUD sprint is over. It was an amazing event thanks to Gaël Pasgrimaud and Patrick Gerken. We have been sprinting in Redturtle's office to improve pyramid_formalchemy and fa.jquery. We have archived most of the sprint goals!
Patrick was working on the first two tasks:
It can be used to add a skeleton to an existing project or to create a new project. If you create a new project, you must first install pyramid_formalchemy in your python environment, either with pip:
$ pip install pyramid_formalchemy
or with easy_install:
$ easy_install pyramid_formalchemy
Only after that, the paster template becomes available. The template was made with the idea that it can be used to extend existing applications. It does not create an app for you. The provided template works well with pyramid_alchemy, pyramid_routesalchemy and akhet. To bootstrap an application, call paster like that:
$ paster create -t akhet -t pyramid_fa myapp
The application is created by akhet, akhet does not know about pyramid_formalchemy, and pyramid_formalchemy cannot modify the app configuration. So you have to do this by hand. First, you must add the install dependency like explained earlier. Second, you must add the following line in the main method that returns the wsgi app, directly after Configurator has been created (The example assumes that the Configurator instance is stored under the name “config”):
... config.include(myapp.fainit) ...
To add the minimum configuration to an existing application, you should be able to run:
$ paster create -t pyramid_fa myapp
All files that paster creates are prefixed with fa, and should not interfere with existing code.
Next tasks were handled by Gaël:
Action are basically links or input button. By default there is only one category buttons which are the forms buttons but you can add some categories like this:
>>> from pyramid_formalchemy.views import ModelView >>> from pyramid_formalchemy import actions >>> class MyView(ModelView): ... actions_categories = ('buttons', 'custom_actions') ... defaults_actions = actions.defaults_actions.copy() ... defaults_actions.update(edit_custom_actions=Actions())
Where myactions is an Actions instance
You can also customize the actions per Model:
>>> from sqlalchemy import Column, Integer >>> from sqlalchemy.ext.declarative import declarative_base >>> Base = declarative_base() >>> class MyArticle(Base): ... __tablename__ = 'myarticles' ... edit_buttons = Actions() ... id = Column(Integer, primary_key=True)
The available actions are: listing, new, edit
But you can add your own:
>>> from pyramid_formalchemy.views import ModelView >>> from pyramid_formalchemy import actions >>> class MyView(ModelView): ... actions.action() ... def extra(self): ... # do your stuff ... return self.render(**kw)
Yes, pyramid_formalchemy is now i18n! You need to add to your pipeline:
[app:pyramid] ... default_locale_name = en available_languages = fr en
and that's it! Right now we have english and french translations but others are coming.
I was working on the first three tasks:
This was one of the main sprint tasks - to have a possibility to customize CRUD views per model. You can register them simply like that:
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')
and per Model:
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')
formalchemy_model_view is an extension for config.add_view so you can use all view specific kwargs.
We were able to finish simple implementation of autocomplete widget. It's not yet fully documented but it will be released in pyramid_formalchemy 0.4. Here is how you use it:
from pyramid_formalchemy.renderers import pyramid_autocomplete User.group.set(renderer=pyramid_autocomplete(filter_by='name'))
where User is your fieldset and group is your relation field; filter_by parameter is the SQLAlchemy column you want to filter (autocomplete) on.
We have provided four events:
There are also two more specific render evnts:
You can use pyramid_formalchemy.events.subscriber decorator to use them:
from pyramid_formalchemy import events from pyramidapp.models import Foo @events.subscriber([Foo, events.IBeforeValidateEvent]) def before_foo_validate(context, event): #do your stuff here
It was a very productive four days. Thanks again for all your help. We should release new versions of pyramid_formalchemy and fa.jquery in the following days. If you don't want to wait - grab the development versions on github.
You can find more sprint photos here - http://www.flickr.com/photos/tags/crudsprint2011