From 593033b10d083ab601ad2258616675707f8c7019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 9 Aug 2018 18:04:56 +0200 Subject: [PATCH] wcs: add a tracking code search engine (#25625) --- combo/apps/wcs/__init__.py | 9 ++++++++ combo/apps/wcs/urls.py | 3 ++- combo/apps/wcs/views.py | 47 ++++++++++++++++++++++++++++---------- tests/test_search.py | 4 ++-- tests/test_wcs.py | 9 ++++++++ 5 files changed, 57 insertions(+), 15 deletions(-) diff --git a/combo/apps/wcs/__init__.py b/combo/apps/wcs/__init__.py index 9b19e61..1d3ae8f 100644 --- a/combo/apps/wcs/__init__.py +++ b/combo/apps/wcs/__init__.py @@ -15,12 +15,21 @@ # along with this program. If not, see . import django.apps +from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ + class AppConfig(django.apps.AppConfig): name = 'combo.apps.wcs' verbose_name = _('Forms') + def ready(self): + from combo.apps.search import engines + engines.register('tracking-code', + url=reverse('wcs-tracking-code-search') + '?q=%(q)s', + label=_('Tracking Code') + ) + def get_before_urls(self): from . import urls return urls.urlpatterns diff --git a/combo/apps/wcs/urls.py b/combo/apps/wcs/urls.py index 15e814f..1936c0e 100644 --- a/combo/apps/wcs/urls.py +++ b/combo/apps/wcs/urls.py @@ -16,8 +16,9 @@ from django.conf.urls import url -from .views import TrackingCodeView +from .views import TrackingCodeView, tracking_code_search urlpatterns = [ url(r'^tracking-code/$', TrackingCodeView.as_view(), name='wcs-tracking-code'), + url(r'^api/search/tracking-code/$', tracking_code_search, name='wcs-tracking-code-search'), ] diff --git a/combo/apps/wcs/views.py b/combo/apps/wcs/views.py index 89377ac..963d89a 100644 --- a/combo/apps/wcs/views.py +++ b/combo/apps/wcs/views.py @@ -14,9 +14,11 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import re + from django.contrib import messages -from django.http import HttpResponseRedirect, HttpResponseBadRequest -from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse +from django.http import JsonResponse, HttpResponseRedirect, HttpResponseBadRequest from django.utils.six.moves.urllib import parse as urlparse from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt @@ -37,14 +39,10 @@ class TrackingCodeView(View): # sites in a skeleton. return super(TrackingCodeView, self).dispatch(*args, **kwargs) - def post(self, request, *args, **kwargs): - try: - cell = TrackingCodeInputCell.objects.get(id=request.POST['cell']) - except (ValueError, TrackingCodeInputCell.DoesNotExist): - return HttpResponseBadRequest('Invalid cell id') - code = request.POST['code'] - if cell.wcs_site: - wcs_sites = [get_wcs_services().get(cell.wcs_site)] + @classmethod + def search(self, code, wcs_site=None): + if wcs_site: + wcs_sites = [get_wcs_services().get(wcs_site)] else: wcs_sites = get_wcs_services().values() @@ -52,8 +50,20 @@ class TrackingCodeView(View): response = requests.get('/api/code/' + code, remote_service=wcs_site, log_errors=False) if response.status_code == 200 and response.json().get('err') == 0: - url = response.json().get('load_url') - return HttpResponseRedirect(url) + return response.json().get('load_url') + + return None + + def post(self, request, *args, **kwargs): + try: + cell = TrackingCodeInputCell.objects.get(id=request.POST['cell']) + except (ValueError, TrackingCodeInputCell.DoesNotExist): + return HttpResponseBadRequest('Invalid cell id') + code = request.POST['code'] + + url = self.search(code, wcs_site=cell.wcs_site) + if url: + return HttpResponseRedirect(url) next_url = request.POST.get('url') or '/' next_netloc = urlparse.urlparse(next_url).netloc @@ -68,3 +78,16 @@ class TrackingCodeView(View): next_url += 'unknown-tracking-code' return HttpResponseRedirect(next_url) + + +def tracking_code_search(request): + hits = [] + query = request.GET.get('q') or '' + if re.match(r'^[BCDFGHJKLMNPQRSTVWXZ]{8}$', query): + url = TrackingCodeView.search(query) + if url: + hits.append({ + 'text': _('Use tracking code %s') % query, + 'url': url, + }) + return JsonResponse({'data': hits}) diff --git a/tests/test_search.py b/tests/test_search.py index 358b146..276f564 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -296,11 +296,11 @@ def test_manager_search_cell(app, admin_user): 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) == 1 + assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 2 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) == 3 + 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'), diff --git a/tests/test_wcs.py b/tests/test_wcs.py index 2cdf7e0..db85cde 100644 --- a/tests/test_wcs.py +++ b/tests/test_wcs.py @@ -643,3 +643,12 @@ def test_cell_assets(app, admin_user): resp = app.get('/manage/assets/') assert u'>Logo — Test 9<' in resp.text assert u'>Picture — form title<' in resp.text + +@wcsctl_present +def test_tracking_code_search(app): + assert len(app.get('/api/search/tracking-code/').json.get('data')) == 0 + assert len(app.get('/api/search/tracking-code/?q=123').json.get('data')) == 0 + assert len(app.get('/api/search/tracking-code/?q=BBCCDFF').json.get('data')) == 0 + assert len(app.get('/api/search/tracking-code/?q=BBCCDDFF').json.get('data')) == 0 + 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 -- 2.18.0