search: add option to set custom title for subpages search engine (#43888)

This commit is contained in:
Frédéric Péters 2020-07-14 11:58:15 +02:00
parent 1944e05dae
commit cccbc87b61
4 changed files with 48 additions and 10 deletions

View File

@ -44,7 +44,7 @@ class SelectWithDisabled(forms.Select):
return option_dict
class SelectPageForm(forms.ModelForm):
class TextEngineSettingsForm(forms.ModelForm):
selected_page = forms.ModelChoiceField(
label=_('Page'),
required=False,
@ -52,6 +52,7 @@ class SelectPageForm(forms.ModelForm):
help_text=_("Select a page to limit the search on this page and sub pages contents."),
widget=SelectWithDisabled(),
)
title = forms.CharField(label=_('Custom Title'), required=False)
class Meta:
model = SearchCell

View File

@ -21,7 +21,7 @@ from django.shortcuts import render
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from combo.apps.search.forms import SelectPageForm
from combo.apps.search.forms import TextEngineSettingsForm
from combo.apps.search.models import SearchCell
from combo.data.models import PageSnapshot
@ -29,11 +29,14 @@ from combo.data.models import PageSnapshot
def page_search_cell_add_engine(request, page_pk, cell_reference, engine_slug):
cell = get_object_or_404(SearchCell, pk=cell_reference.split('-')[1], page=page_pk)
def add_slug(slug):
def add_slug(slug, **options):
if slug in cell.available_engines or slug.startswith('_text_page'):
if not cell._search_services or not cell._search_services.get('data'):
cell._search_services = {'data': []}
if not cell._search_services.get('options'):
cell._search_services['options'] = {}
cell._search_services['data'].append(slug)
cell._search_services['options'][slug] = options
cell.save()
PageSnapshot.take(cell.page, request=request, comment=_('changed cell "%s"') % cell)
return HttpResponseRedirect('%s#cell-%s' % (
@ -45,14 +48,14 @@ def page_search_cell_add_engine(request, page_pk, cell_reference, engine_slug):
return add_slug(engine_slug)
if request.method == 'POST':
form = SelectPageForm(instance=cell, data=request.POST)
form = TextEngineSettingsForm(instance=cell, data=request.POST)
if form.is_valid():
slug = '_text'
if form.cleaned_data['selected_page'] is not None:
slug = '_text_page_%s' % form.cleaned_data['selected_page'].slug
return add_slug(slug)
return add_slug(slug, title=form.cleaned_data['title'])
else:
form = SelectPageForm(instance=cell)
form = TextEngineSettingsForm(instance=cell)
context = {
'form': form,
'cell': cell,

View File

@ -85,6 +85,7 @@ class SearchCell(CellBase):
service = engines.get('_text')
if service and (service.get('url') or service.get('function')):
service['slug'] = service_slug
service['options'] = self._search_services.get('options', {}).get(service_slug)
services.append(service)
return services
@ -168,6 +169,12 @@ class SearchCell(CellBase):
service_label = service.get('label')
if pages:
service_label = _('Page "%(page)s" and sub pages Contents') % {'page': pages[0].title}
try:
# optional label defined with engine
if service['options']['title']:
service_label = service['options']['title']
except (KeyError, TypeError):
pass
context = {
'cell': cell,
'results': results,

View File

@ -449,6 +449,15 @@ def test_search_on_root_page_api(settings, app):
cell.save()
resp = app.get('/ajax/search/%s/_text_page_sub-second-page/?q=baz' % cell.pk, status=200)
assert resp.text.count('<li') == 2
# search with custom title
cell._search_services = {
'data': ['_text', '_text_page_sub-second-page'],
'options': {'_text_page_sub-second-page': {'title': 'Custom Title'}},
}
cell.save()
resp = app.get('/ajax/search/%s/_text_page_sub-second-page/?q=baz' % cell.pk, status=200)
assert 'Custom Title' in resp.text
assert resp.text.count('<li') == 2
def test_search_external_links(app):
@ -519,7 +528,7 @@ def test_manager_search_cell(settings, app, admin_user):
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click(href='.*/search_searchcell-%s/engine/search_tmpl/add/' % cell.pk)
cell.refresh_from_db()
assert cell._search_services == {'data': ['_text', 'search1', 'search_tmpl']}
assert cell._search_services['data'] == ['_text', 'search1', 'search_tmpl']
resp = app.get('/manage/pages/%s/' % page.pk)
# '_text' is always available
assert '/manage/search/pages/%s/cell/search_searchcell-%s/engine/_text/add/' % (page.pk, cell.pk) in resp.text
@ -536,7 +545,7 @@ def test_manager_search_cell(settings, app, admin_user):
assert resp.status_int == 302
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
cell.refresh_from_db()
assert cell._search_services == {'data': ['search1', 'search_tmpl']}
assert cell._search_services['data'] == ['search1', 'search_tmpl']
settings.COMBO_SEARCH_SERVICES = {}
# check there's no crash if search engines are removed from config
@ -555,7 +564,7 @@ def test_manager_search_cell(settings, app, admin_user):
assert resp.status_int == 302
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
cell.refresh_from_db()
assert cell._search_services == {'data': ['search1', 'search_tmpl', '_text']}
assert cell._search_services['data'] == ['search1', 'search_tmpl', '_text']
resp = app.get('/manage/pages/%s/' % page.pk)
assert '/manage/search/pages/%s/cell/search_searchcell-%s/engine/_text/add/' % (page.pk, cell.pk) in resp.text
assert '/manage/search/pages/%s/cell/search_searchcell-%s/engine/_text/delete/' % (page.pk, cell.pk) in resp.text
@ -566,12 +575,30 @@ def test_manager_search_cell(settings, app, admin_user):
assert resp.status_int == 302
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
cell.refresh_from_db()
assert cell._search_services == {'data': ['search1', 'search_tmpl', '_text', '_text_page_one']}
assert cell._search_services['data'] == ['search1', 'search_tmpl', '_text', '_text_page_one']
resp = app.get('/manage/pages/%s/' % page.pk)
assert '/manage/search/pages/%s/cell/search_searchcell-%s/engine/_text/add/' % (page.pk, cell.pk) in resp.text
assert '/manage/search/pages/%s/cell/search_searchcell-%s/engine/_text/delete/' % (page.pk, cell.pk) in resp.text
assert '/manage/search/pages/%s/cell/search_searchcell-%s/engine/_text_page_one/delete/' % (page.pk, cell.pk) in resp.text
# remove engine
resp = resp.click(href='.*/search_searchcell-%s/engine/_text_page_one/delete/' % cell.pk)
assert resp.status_int == 302
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
cell.refresh_from_db()
# add engine on page and sub pages, with a custom title
resp = app.get('/manage/pages/%s/' % page.pk)
resp = resp.click(href='.*/search_searchcell-%s/engine/_text/add/' % cell.pk)
resp.form['selected_page'] = page.pk
resp.form['title'] = 'Custom Title'
resp = resp.form.submit('submit')
assert resp.status_int == 302
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
cell.refresh_from_db()
assert cell._search_services['data'] == ['search1', 'search_tmpl', '_text', '_text_page_one']
assert cell._search_services['options']['_text_page_one'] == {'title': 'Custom Title'}
def test_manager_search_cell_order(settings, app, admin_user):
settings.COMBO_SEARCH_SERVICES = SEARCH_SERVICES