From 8f4a5869bd0cb4655f9fadf347fe0c6767b21e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Tue, 5 May 2020 11:08:57 +0200 Subject: [PATCH] search: add card search engins (#41845) --- combo/apps/wcs/__init__.py | 44 +++++++++++++++++++++--- tests/test_search.py | 70 ++++++++++++++++++++++++++++++-------- 2 files changed, 94 insertions(+), 20 deletions(-) diff --git a/combo/apps/wcs/__init__.py b/combo/apps/wcs/__init__.py index 26e95f89..83e0542e 100644 --- a/combo/apps/wcs/__init__.py +++ b/combo/apps/wcs/__init__.py @@ -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', diff --git a/tests/test_search.py b/tests/test_search.py index 1681ab1b..4e097560 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -395,7 +395,9 @@ def test_search_api(app): assert resp.text.count('