Heya,
Thanks for the quick review
On Thu, 20 Aug 2015 13:47:07 +0200 Raphael Hertzog <hertzog@debian.org>
wrote:
> First, the form that actually requires this view is only in
> distro_tracker.vendor.debian Django application. So the view
> should be in the same application. You should create
> distro_tracker/vendor/debian/views.py and put the view there.
>
> Then you should create distro_tracker/vendor/debian/tracker_urls.py
> with an "urlpatterns" attribute similar to the one available
> in distro_tracker/project/urls.py. It will be auto-imported there
> by some code at the end of this file (look for the loop over
> INSTALLED_APPS).
I was thinking doing this in the first place but I wasn't sure how to
include them so thanks for the clarification
> Then it would be nice if you could create a few unit tests ensuring
> that the view is actually working as expected:
> - submit simple valid data and ensure you are redirected where you want
> - submit valid data that needs to be urlencoded and ensure it works the
> way it should
> - submit invalid data ("q" arg missing, "package" arg missing) and ensures
> the page displayed has some sort of error message (and possibly use
> something else than HTTP 404 which is misleading, better use
> HttpResponseBadRequest)
>
Added some tests as well, hope they are what you suggested.
I attached the new patch as well.
Cheers,
Orestis
From 1c8538a7e4b53b122c8927b40ad2acdf81dfe857 Mon Sep 17 00:00:00 2001
From: Orestis Ioannou <orestis@oioannou.com>
Date: Fri, 21 Aug 2015 22:32:15 +0200
Subject: [PATCH] vendor/debian: Replace old PTS cgi script for codesearch
---
distro_tracker/vendor/debian/tests.py | 36 ++++++++++++++++++++++++++
distro_tracker/vendor/debian/tracker_panels.py | 4 +--
distro_tracker/vendor/debian/tracker_urls.py | 23 ++++++++++++++++
distro_tracker/vendor/debian/views.py | 33 +++++++++++++++++++++++
4 files changed, 94 insertions(+), 2 deletions(-)
create mode 100644 distro_tracker/vendor/debian/tracker_urls.py
create mode 100644 distro_tracker/vendor/debian/views.py
diff --git a/distro_tracker/vendor/debian/tests.py b/distro_tracker/vendor/debian/tests.py
index 4ef60f2..55d39da 100644
--- a/distro_tracker/vendor/debian/tests.py
+++ b/distro_tracker/vendor/debian/tests.py
@@ -24,6 +24,7 @@ from django.utils import six
from django.utils.six.moves import mock
from django.utils.encoding import force_bytes
from django.utils.functional import curry
+from django.utils.http import urlencode
from distro_tracker.mail.tests.tests_dispatch \
import DispatchTestHelperMixin, DispatchBaseTest
from distro_tracker.accounts.models import User
@@ -2713,6 +2714,41 @@ class CodeSearchLinksTest(TestCase):
self.assertFalse(self.browse_link_in_content(response_content))
self.assertFalse(self.search_form_in_content(response_content))
+ def test_code_search_view(self):
+ """
+ Tests that both required parameters are present and not empty and that
+ urlencode works properly.
+ """
+ # missing query paramter
+ response = self.client.get(reverse('dtracker-code-search'),
+ {'package': self.package.name})
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('Both package and query are required parameters',
+ response.content.decode('utf-8'))
+ # missing package parameter
+ response = self.client.get(reverse('dtracker-code-search'),
+ {'query': 'def'})
+ self.assertEqual(response.status_code, 400)
+ # empty query
+ response = self.client.get(reverse('dtracker-code-search'),
+ {'package': self.package.name,
+ 'query': ''})
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('Empty query is not allowed',
+ response.content.decode('utf-8'))
+ # redirection to codesearch
+ response = self.client.get(reverse('dtracker-code-search'),
+ {'package': self.package.name,
+ 'query': 'def'})
+ self.assertEqual(response.status_code, 302)
+ self.assertIn('codesearch.debian', response['Location'])
+ # verify url encoding
+ cs = 'https://codesearch.debian.net/search?'
+ search = 'def' + ' package:' + self.package.name
+ url = cs + urlencode({'q': search})
+ self.assertEqual('https://codesearch.debian.net/search?q=def+package%3A'
+ 'dummy', url)
+
class PopconLinkTest(TestCase):
diff --git a/distro_tracker/vendor/debian/tracker_panels.py b/distro_tracker/vendor/debian/tracker_panels.py
index a8d436a..cdfb400 100644
--- a/distro_tracker/vendor/debian/tracker_panels.py
+++ b/distro_tracker/vendor/debian/tracker_panels.py
@@ -132,10 +132,10 @@ class SourceCodeSearchLinks(LinksPanel.ItemProvider):
SOURCES_URL_TEMPLATE = 'https://sources.debian.net/src/{package}/{suite}/'
SEARCH_FORM_TEMPLATE = (
'<form class="code-search-form"'
- ' action="https://packages.qa.debian.org/cgi-bin/codesearch.cgi"'
+ ' action="/codesearch/"'
' method="get" target="_blank">'
'<input type="hidden" name="package" value="{package}">'
- '<input type="text" name="q" placeholder="search source code">'
+ '<input type="text" name="query" placeholder="search source code">'
'</form>')
def get_panel_items(self):
diff --git a/distro_tracker/vendor/debian/tracker_urls.py b/distro_tracker/vendor/debian/tracker_urls.py
new file mode 100644
index 0000000..022b210
--- /dev/null
+++ b/distro_tracker/vendor/debian/tracker_urls.py
@@ -0,0 +1,23 @@
+# Copyright 2015 The Distro Tracker Developers
+# See the COPYRIGHT file at the top-level directory of this distribution and
+# at http://deb.li/DTAuthors
+#
+# This file is part of Distro Tracker. It is subject to the license terms
+# in the LICENSE file found in the top-level directory of this
+# distribution and at http://deb.li/DTLicense. No part of Distro Tracker,
+# including this file, may be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+"""The URL routes for the vendor.debian app."""
+from __future__ import unicode_literals
+
+from django.conf.urls import patterns, url
+
+from distro_tracker.vendor.debian.views import CodeSearchView
+
+
+urlpatterns = patterns(
+ '',
+ # code search
+ url(r'^codesearch/$', CodeSearchView.as_view(),
+ name='dtracker-code-search'),
+)
diff --git a/distro_tracker/vendor/debian/views.py b/distro_tracker/vendor/debian/views.py
new file mode 100644
index 0000000..aed16f2
--- /dev/null
+++ b/distro_tracker/vendor/debian/views.py
@@ -0,0 +1,33 @@
+# Copyright 2015 The Distro Tracker Developers
+# See the COPYRIGHT file at the top-level directory of this distribution and
+# at http://deb.li/DTAuthors
+#
+# This file is part of Distro Tracker. It is subject to the license terms
+# in the LICENSE file found in the top-level directory of this
+# distribution and at http://deb.li/DTLicense. No part of Distro Tracker,
+# including this file, may be copied, modified, propagated, or distributed
+# except according to the terms contained in the LICENSE file.
+"""Views for the :mod:`distro_tracker.vendor` app."""
+from __future__ import unicode_literals
+
+from django.utils.http import urlencode
+from django.views.generic import View
+from django.http import HttpResponseBadRequest
+from django.shortcuts import redirect
+
+
+class CodeSearchView(View):
+
+ def get(self, request):
+ if 'query' not in request.GET or 'package' not in request.GET:
+ return HttpResponseBadRequest('Both package and query are required '
+ 'parameters')
+ if request.GET.get('query') == "":
+ return HttpResponseBadRequest('Empty query is not allowed')
+ q = request.GET.get('query')
+ package = request.GET.get('package')
+ cs = 'https://codesearch.debian.net/search?'
+ search = q + ' package:' + package
+
+ url = cs + urlencode({'q': search})
+ return redirect(url)
--
2.1.4
Attachment:
signature.asc
Description: OpenPGP digital signature