From 20f06c508dbfeb5bea633d9e5454a3d53f03bf34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 4 Mar 2017 15:08:01 +0100 Subject: [PATCH 2/2] add internal page contents search service (#6793) --- combo/apps/search/models.py | 6 +++++ .../templates/combo/search-cell-results.html | 2 +- combo/data/models.py | 6 ++--- combo/public/urls.py | 1 + combo/public/views.py | 27 ++++++++++++++++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/combo/apps/search/models.py b/combo/apps/search/models.py index 3d3bcb1..2cdbc7b 100644 --- a/combo/apps/search/models.py +++ b/combo/apps/search/models.py @@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy as _ from django import template from django.http import HttpResponse from django.core.exceptions import PermissionDenied +from django.core.urlresolvers import reverse from django.forms import models as model_forms, Select from combo.utils import requests @@ -45,6 +46,7 @@ class SearchCell(CellBase): def get_default_form_class(self): search_services = [(None, _('Not configured'))] + search_services.append(('_text', _('Page Contents'))) search_services.extend([(code, service['label']) for code, service in getattr(settings, 'COMBO_SEARCH_SERVICES', {}).items()]) widgets = {'_search_service': Select(choices=search_services)} @@ -61,6 +63,8 @@ class SearchCell(CellBase): @property def search_service(self): + if self._search_service == '_text': + return {'url': reverse('api-search') + '?q=%(q)s', 'label': _('Page Contents')} return settings.COMBO_SEARCH_SERVICES.get(self._search_service) or {} def modify_global_context(self, context, request): @@ -99,6 +103,8 @@ class SearchCell(CellBase): query = request.GET.get('q') if query and cell.search_service.get('url'): url = cell.search_service.get('url') % {'q': query} + if url.startswith('/'): + url = request.build_absolute_uri(url) results = requests.get(url, cache_duration=0).json() else: results = {'err': 0, 'data': []} diff --git a/combo/apps/search/templates/combo/search-cell-results.html b/combo/apps/search/templates/combo/search-cell-results.html index 37e4b15..920fe8e 100644 --- a/combo/apps/search/templates/combo/search-cell-results.html +++ b/combo/apps/search/templates/combo/search-cell-results.html @@ -2,7 +2,7 @@ diff --git a/combo/data/models.py b/combo/data/models.py index 70a5d48..fac84b7 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -471,11 +471,11 @@ class CellBase(models.Model): def render_for_search(self): context = Context({'synchronous': True}) if not self.is_enabled(): - return + return '' if not self.is_visible(user=None): - return + return '' if not self.is_relevant(context): - return + return '' from HTMLParser import HTMLParser return HTMLParser().unescape(strip_tags(self.render(context))) diff --git a/combo/public/urls.py b/combo/public/urls.py index c567c96..1cb575b 100644 --- a/combo/public/urls.py +++ b/combo/public/urls.py @@ -20,6 +20,7 @@ from . import views urlpatterns = patterns('combo.publicviews', url(r'^api/menu-badges/', views.menu_badges), + url(r'^api/search/', views.api_search, name='api-search'), url(r'^ajax/cell/(?P\w+)/(?P[\w_-]+)/$', views.ajax_page_cell, name='combo-public-ajax-page-cell'), (r'__style__/$', views.style), diff --git a/combo/public/views.py b/combo/public/views.py index 672039f..7c9afa6 100644 --- a/combo/public/views.py +++ b/combo/public/views.py @@ -38,12 +38,15 @@ else: from django.utils.translation import ugettext as _ from django.forms.widgets import Media +from haystack.query import SearchQuerySet + if 'mellon' in settings.INSTALLED_APPS: from mellon.utils import get_idps else: get_idps = lambda: [] from combo.data.models import CellBase, Page, ParentContentCell, TextCell +from combo.apps.search.models import SearchCell from combo import utils @@ -342,3 +345,27 @@ def menu_badges(request): if badge: badges[cell.page_id] = badge return HttpResponse(json.dumps(badges)) + + +def api_search(request): + for cell in SearchCell.objects.filter(_search_service='_text'): + if not cell.is_visible(request.user): + continue + break + else: + raise Http404() + query = request.GET.get('q') or '' + searchqueryset = SearchQuerySet() + sqs = searchqueryset.auto_query(query).highlight() + sqs.load_all() + hits = [] + for page in sqs: + if page.highlighted['text']: + description = '

%s

' % page.highlighted['text'][0] + hits.append({ + 'text': page.title, + 'url': page.url, + 'description': description, + }) + + return HttpResponse(json.dumps({'data': hits}), content_type='application/json') -- 2.11.0