Projet

Général

Profil

0002-wcs-register-search-engines-for-formdata-of-wcs-site.patch

Frédéric Péters, 01 janvier 2019 14:11

Télécharger (8,03 ko)

Voir les différences:

Subject: [PATCH 2/3] wcs: register search engines for formdata of wcs sites
 (#26260)

 combo/apps/search/urls.py  |  2 +-
 combo/apps/wcs/__init__.py | 22 ++++++++++++++-
 tests/test_search.py       | 55 ++++++++++++++++++++++----------------
 tests/test_wcs.py          |  7 +++++
 4 files changed, 61 insertions(+), 25 deletions(-)
combo/apps/search/urls.py
19 19
from .models import SearchCell
20 20

  
21 21
urlpatterns = [
22
    url(r'^ajax/search/(?P<cell_pk>\w+)/(?P<service_slug>[\w-]+)/$', SearchCell.ajax_results_view,
22
    url(r'^ajax/search/(?P<cell_pk>\w+)/(?P<service_slug>[\w:-]+)/$', SearchCell.ajax_results_view,
23 23
        name='combo-search-ajax-results'),
24 24
]
combo/apps/wcs/__init__.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import hashlib
18

  
17 19
import django.apps
18 20
from django.core.urlresolvers import reverse
19 21
from django.utils.translation import ugettext_lazy as _
......
28 30
        engines.register(self.get_search_engines)
29 31

  
30 32
    def get_search_engines(self):
31
        return {
33
        from .utils import get_wcs_services
34
        services = get_wcs_services()
35
        if not services:
36
            return
37

  
38
        engines = {
32 39
            'tracking-code': {
33 40
                'url': reverse('wcs-tracking-code-search') + '?q=%(q)s',
34 41
                'label': _('Tracking Code'),
35 42
            }
36 43
        }
44
        for key, service in services.items():
45
            label = _('Forms')
46
            if len(services.keys()) > 1:
47
                label = _('Forms (%s)') % service['title']
48
            engines['formdata:%s' % hashlib.md5(key).hexdigest()[:8]] = {
49
                'url': service['url'] + 'api/forms/?NameID={{user_nameid}}&status=all&ignore-roles=on&q=%(q)s',
50
                'label': label,
51
                'signature': True,
52
                'hit_url_template': '{% if readable %}{{ form_url_backoffice }}{% endif %}',
53
                'hit_label_template': '{{ title }}',
54
                'hit_description_template': '{{ form_digest|default:"" }}',
55
            }
56
        return engines
37 57

  
38 58
    def get_before_urls(self):
39 59
        from . import urls
tests/test_search.py
12 12

  
13 13
from haystack.exceptions import SkipDocument
14 14

  
15
from combo.apps.search.engines import engines
15 16
from combo.apps.search.models import SearchCell
16 17
from combo.data.models import Page, JsonCell, TextCell, MenuCell, LinkCell
17 18
from combo.data.search_indexes import PageIndex
......
338 339
    assert len(cells) == 1
339 340
    assert isinstance(cells[0], SearchCell)
340 341

  
341
    resp = app.get('/manage/pages/%s/' % page.id)
342
    assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
343
    assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 2
344

  
345
    with SearchServices(SEARCH_SERVICES):
342
    with override_settings(KNOWN_SERVICES={}):
346 343
        resp = app.get('/manage/pages/%s/' % page.id)
347
        assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 5
348
        # simulate reordering of options
349
        resp.form['c%s-_search_services' % cells[0].get_reference()].options = [
350
                (u'search_tmpl', False, u'Search with template'),
351
                (u'search_alternate_key', False, u'Search with alternate key'),
352
                (u'_text', False, u'Page Contents'),
353
                (u'search1', False, u'Search 1')]
354
        resp.form['c%s-_search_services' % cells[0].get_reference()].value = ['search_tmpl', '_text']
355
        resp = resp.form.submit()
356
        assert resp.status_int == 302
357

  
358
        # check selected engines are selected and the first items of the list
344
        assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
345
        assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 1
346

  
347
        with SearchServices(SEARCH_SERVICES):
348
            resp = app.get('/manage/pages/%s/' % page.id)
349
            assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 4
350
            # simulate reordering of options
351
            resp.form['c%s-_search_services' % cells[0].get_reference()].options = [
352
                    (u'search_tmpl', False, u'Search with template'),
353
                    (u'search_alternate_key', False, u'Search with alternate key'),
354
                    (u'_text', False, u'Page Contents'),
355
                    (u'search1', False, u'Search 1')]
356
            resp.form['c%s-_search_services' % cells[0].get_reference()].value = ['search_tmpl', '_text']
357
            resp = resp.form.submit()
358
            assert resp.status_int == 302
359

  
360
            # check selected engines are selected and the first items of the list
361
            resp = app.get('/manage/pages/%s/' % page.id)
362
            assert set(resp.form['c%s-_search_services' % cells[0].get_reference()].value) == set(['search_tmpl', '_text'])
363
            assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[0][0] == 'search_tmpl'
364
            assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[1][0] == '_text'
365

  
366
        # check there's no crash if search engines are removed from config
359 367
        resp = app.get('/manage/pages/%s/' % page.id)
360
        assert set(resp.form['c%s-_search_services' % cells[0].get_reference()].value) == set(['search_tmpl', '_text'])
361
        assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[0][0] == 'search_tmpl'
362
        assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[1][0] == '_text'
368
        assert resp.form['c%s-_search_services' % cells[0].get_reference()].value == ['_text']
363 369

  
364
    # check there's no crash if search engines are removed from config
365
    resp = app.get('/manage/pages/%s/' % page.id)
366
    assert resp.form['c%s-_search_services' % cells[0].get_reference()].value == ['_text']
370

  
371
def test_wcs_search_engines(app):
372
    with override_settings(KNOWN_SERVICES={}):
373
        search_engines = engines.get_engines()
374
        assert 'tracking-code' not in search_engines.keys()
375
        assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
tests/test_wcs.py
19 19
from django.utils.six.moves.urllib import parse as urlparse
20 20

  
21 21
from combo.data.models import Page
22
from combo.apps.search.engines import engines
22 23
from combo.apps.wcs.models import (WcsFormCell, WcsCurrentFormsCell,
23 24
        WcsFormsOfCategoryCell, WcsCurrentDraftsCell, WcsCategoryCell,
24 25
        TrackingCodeInputCell, BackofficeSubmissionCell)
......
675 676
    assert len(app.get('/api/search/tracking-code/?q=CNPHNTFB').json.get('data')) == 1
676 677
    assert len(app.get('/api/search/tracking-code/?q=BBCCDDFFG').json.get('data')) == 0
677 678

  
679
@wcsctl_present
680
def test_wcs_search_engines(app):
681
    search_engines = engines.get_engines()
682
    assert 'tracking-code' in search_engines.keys()
683
    assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 2
684

  
678 685
@wcsctl_present
679 686
def test_backoffice_submission_cell_render(context):
680 687
    page = Page(title='xxx', slug='test_backoffice_submission_cell_render', template_name='standard')
681
-