search: add card search engins (#41845)

This commit is contained in:
Lauréline Guérin 2020-05-05 11:08:57 +02:00
parent e88e377679
commit 8f4a5869bd
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 94 additions and 20 deletions

View File

@ -33,12 +33,46 @@ class AppConfig(django.apps.AppConfig):
def get_search_engines(self):
from .utils import get_wcs_services
services = get_wcs_services()
if not services:
wcs_services = get_wcs_services()
if not wcs_services:
return
engines = self.get_portal_agent_search_engines(wcs_services)
engines.update(self.get_card_search_engines(wcs_services))
return engines
def get_card_search_engines(self, wcs_services):
from combo.data.models import Page
from .utils import get_wcs_json
pages_with_sub_slug = Page.objects.exclude(sub_slug='')
if not pages_with_sub_slug:
return {}
engines = {}
for key, service in wcs_services.items():
card_models = get_wcs_json(service, 'api/cards/@list')
for card in card_models.get('data', []):
matching_pages = ([p for p in pages_with_sub_slug if '<%s_id>' % card['id'] in p.sub_slug])
if not matching_pages:
continue
card_page = matching_pages[0]
card_page_base_url = card_page.get_online_url()
label = card['text']
if len(wcs_services.keys()) > 1:
label = '%s (%s)' % (label, service['title'])
engines['cards:%s:%s' % (hashlib.md5(force_bytes(key)).hexdigest()[:8], card['id'])] = {
'url': service['url'] + 'api/cards/' + card['id'] + '/list?NameID={{ user_nameid }}&q=%(q)s',
'label': label,
'signature': True,
'hit_url_template': card_page_base_url + '{{ id }}',
'hit_label_template': '{% firstof digest text %}',
}
return engines
def get_portal_agent_search_engines(self, wcs_services):
if not settings.TEMPLATE_VARS.get('is_portal_agent'):
return
return {}
engines = {
'tracking-code': {
@ -46,9 +80,9 @@ class AppConfig(django.apps.AppConfig):
'label': _('Tracking Code'),
}
}
for key, service in services.items():
for key, service in wcs_services.items():
label = pgettext_lazy('user-forms', 'Forms')
if len(services.keys()) > 1:
if len(wcs_services.keys()) > 1:
label = pgettext_lazy('user-forms', 'Forms (%s)') % service['title']
engines['formdata:%s' % hashlib.md5(force_bytes(key)).hexdigest()[:8]] = {
'url': service['url'] + 'api/forms/?NameID={{user_nameid}}&status=all&ignore-roles=on&include-anonymised=off&q=%(q)s',

View File

@ -395,7 +395,9 @@ def test_search_api(app):
assert resp.text.count('<li') == 0
def test_search_on_root_page_api(app):
def test_search_on_root_page_api(settings, app):
settings.KNOWN_SERVICES = {}
# not indexed: with sub_slug
page = Page.objects.create(title='example page', slug='example-page', sub_slug='foo')
TextCell.objects.create(page=page, placeholder='content', text='<p>foobar baz</p>', order=0)
@ -608,28 +610,66 @@ def test_manager_waiting_index_message(app, admin_user):
assert 'Content indexing has been scheduled' not in resp.text
def test_wcs_search_engines(app):
with override_settings(KNOWN_SERVICES={}):
search_engines = engines.get_engines()
assert 'tracking-code' not in search_engines.keys()
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
def test_wcs_search_engines(settings, app):
settings.KNOWN_SERVICES = {}
search_engines = engines.get_engines()
assert 'tracking-code' not in search_engines.keys()
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
for key, engine in engines.get_engines().items():
settings.KNOWN_SERVICES = {'wcs': {'default': {'title': 'test', 'url': 'http://127.0.0.1:8999/'}}}
settings.TEMPLATE_VARS['is_portal_agent'] = False
search_engines = engines.get_engines()
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
settings.TEMPLATE_VARS['is_portal_agent'] = True
search_engines = engines.get_engines()
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 1
for key, engine in search_engines.items():
if key.startswith('formdata:'):
assert '&include-anonymised=off' in engine['url']
# create a page with sub_slug to enable card engines
Page.objects.create(slug='foo', title='Foo', sub_slug='(?P<foo_id>[a-z0-9]+')
with mock.patch('combo.apps.wcs.utils.get_wcs_json') as mock_wcs:
# no card model found
mock_wcs.return_value = {}
search_engines = engines.get_engines()
assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
assert mock_wcs.call_args_list[0][0][1] == 'api/cards/@list'
mock_wcs.return_value = {'data': []}
search_engines = engines.get_engines()
assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
def test_profile_search_engines(app):
# card model found, but related page does not exist
mock_wcs.return_value = {'data': [{'id': 'bar', 'text': 'Bar'}]}
search_engines = engines.get_engines()
assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
# related page exists
Page.objects.create(slug='bar', title='Bar', sub_slug='(?P<bar_id>[a-z0-9]+')
search_engines = engines.get_engines()
assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 1
assert 'cards:c21f969b:bar' in search_engines.keys()
card_engine = search_engines['cards:c21f969b:bar']
assert card_engine['url'] == 'http://127.0.0.1:8999/api/cards/bar/list?NameID={{ user_nameid }}&q=%(q)s'
assert card_engine['hit_url_template'] == '/bar/{{ id }}'
def test_profile_search_engines(settings, app):
settings.KNOWN_SERVICES = {}
search_engines = engines.get_engines()
assert 'users' not in search_engines.keys()
with override_settings(KNOWN_SERVICES={'authentic': {'default': {'title': 'authentic', 'url': 'https://authentic/'}}}):
search_engines = engines.get_engines()
assert 'users' not in search_engines.keys()
page = Page(slug='users', title='Users', sub_slug='(?P<name_id>[a-z0-9]+)')
page.save()
search_engines = engines.get_engines()
assert 'users' in search_engines.keys()
settings.KNOWN_SERVICES = {'authentic': {'default': {'title': 'authentic', 'url': 'https://authentic/'}}}
search_engines = engines.get_engines()
assert 'users' not in search_engines.keys()
page = Page(slug='users', title='Users', sub_slug='(?P<name_id>[a-z0-9]+)')
page.save()
search_engines = engines.get_engines()
assert 'users' in search_engines.keys()
def test_private_search(app):