Projet

Général

Profil

0001-search-add-card-search-engins-41845.patch

Lauréline Guérin, 05 mai 2020 11:09

Télécharger (7,81 ko)

Voir les différences:

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(-)
combo/apps/wcs/__init__.py
33 33

  
34 34
    def get_search_engines(self):
35 35
        from .utils import get_wcs_services
36
        services = get_wcs_services()
37
        if not services:
36
        wcs_services = get_wcs_services()
37
        if not wcs_services:
38 38
            return
39 39

  
40
        engines = self.get_portal_agent_search_engines(wcs_services)
41
        engines.update(self.get_card_search_engines(wcs_services))
42

  
43
        return engines
44

  
45
    def get_card_search_engines(self, wcs_services):
46
        from combo.data.models import Page
47
        from .utils import get_wcs_json
48
        pages_with_sub_slug = Page.objects.exclude(sub_slug='')
49
        if not pages_with_sub_slug:
50
            return {}
51

  
52
        engines = {}
53
        for key, service in wcs_services.items():
54
            card_models = get_wcs_json(service, 'api/cards/@list')
55
            for card in card_models.get('data', []):
56
                matching_pages = ([p for p in pages_with_sub_slug if '<%s_id>' % card['id'] in p.sub_slug])
57
                if not matching_pages:
58
                    continue
59
                card_page = matching_pages[0]
60
                card_page_base_url = card_page.get_online_url()
61
                label = card['text']
62
                if len(wcs_services.keys()) > 1:
63
                    label = '%s (%s)' % (label, service['title'])
64
                engines['cards:%s:%s' % (hashlib.md5(force_bytes(key)).hexdigest()[:8], card['id'])] = {
65
                    'url': service['url'] + 'api/cards/' + card['id'] + '/list?NameID={{ user_nameid }}&q=%(q)s',
66
                    'label': label,
67
                    'signature': True,
68
                    'hit_url_template': card_page_base_url + '{{ id }}',
69
                    'hit_label_template': '{% firstof digest text %}',
70
                }
71
        return engines
72

  
73
    def get_portal_agent_search_engines(self, wcs_services):
40 74
        if not settings.TEMPLATE_VARS.get('is_portal_agent'):
41
            return
75
            return {}
42 76

  
43 77
        engines = {
44 78
            'tracking-code': {
......
46 80
                'label': _('Tracking Code'),
47 81
            }
48 82
        }
49
        for key, service in services.items():
83
        for key, service in wcs_services.items():
50 84
            label = pgettext_lazy('user-forms', 'Forms')
51
            if len(services.keys()) > 1:
85
            if len(wcs_services.keys()) > 1:
52 86
                label = pgettext_lazy('user-forms', 'Forms (%s)') % service['title']
53 87
            engines['formdata:%s' % hashlib.md5(force_bytes(key)).hexdigest()[:8]] = {
54 88
                'url': service['url'] + 'api/forms/?NameID={{user_nameid}}&status=all&ignore-roles=on&include-anonymised=off&q=%(q)s',
tests/test_search.py
361 361
    assert resp.text.count('<li') == 0
362 362

  
363 363

  
364
def test_search_on_root_page_api(app):
364
def test_search_on_root_page_api(settings, app):
365
    settings.KNOWN_SERVICES = {}
366

  
365 367
    # not indexed: with sub_slug
366 368
    page = Page.objects.create(title='example page', slug='example-page', sub_slug='foo')
367 369
    TextCell.objects.create(page=page, placeholder='content', text='<p>foobar baz</p>', order=0)
......
574 576
    assert 'Content indexing has been scheduled' not in resp.text
575 577

  
576 578

  
577
def test_wcs_search_engines(app):
578
    with override_settings(KNOWN_SERVICES={}):
579
        search_engines = engines.get_engines()
580
        assert 'tracking-code' not in search_engines.keys()
581
        assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
579
def test_wcs_search_engines(settings, app):
580
    settings.KNOWN_SERVICES = {}
581
    search_engines = engines.get_engines()
582
    assert 'tracking-code' not in search_engines.keys()
583
    assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
584
    assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
585

  
586
    settings.KNOWN_SERVICES = {'wcs': {'default': {'title': 'test', 'url': 'http://127.0.0.1:8999/'}}}
582 587

  
583
    for key, engine in engines.get_engines().items():
588
    settings.TEMPLATE_VARS['is_portal_agent'] = False
589
    search_engines = engines.get_engines()
590
    assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
591

  
592
    settings.TEMPLATE_VARS['is_portal_agent'] = True
593
    search_engines = engines.get_engines()
594
    assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 1
595
    for key, engine in search_engines.items():
584 596
        if key.startswith('formdata:'):
585 597
            assert '&include-anonymised=off' in engine['url']
586 598

  
599
    # create a page with sub_slug to enable card engines
600
    Page.objects.create(slug='foo', title='Foo', sub_slug='(?P<foo_id>[a-z0-9]+')
601
    with mock.patch('combo.apps.wcs.utils.get_wcs_json') as mock_wcs:
602
        # no card model found
603
        mock_wcs.return_value = {}
604
        search_engines = engines.get_engines()
605
        assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
606
        assert mock_wcs.call_args_list[0][0][1] == 'api/cards/@list'
607
        mock_wcs.return_value = {'data': []}
608
        search_engines = engines.get_engines()
609
        assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
587 610

  
588
def test_profile_search_engines(app):
589
    search_engines = engines.get_engines()
590
    assert 'users' not in search_engines.keys()
591
    with override_settings(KNOWN_SERVICES={'authentic': {'default': {'title': 'authentic', 'url': 'https://authentic/'}}}):
611
        # card model found, but related page does not exist
612
        mock_wcs.return_value = {'data': [{'id': 'bar', 'text': 'Bar'}]}
592 613
        search_engines = engines.get_engines()
593
        assert 'users' not in search_engines.keys()
614
        assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 0
594 615

  
595
        page = Page(slug='users', title='Users', sub_slug='(?P<name_id>[a-z0-9]+)')
596
        page.save()
616
        # related page exists
617
        Page.objects.create(slug='bar', title='Bar', sub_slug='(?P<bar_id>[a-z0-9]+')
597 618
        search_engines = engines.get_engines()
598
        assert 'users' in search_engines.keys()
619
        assert len([x for x in search_engines.keys() if x.startswith('cards:')]) == 1
620
        assert 'cards:c21f969b:bar' in search_engines.keys()
621
        card_engine = search_engines['cards:c21f969b:bar']
622
        assert card_engine['url'] == 'http://127.0.0.1:8999/api/cards/bar/list?NameID={{ user_nameid }}&q=%(q)s'
623
        assert card_engine['hit_url_template'] == '/bar/{{ id }}'
624

  
625

  
626
def test_profile_search_engines(settings, app):
627
    settings.KNOWN_SERVICES = {}
628
    search_engines = engines.get_engines()
629
    assert 'users' not in search_engines.keys()
630

  
631
    settings.KNOWN_SERVICES = {'authentic': {'default': {'title': 'authentic', 'url': 'https://authentic/'}}}
632
    search_engines = engines.get_engines()
633
    assert 'users' not in search_engines.keys()
634

  
635
    page = Page(slug='users', title='Users', sub_slug='(?P<name_id>[a-z0-9]+)')
636
    page.save()
637
    search_engines = engines.get_engines()
638
    assert 'users' in search_engines.keys()
599 639

  
600 640

  
601 641
def test_private_search(app):
602
-