Projet

Général

Profil

0002-add-internal-page-contents-search-service-6793.patch

Frédéric Péters, 04 mars 2017 15:08

Télécharger (5,47 ko)

Voir les différences:

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(-)
combo/apps/search/models.py
20 20
from django import template
21 21
from django.http import HttpResponse
22 22
from django.core.exceptions import PermissionDenied
23
from django.core.urlresolvers import reverse
23 24
from django.forms import models as model_forms, Select
24 25

  
25 26
from combo.utils import requests
......
45 46

  
46 47
    def get_default_form_class(self):
47 48
        search_services = [(None, _('Not configured'))]
49
        search_services.append(('_text', _('Page Contents')))
48 50
        search_services.extend([(code, service['label'])
49 51
                for code, service in getattr(settings, 'COMBO_SEARCH_SERVICES', {}).items()])
50 52
        widgets = {'_search_service': Select(choices=search_services)}
......
61 63

  
62 64
    @property
63 65
    def search_service(self):
66
        if self._search_service == '_text':
67
            return {'url': reverse('api-search') + '?q=%(q)s', 'label': _('Page Contents')}
64 68
        return settings.COMBO_SEARCH_SERVICES.get(self._search_service) or {}
65 69

  
66 70
    def modify_global_context(self, context, request):
......
99 103
        query = request.GET.get('q')
100 104
        if query and cell.search_service.get('url'):
101 105
            url = cell.search_service.get('url') % {'q': query}
106
            if url.startswith('/'):
107
                url = request.build_absolute_uri(url)
102 108
            results = requests.get(url, cache_duration=0).json()
103 109
        else:
104 110
            results = {'err': 0, 'data': []}
combo/apps/search/templates/combo/search-cell-results.html
2 2
<ul>
3 3
  {% for item in results.data %}
4 4
  <li><a href="{{ item.url }}">{{ item.text }}</a>{% if item.description %}
5
    {{ item.description|safe }}
5
          {% if item.description %}<div>{{ item.description|safe }}</div>{% endif %}
6 6
  {% endif %}</li>
7 7
  {% endfor %}
8 8
</ul>
combo/data/models.py
471 471
    def render_for_search(self):
472 472
        context = Context({'synchronous': True})
473 473
        if not self.is_enabled():
474
            return
474
            return ''
475 475
        if not self.is_visible(user=None):
476
            return
476
            return ''
477 477
        if not self.is_relevant(context):
478
            return
478
            return ''
479 479
        from HTMLParser import HTMLParser
480 480
        return HTMLParser().unescape(strip_tags(self.render(context)))
481 481

  
combo/public/urls.py
20 20

  
21 21
urlpatterns = patterns('combo.publicviews',
22 22
    url(r'^api/menu-badges/', views.menu_badges),
23
    url(r'^api/search/', views.api_search, name='api-search'),
23 24
    url(r'^ajax/cell/(?P<page_pk>\w+)/(?P<cell_reference>[\w_-]+)/$',
24 25
        views.ajax_page_cell, name='combo-public-ajax-page-cell'),
25 26
    (r'__style__/$', views.style),
combo/public/views.py
38 38
from django.utils.translation import ugettext as _
39 39
from django.forms.widgets import Media
40 40

  
41
from haystack.query import SearchQuerySet
42

  
41 43
if 'mellon' in settings.INSTALLED_APPS:
42 44
    from mellon.utils import get_idps
43 45
else:
44 46
    get_idps = lambda: []
45 47

  
46 48
from combo.data.models import CellBase, Page, ParentContentCell, TextCell
49
from combo.apps.search.models import SearchCell
47 50
from combo import utils
48 51

  
49 52

  
......
342 345
        if badge:
343 346
            badges[cell.page_id] = badge
344 347
    return HttpResponse(json.dumps(badges))
348

  
349

  
350
def api_search(request):
351
    for cell in SearchCell.objects.filter(_search_service='_text'):
352
        if not cell.is_visible(request.user):
353
            continue
354
        break
355
    else:
356
        raise Http404()
357
    query = request.GET.get('q') or ''
358
    searchqueryset = SearchQuerySet()
359
    sqs = searchqueryset.auto_query(query).highlight()
360
    sqs.load_all()
361
    hits = []
362
    for page in sqs:
363
        if page.highlighted['text']:
364
            description = '<p>%s</p>' % page.highlighted['text'][0]
365
        hits.append({
366
            'text': page.title,
367
            'url': page.url,
368
            'description': description,
369
        })
370

  
371
    return HttpResponse(json.dumps({'data': hits}), content_type='application/json')
345
-