0001-wcs-add-a-tracking-code-search-engine-25625.patch
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 | ||
---|---|---|
15 | 15 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | |
17 | 17 |
import django.apps |
18 |
from django.core.urlresolvers import reverse |
|
18 | 19 |
from django.utils.translation import ugettext_lazy as _ |
19 | 20 | |
21 | ||
20 | 22 |
class AppConfig(django.apps.AppConfig): |
21 | 23 |
name = 'combo.apps.wcs' |
22 | 24 |
verbose_name = _('Forms') |
23 | 25 | |
26 |
def ready(self): |
|
27 |
from combo.apps.search import engines |
|
28 |
engines.register('tracking-code', |
|
29 |
url=reverse('wcs-tracking-code-search') + '?q=%(q)s', |
|
30 |
label=_('Tracking Code') |
|
31 |
) |
|
32 | ||
24 | 33 |
def get_before_urls(self): |
25 | 34 |
from . import urls |
26 | 35 |
return urls.urlpatterns |
combo/apps/wcs/urls.py | ||
---|---|---|
16 | 16 | |
17 | 17 |
from django.conf.urls import url |
18 | 18 | |
19 |
from .views import TrackingCodeView |
|
19 |
from .views import TrackingCodeView, tracking_code_search
|
|
20 | 20 | |
21 | 21 |
urlpatterns = [ |
22 | 22 |
url(r'^tracking-code/$', TrackingCodeView.as_view(), name='wcs-tracking-code'), |
23 |
url(r'^api/search/tracking-code/$', tracking_code_search, name='wcs-tracking-code-search'), |
|
23 | 24 |
] |
combo/apps/wcs/views.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 re |
|
18 | ||
17 | 19 |
from django.contrib import messages |
18 |
from django.http import HttpResponseRedirect, HttpResponseBadRequest
|
|
19 |
from django.http import HttpResponseRedirect
|
|
20 |
from django.core.urlresolvers import reverse
|
|
21 |
from django.http import JsonResponse, HttpResponseRedirect, HttpResponseBadRequest
|
|
20 | 22 |
from django.utils.six.moves.urllib import parse as urlparse |
21 | 23 |
from django.utils.translation import ugettext_lazy as _ |
22 | 24 |
from django.views.decorators.csrf import csrf_exempt |
... | ... | |
37 | 39 |
# sites in a skeleton. |
38 | 40 |
return super(TrackingCodeView, self).dispatch(*args, **kwargs) |
39 | 41 | |
40 |
def post(self, request, *args, **kwargs): |
|
41 |
try: |
|
42 |
cell = TrackingCodeInputCell.objects.get(id=request.POST['cell']) |
|
43 |
except (ValueError, TrackingCodeInputCell.DoesNotExist): |
|
44 |
return HttpResponseBadRequest('Invalid cell id') |
|
45 |
code = request.POST['code'] |
|
46 |
if cell.wcs_site: |
|
47 |
wcs_sites = [get_wcs_services().get(cell.wcs_site)] |
|
42 |
@classmethod |
|
43 |
def search(self, code, wcs_site=None): |
|
44 |
if wcs_site: |
|
45 |
wcs_sites = [get_wcs_services().get(wcs_site)] |
|
48 | 46 |
else: |
49 | 47 |
wcs_sites = get_wcs_services().values() |
50 | 48 | |
... | ... | |
52 | 50 |
response = requests.get('/api/code/' + code, |
53 | 51 |
remote_service=wcs_site, log_errors=False) |
54 | 52 |
if response.status_code == 200 and response.json().get('err') == 0: |
55 |
url = response.json().get('load_url') |
|
56 |
return HttpResponseRedirect(url) |
|
53 |
return response.json().get('load_url') |
|
54 | ||
55 |
return None |
|
56 | ||
57 |
def post(self, request, *args, **kwargs): |
|
58 |
try: |
|
59 |
cell = TrackingCodeInputCell.objects.get(id=request.POST['cell']) |
|
60 |
except (ValueError, TrackingCodeInputCell.DoesNotExist): |
|
61 |
return HttpResponseBadRequest('Invalid cell id') |
|
62 |
code = request.POST['code'] |
|
63 | ||
64 |
url = self.search(code, wcs_site=cell.wcs_site) |
|
65 |
if url: |
|
66 |
return HttpResponseRedirect(url) |
|
57 | 67 | |
58 | 68 |
next_url = request.POST.get('url') or '/' |
59 | 69 |
next_netloc = urlparse.urlparse(next_url).netloc |
60 |
if not (next_netloc and next_netloc != urlparse.urlparse(request.build_absolute_uri()).netloc): |
|
70 |
if not (next_netloc and next_netloc != urlparse.urlparse(self.request.build_absolute_uri()).netloc):
|
|
61 | 71 |
messages.error(self.request, |
62 | 72 |
_(u'The tracking code could not been found.')) |
63 | 73 |
else: |
... | ... | |
68 | 78 |
next_url += 'unknown-tracking-code' |
69 | 79 | |
70 | 80 |
return HttpResponseRedirect(next_url) |
81 | ||
82 | ||
83 |
def tracking_code_search(request): |
|
84 |
hits = [] |
|
85 |
query = request.GET.get('q') or '' |
|
86 |
if re.match(r'^[BCDFGHJKLMNPQRSTVWXZ]{8}$', query): |
|
87 |
url = TrackingCodeView.search(query) |
|
88 |
if url: |
|
89 |
hits.append({ |
|
90 |
'text': _('Use tracking code %s') % query, |
|
91 |
'url': url, |
|
92 |
}) |
|
93 |
return JsonResponse({'data': hits}) |
tests/test_wcs.py | ||
---|---|---|
643 | 643 |
resp = app.get('/manage/assets/') |
644 | 644 |
assert u'>Logo — Test 9<' in resp.text |
645 | 645 |
assert u'>Picture — form title<' in resp.text |
646 | ||
647 |
@wcsctl_present |
|
648 |
def test_tracking_code_search(app): |
|
649 |
assert len(app.get('/api/search/tracking-code/').json.get('data')) == 0 |
|
650 |
assert len(app.get('/api/search/tracking-code/?q=123').json.get('data')) == 0 |
|
651 |
assert len(app.get('/api/search/tracking-code/?q=BBCCDFF').json.get('data')) == 0 |
|
652 |
assert len(app.get('/api/search/tracking-code/?q=BBCCDDFF').json.get('data')) == 0 |
|
653 |
assert len(app.get('/api/search/tracking-code/?q=CNPHNTFB').json.get('data')) == 1 |
|
654 |
assert len(app.get('/api/search/tracking-code/?q=BBCCDDFFG').json.get('data')) == 0 |
|
646 |
- |