wcs: add a tracking code search engine (#25625)

This commit is contained in:
Frédéric Péters 2018-08-09 18:04:56 +02:00 committed by Thomas NOEL
parent 28a2dab203
commit 3eb37ec764
5 changed files with 58 additions and 16 deletions

View File

@ -15,12 +15,21 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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

View File

@ -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'),
]

View File

@ -14,9 +14,11 @@
# 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 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,12 +50,24 @@ 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
if not (next_netloc and next_netloc != urlparse.urlparse(request.build_absolute_uri()).netloc):
if not (next_netloc and next_netloc != urlparse.urlparse(self.request.build_absolute_uri()).netloc):
messages.error(self.request,
_(u'The tracking code could not been found.'))
else:
@ -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})

View File

@ -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'),

View File

@ -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