0002-add-internal-page-contents-search-service-6793.patch
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 |
- |