Merge pull request #7 from amleczko/master

pyramid autocomplete renderer
This commit is contained in:
Gael Pasgrimaud
2011-06-18 10:24:48 -07:00
3 changed files with 58 additions and 0 deletions
+11
View File
@@ -123,6 +123,7 @@ def formalchemy_admin(config, route_name,
request_method='GET',
permission='new',
**kw)
config.add_view(context='pyramid_formalchemy.resources.ModelListing',
renderer='pyramid_formalchemy:templates/admin/new.pt',
attr='create',
@@ -137,6 +138,7 @@ def formalchemy_admin(config, route_name,
request_method='GET',
permission='edit',
**kw)
config.add_view(context='pyramid_formalchemy.resources.Model',
renderer='pyramid_formalchemy:templates/admin/edit.pt',
name='edit',
@@ -144,6 +146,7 @@ def formalchemy_admin(config, route_name,
request_method='POST',
permission='edit',
**kw)
config.add_view(context='pyramid_formalchemy.resources.Model',
renderer='json',
name='',
@@ -159,6 +162,7 @@ def formalchemy_admin(config, route_name,
request_method='POST',
permission='delete',
**kw)
config.add_view(context='pyramid_formalchemy.resources.Model',
renderer='pyramid_formalchemy:templates/admin/edit.pt',
attr='delete',
@@ -174,3 +178,10 @@ def formalchemy_admin(config, route_name,
attr='show',
**kw)
config.add_view(context='pyramid_formalchemy.resources.ModelListing',
attr='autocomplete',
name='autocomplete',
request_method='GET',
permission='view',
**kw)
+38
View File
@@ -0,0 +1,38 @@
from formalchemy import fields
from formalchemy import helpers as h
from fa.jquery.renderers import jQueryFieldRenderer, alias
def PyramidAutocompleteFieldRenderer(filter_by='id', renderer=fields.IntegerFieldRenderer, **jq_options):
"""Use http://docs.jquery.com/UI/Autocomplete with pyramid"""
class Renderer(renderer):
def __init__(self, *args, **kwargs):
super(Renderer, self).__init__(*args, **kwargs)
self.field.render_opts['options'] = []
def update_options(self, options, kwargs):
autocomplete_model = self.field.relation_type().__name__
route_url = self.request.route_url(self.request.route_name,
traverse=(autocomplete_model,'autocomplete'))
kwargs['source'] = route_url
def render(self, **kwargs):
filter_by = self.jq_options.get('filter_by')
if self.raw_value:
label = getattr(self.raw_value, filter_by, u'Not selected')
else:
label = u''
html = h.radio_button(self.name, value=self.value, **kwargs)
html += h.label(label)
return ''.join(html)
jq_options.update(filter_by=filter_by, show_input=False)
return jQueryFieldRenderer('pyramidautocomplete', renderer=Renderer, **jq_options)
@alias(PyramidAutocompleteFieldRenderer)
def pyramid_autocomplete(): pass
+9
View File
@@ -395,3 +395,12 @@ class ModelView(object):
return exc.HTTPFound(location=request.fa_url(request.model_name))
return self.render(id=request.model_id)
def autocomplete(self, *args, **kwargs):
filter_term = "%s%%" % self.request.params.get('term')
filter_attr = getattr(self.request.model_class, self.request.params.get('filter_by'))
query = self.session.query(self.request.model_class.id, filter_attr).filter(filter_attr.ilike(filter_term))
items = self.request.query_factory(self.request, query)
return Response(json.dumps([{'label' : x[1],
'value' : x[0]} for x in items ]),
content_type='text/plain')