mirror of
https://github.com/wassname/pyramid_formalchemy.git
synced 2026-09-10 12:20:32 +08:00
Merge pull request #7 from amleczko/master
pyramid autocomplete renderer
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user