[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH 2/5] opensearch: make the completion compatible with OpenSearch



OpenSearch completion expects an array containing the following
elements:

 - the prefix
 - the list of completions
 - the list of descriptions (optional)
 - the list of URL (optional)

See:
 http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.0
---
 distro_tracker/core/static/js/main.js    | 10 ++++++++--
 distro_tracker/core/tests/tests_views.py | 30 +++++++++++++++++++++---------
 distro_tracker/core/views.py             |  4 +++-
 3 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/distro_tracker/core/static/js/main.js b/distro_tracker/core/static/js/main.js
index d13e2ee6cbdd..3eee6aa17eb4 100644
--- a/distro_tracker/core/static/js/main.js
+++ b/distro_tracker/core/static/js/main.js
@@ -15,14 +15,20 @@ $(function() {
     $('#package-search-input, .package-search-input').typeahead([
         {
             name: 'source-packages',
-            remote: '/api/package/search/autocomplete?q=%QUERY&package_type=source',
+            remote: {
+                url: '/api/package/search/autocomplete?q=%QUERY&package_type=source',
+                filter: function(r) { return r[1]; }
+            },
             header: '<h5 class="text-center typeahead-package-title">Source packages</h5>',
             // Use a slightly larger delay between requests than the default
             rateLimitWait: 500
         },
         {
             name: 'pseudo-packages',
-            remote: '/api/package/search/autocomplete?q=%QUERY&package_type=pseudo',
+            remote: {
+                url: '/api/package/search/autocomplete?q=%QUERY&package_type=pseudo',
+                filter: function(r) { return r[1]; }
+            },
             header: '<h5 class="text-center typeahead-package-title">Pseudo Packages</h5>',
             // Use a slightly larger delay between requests than the default
             rateLimitWait: 500
diff --git a/distro_tracker/core/tests/tests_views.py b/distro_tracker/core/tests/tests_views.py
index ab4bf0848e97..9d8db7c92d1c 100644
--- a/distro_tracker/core/tests/tests_views.py
+++ b/distro_tracker/core/tests/tests_views.py
@@ -279,8 +279,10 @@ class PackageAutocompleteViewTest(TestCase):
 
         response = json.loads(response.content.decode('utf-8'))
         self.assertEqual(len(response), 2)
-        self.assertIn('dummy-package', response)
-        self.assertIn('d-package', response)
+        self.assertEqual(response[0], 'd')
+        self.assertEqual(len(response[1]), 2)
+        self.assertIn('dummy-package', response[1])
+        self.assertIn('d-package', response[1])
 
         # No packages given when there are no matching source packages
         response = self.client.get(reverse('dtracker-api-package-autocomplete'), {
@@ -288,7 +290,9 @@ class PackageAutocompleteViewTest(TestCase):
             'q': 'z',
         })
         response = json.loads(response.content.decode('utf-8'))
-        self.assertEqual(len(response), 0)
+        self.assertEqual(len(response), 2)
+        self.assertEqual(response[0], 'z')
+        self.assertEqual(len(response[1]), 0)
 
     def test_pseudo_package_autocomplete(self):
         """
@@ -301,8 +305,10 @@ class PackageAutocompleteViewTest(TestCase):
         })
 
         response = json.loads(response.content.decode('utf-8'))
-        self.assertEqual(len(response), 1)
-        self.assertIn('pseudo-package', response)
+        self.assertEqual(len(response), 2)
+        self.assertEqual(response[0], 'p')
+        self.assertEqual(len(response[1]), 1)
+        self.assertIn('pseudo-package', response[1])
 
         # No packages given when there are no matching pseudo packages
         response = self.client.get(reverse('dtracker-api-package-autocomplete'), {
@@ -310,7 +316,9 @@ class PackageAutocompleteViewTest(TestCase):
             'q': '-',
         })
         response = json.loads(response.content.decode('utf-8'))
-        self.assertEqual(len(response), 0)
+        self.assertEqual(len(response), 2)
+        self.assertEqual(response[0], '-')
+        self.assertEqual(len(response[1]), 0)
 
     def test_all_packages_autocomplete(self):
         """
@@ -323,15 +331,19 @@ class PackageAutocompleteViewTest(TestCase):
 
         response = json.loads(response.content.decode('utf-8'))
         self.assertEqual(len(response), 2)
-        self.assertIn('package', response)
-        self.assertIn('pseudo-package', response)
+        self.assertEqual(response[0], 'p')
+        self.assertEqual(len(response[1]), 2)
+        self.assertIn('package', response[1])
+        self.assertIn('pseudo-package', response[1])
 
         # No packages given when there are no matching packages
         response = self.client.get(reverse('dtracker-api-package-autocomplete'), {
             'q': '-',
         })
         response = json.loads(response.content.decode('utf-8'))
-        self.assertEqual(len(response), 0)
+        self.assertEqual(len(response), 2)
+        self.assertEqual(response[0], '-')
+        self.assertEqual(len(response[1]), 0)
 
     def test_no_query_given(self):
         """
diff --git a/distro_tracker/core/views.py b/distro_tracker/core/views.py
index 1b54f82e40dd..0622ce34259e 100644
--- a/distro_tracker/core/views.py
+++ b/distro_tracker/core/views.py
@@ -147,7 +147,9 @@ class PackageAutocompleteView(View):
         # Limit the number of packages returned from the autocomplete
         AUTOCOMPLETE_ITEMS_LIMIT = 10
         filtered = filtered[:AUTOCOMPLETE_ITEMS_LIMIT]
-        return render_to_json_response([package['name'] for package in filtered])
+        return render_to_json_response([query_string,
+                                        [package['name']
+                                         for package in filtered]])
 
 
 def news_page(request, news_id):
-- 
2.0.1


Reply to: