diff --git a/pyramid_formalchemy/__init__.py b/pyramid_formalchemy/__init__.py index 6f7490e..d73af11 100644 --- a/pyramid_formalchemy/__init__.py +++ b/pyramid_formalchemy/__init__.py @@ -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) + diff --git a/pyramid_formalchemy/renderers.py b/pyramid_formalchemy/renderers.py new file mode 100644 index 0000000..1320f65 --- /dev/null +++ b/pyramid_formalchemy/renderers.py @@ -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 diff --git a/pyramid_formalchemy/views.py b/pyramid_formalchemy/views.py index c6085dd..2a1b652 100644 --- a/pyramid_formalchemy/views.py +++ b/pyramid_formalchemy/views.py @@ -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') +