diff --git a/__pkginfo__.py b/__pkginfo__.py index 9360d782237bc14f81737aac5ab336fe40b224d3_X19wa2dpbmZvX18ucHk=..70db85e13042eded769831fe5cb686979c03b363_X19wa2dpbmZvX18ucHk= 100644 --- a/__pkginfo__.py +++ b/__pkginfo__.py @@ -14,6 +14,7 @@ web = 'http://www.cubicweb.org/project/%s' % distname __depends__ = {'cubicweb': '>= 3.22.2', 'six': '>= 1.4.0', + 'cwtags': None, 'elasticsearch': None, 'elasticsearch-dsl': None, 'bs4': None, diff --git a/test/test_elastic_search.py b/test/test_elastic_search.py index 9360d782237bc14f81737aac5ab336fe40b224d3_dGVzdC90ZXN0X2VsYXN0aWNfc2VhcmNoLnB5..70db85e13042eded769831fe5cb686979c03b363_dGVzdC90ZXN0X2VsYXN0aWNfc2VhcmNoLnB5 100644 --- a/test/test_elastic_search.py +++ b/test/test_elastic_search.py @@ -7,7 +7,7 @@ from mock import patch -from elasticsearch_dsl.result import Response +from elasticsearch_dsl.faceted_search import FacetedResponse from cubicweb.devtools import testlib from cubicweb.cwconfig import CubicWebConfiguration @@ -112,7 +112,7 @@ 'title': 'test'}, '_type': 'BaseContent', '_score': 1} - return Response({'hits': {'hits': [result], + return FacetedResponse({'hits': {'hits': [result], 'total': 1 }}) diff --git a/views.py b/views.py index 9360d782237bc14f81737aac5ab336fe40b224d3_dmlld3MucHk=..70db85e13042eded769831fe5cb686979c03b363_dmlld3MucHk= 100644 --- a/views.py +++ b/views.py @@ -16,5 +16,4 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. """elasticsearch search views""" -from elasticsearch import Elasticsearch from elasticsearch.exceptions import NotFoundError @@ -20,8 +19,7 @@ from elasticsearch.exceptions import NotFoundError -from elasticsearch_dsl import Search from elasticsearch_dsl.connections import connections from elasticsearch_dsl import FacetedSearch, TermsFacet, DateHistogramFacet from bs4 import BeautifulSoup from logilab.mtconverter import xml_escape @@ -22,10 +20,11 @@ from elasticsearch_dsl.connections import connections from elasticsearch_dsl import FacetedSearch, TermsFacet, DateHistogramFacet from bs4 import BeautifulSoup from logilab.mtconverter import xml_escape +import cwtags.tag as t from cubicweb.view import StartupView from cubes.elasticsearch.es import indexable_types @@ -28,7 +27,8 @@ from cubicweb.view import StartupView from cubes.elasticsearch.es import indexable_types + def get_connection(config): try: connections.get_connection() @@ -40,4 +40,5 @@ index=index_name, timeout=20) + class CWFacetedSearch(FacetedSearch): @@ -43,3 +44,2 @@ class CWFacetedSearch(FacetedSearch): - #doc_types = ['NewsContent', 'CommemorationItem', 'Circular',] # fields that should be searched @@ -45,5 +45,5 @@ # fields that should be searched - fields = ["title^3", "name^3", "content^2", 'content', '_all',] + fields = ["title^3", "name^3", "content^2", 'content', '_all'] facets = { # use bucket aggregations to define facets @@ -52,6 +52,7 @@ 'commemoration_year': DateHistogramFacet(field='commemoration_year', interval='year'), 'year': DateHistogramFacet(field='year', interval='year'), } + def __init__(self, query=None, filters={}, doc_types=None): if doc_types: self.doc_types = doc_types @@ -62,9 +63,10 @@ Add custom highlighting """ return search.highlight(*self.fields) \ - .highlight_options(pre_tags="", - post_tags="", - fragment_size=150) + .highlight_options(pre_tags="", + post_tags="", + fragment_size=150) + class ElasticSearchView(StartupView): __regid__ = "esearch" @@ -104,6 +106,7 @@ def display_results(self, response): self.w(u'<div id="main-center" class="col-xs-10" role="main">') + self.pagination(response) self.w(u'<ul>') for result in response: self.w(u'<li>') @@ -125,5 +128,6 @@ pass self.w(u'</li>') self.w(u'</ul>') + self.pagination(response) self.w(u'</div>') @@ -128,5 +132,41 @@ self.w(u'</div>') + def pagination(self, response): + if response.hits.total < 10: + return + url_params = self._cw.form.copy() + with t.ul(self.w, klass="pagination") as ul: + current_page = int(url_params.get('page', 1)) + url_params['page'] = current_page - 1 + if current_page - 1 >= 1: + ul(t.li(t.a('<<<', + href=self._cw.build_url(**url_params)))) + else: + ul(t.li(t.a('<<<'))) + + for i in range(0, min((response.hits.total / 10) + 1, 10)): + page = i + 1 + url_params['page'] = page + url = self._cw.build_url(**url_params) + if page == current_page: + ul(t.li(t.a(t.b(page), + href=url))) + else: + ul(t.li(t.a(page, + href=url))) + if response.hits.total / 10 > 10: + ul(t.li(t.a("..."))) + for i in range((response.hits.total / 10) - 3, response.hits.total / 10): + url_params['page'] = i + url = self._cw.build_url(**url_params) + ul(t.li(t.a(i, + href=url))) + url_params['page'] = current_page + 1 + if current_page + 1 >= (response.hits.total / 10): + ul(t.li(t.a('>>>'))) + else: + ul(t.li(t.a('>>>', + href=self._cw.build_url(**url_params)))) def display_facets(self, response): self.w(u'''<aside id="aside-main-left" class="col-xs-2 cwjs-aside"> @@ -137,6 +177,8 @@ ''') for attribute in ('cw_etype', 'creation_date'): url_params = self._cw.form.copy() + if 'page' in url_params: + del url_params['page'] self.w(u'<div class="facetBody vocabularyFacet">') self.w(u'<div class="facetTitle">{}</div>'.format(attribute)) for (tag, count, selected) in response.facets[attribute]: