Projet

Général

Profil

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

Thomas Noël, 27 août 2018 20:23

Télécharger (7,03 ko)

Voir les différences:

Subject: [PATCH 1/8] 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    | 49 ++++++++++++++++++++++++++++----------
 tests/test_search.py       |  4 ++--
 tests/test_wcs.py          |  9 +++++++
 5 files changed, 58 insertions(+), 16 deletions(-)
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_search.py
296 296

  
297 297
    resp = app.get('/manage/pages/%s/' % page.id)
298 298
    assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
299
    assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 1
299
    assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 2
300 300

  
301 301
    with SearchServices(SEARCH_SERVICES):
302 302
        resp = app.get('/manage/pages/%s/' % page.id)
303
        assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 3
303
        assert len(resp.form['c%s-_search_services' % cells[0].get_reference()].options) == 4
304 304
        # simulate reordering of options
305 305
        resp.form['c%s-_search_services' % cells[0].get_reference()].options = [
306 306
                (u'search_tmpl', False, u'Search with template'),
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
-