src/pyams_form/search.py
changeset 0 7a0b409fd4b8
child 3 9dbd2ca24a55
--- /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()