--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_form/search.py Thu Feb 19 10:55:46 2015 +0100
@@ -0,0 +1,106 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_form.interfaces.form import IWidgetForm, ISearchForm
+from pyams_skin.interfaces import IContentSearch, IInnerPage, ISearchPage
+from pyams_skin.layer import IPyAMSLayer
+from z3c.table.interfaces import IValues
+
+# import packages
+from pyams_form.form import AddForm
+from pyams_form.schema import ResetButton
+from pyams_skin.table import BaseTable
+from pyams_template.template import template_config
+from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
+from pyramid.response import Response
+from z3c.form import field, button
+from zope.interface import implementer, Interface
+from zope.schema import TextLine
+
+from pyams_form import _
+
+
+class ISearchFields(Interface):
+ """Default search form interface"""
+
+ query = TextLine(title=_("Search query"))
+
+
+class ISearchButtons(Interface):
+ """Search form buttons interface"""
+
+ reset = ResetButton(name='reset', title=_("Reset"))
+ search = button.Button(name='search', title=_("Search"))
+
+
+@implementer(IWidgetForm, ISearchForm)
+class SearchForm(AddForm):
+ """Base search form"""
+
+ legend = _("Search")
+ widget_icon_class = 'fa fa-fw fa-search'
+
+ fields = field.Fields(ISearchFields)
+ buttons = button.Buttons(ISearchButtons)
+
+ ajax_handler = 'search-results.html'
+ form_target = '#search-results'
+
+ def updateActions(self):
+ super(SearchForm, self).updateActions()
+ if 'search' in self.actions:
+ self.actions['search'].addClass('btn-primary')
+
+ def get_search_results(self):
+ search = IContentSearch(self.context, None)
+ if search is not None:
+ self.updateWidgets()
+ data, errors = self.extractData()
+ return search.get_search_results(data)
+
+
+@template_config(template='templates/search.pt', layer=IPyAMSLayer)
+@implementer(IInnerPage, ISearchPage)
+class SearchView(object):
+ """Base search view"""
+
+ search_form_factory = SearchForm
+
+ def update(self):
+ self.search_form = self.search_form_factory(self.context, self.request)
+ self.search_form.update()
+
+
+class SearchResultsView(BaseTable):
+ """Search results view"""
+
+ search_form_factory = SearchForm
+
+ def __call__(self):
+ self.update()
+ return Response(self.renderTable())
+
+
+@adapter_config(context=(Interface, IPyAMSLayer, SearchResultsView), provides=IValues)
+class SearchResultsViewValuesAdapter(ContextRequestViewAdapter):
+ """Search results view values adapter"""
+
+ @property
+ def values(self):
+ form = self.view.search_form_factory(self.context, self.request)
+ return form.get_search_results()