wcs: register search engines for formdata of wcs sites (#26260)

This commit is contained in:
Frédéric Péters 2019-01-01 14:08:54 +01:00
parent 9c2e369036
commit 00b6001be7
5 changed files with 61 additions and 25 deletions

View File

@ -19,6 +19,6 @@ from django.conf.urls import url
from .models import SearchCell
urlpatterns = [
url(r'^ajax/search/(?P<cell_pk>\w+)/(?P<service_slug>[\w-]+)/$', SearchCell.ajax_results_view,
url(r'^ajax/search/(?P<cell_pk>\w+)/(?P<service_slug>[\w:-]+)/$', SearchCell.ajax_results_view,
name='combo-search-ajax-results'),
]

View File

@ -14,6 +14,8 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import hashlib
import django.apps
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
@ -28,12 +30,30 @@ class AppConfig(django.apps.AppConfig):
engines.register(self.get_search_engines)
def get_search_engines(self):
return {
from .utils import get_wcs_services
services = get_wcs_services()
if not services:
return
engines = {
'tracking-code': {
'url': reverse('wcs-tracking-code-search') + '?q=%(q)s',
'label': _('Tracking Code'),
}
}
for key, service in services.items():
label = _('Forms')
if len(services.keys()) > 1:
label = _('Forms (%s)') % service['title']
engines['formdata:%s' % hashlib.md5(key).hexdigest()[:8]] = {
'url': service['url'] + 'api/forms/?NameID={{user_nameid}}&status=all&ignore-roles=on&q=%(q)s',
'label': label,
'signature': True,
'hit_url_template': '{% if readable %}{{ form_url_backoffice }}{% endif %}',
'hit_label_template': '{{ title }}',
'hit_description_template': '{{ form_digest|default:"" }}',
}
return engines
def get_before_urls(self):
from . import urls

View File

@ -127,7 +127,7 @@ div.searchcell {
div.combo-search-results-users div.links-list li::before {
content: "\f007"; // user
}
div.combo-search-results-formdata div.links-list li::before {
div[class*="combo-search-results-formdata"] div.links-list li::before {
content: "\f0f6"; // file-text-o
}
div.combo-search-results-tracking-code div.links-list li::before {

View File

@ -12,6 +12,7 @@ from django.core.urlresolvers import reverse
from haystack.exceptions import SkipDocument
from combo.apps.search.engines import engines
from combo.apps.search.models import SearchCell
from combo.data.models import Page, JsonCell, TextCell, MenuCell, LinkCell
from combo.data.search_indexes import PageIndex
@ -338,29 +339,37 @@ def test_manager_search_cell(app, admin_user):
assert len(cells) == 1
assert isinstance(cells[0], SearchCell)
resp = app.get('/manage/pages/%s/' % page.id)
assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 2
with SearchServices(SEARCH_SERVICES):
with override_settings(KNOWN_SERVICES={}):
resp = app.get('/manage/pages/%s/' % page.id)
assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 5
# simulate reordering of options
resp.form['c%s-_search_services' % cells[0].get_reference()].options = [
(u'search_tmpl', False, u'Search with template'),
(u'search_alternate_key', False, u'Search with alternate key'),
(u'_text', False, u'Page Contents'),
(u'search1', False, u'Search 1')]
resp.form['c%s-_search_services' % cells[0].get_reference()].value = ['search_tmpl', '_text']
resp = resp.form.submit()
assert resp.status_int == 302
assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 1
# check selected engines are selected and the first items of the list
with SearchServices(SEARCH_SERVICES):
resp = app.get('/manage/pages/%s/' % page.id)
assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 4
# simulate reordering of options
resp.form['c%s-_search_services' % cells[0].get_reference()].options = [
(u'search_tmpl', False, u'Search with template'),
(u'search_alternate_key', False, u'Search with alternate key'),
(u'_text', False, u'Page Contents'),
(u'search1', False, u'Search 1')]
resp.form['c%s-_search_services' % cells[0].get_reference()].value = ['search_tmpl', '_text']
resp = resp.form.submit()
assert resp.status_int == 302
# check selected engines are selected and the first items of the list
resp = app.get('/manage/pages/%s/' % page.id)
assert set(resp.form['c%s-_search_services' % cells[0].get_reference()].value) == set(['search_tmpl', '_text'])
assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[0][0] == 'search_tmpl'
assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[1][0] == '_text'
# check there's no crash if search engines are removed from config
resp = app.get('/manage/pages/%s/' % page.id)
assert set(resp.form['c%s-_search_services' % cells[0].get_reference()].value) == set(['search_tmpl', '_text'])
assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[0][0] == 'search_tmpl'
assert resp.form['c%s-_search_services' % cells[0].get_reference()].options[1][0] == '_text'
assert resp.form['c%s-_search_services' % cells[0].get_reference()].value == ['_text']
# check there's no crash if search engines are removed from config
resp = app.get('/manage/pages/%s/' % page.id)
assert resp.form['c%s-_search_services' % cells[0].get_reference()].value == ['_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

View File

@ -19,6 +19,7 @@ from django.test.client import RequestFactory
from django.utils.six.moves.urllib import parse as urlparse
from combo.data.models import Page
from combo.apps.search.engines import engines
from combo.apps.wcs.models import (WcsFormCell, WcsCurrentFormsCell,
WcsFormsOfCategoryCell, WcsCurrentDraftsCell, WcsCategoryCell,
TrackingCodeInputCell, BackofficeSubmissionCell)
@ -675,6 +676,12 @@ def test_tracking_code_search(app):
assert len(app.get('/api/search/tracking-code/?q=CNPHNTFB').json.get('data')) == 1
assert len(app.get('/api/search/tracking-code/?q=BBCCDDFFG').json.get('data')) == 0
@wcsctl_present
def test_wcs_search_engines(app):
search_engines = engines.get_engines()
assert 'tracking-code' in search_engines.keys()
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 2
@wcsctl_present
def test_backoffice_submission_cell_render(context):
page = Page(title='xxx', slug='test_backoffice_submission_cell_render', template_name='standard')