wcs: add a tracking code search engine (#25625)
This commit is contained in:
parent
28a2dab203
commit
3eb37ec764
|
@ -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
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue