Projet

Général

Profil

0001-wcs-add-a-tracking-code-search-engine-25625.patch

Frédéric Péters, 09 août 2018 18:24

Télécharger (6,53 ko)

Voir les différences:

Subject: [PATCH] wcs: add a tracking code search engine (#25625)

 combo/apps/search/urls.py  |  2 +-
 combo/apps/wcs/__init__.py |  9 +++++++
 combo/apps/wcs/urls.py     |  3 ++-
 combo/apps/wcs/views.py    | 49 ++++++++++++++++++++++++++++----------
 tests/test_wcs.py          |  9 +++++++
 5 files changed, 57 insertions(+), 15 deletions(-)
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
-