summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-04-07 21:52:39 +0200
committerDan McGee <dan@archlinux.org>2012-04-07 21:58:28 +0200
commit5d9f87c02bd8ad73fdb27600e0afe71284e3082f (patch)
tree0d24baee0fa28d6bc2bdde2c8b40ce365a941d3e
parent9684e7c095585059033ac29339b058931a6547e3 (diff)
downloadarchweb-5d9f87c02bd8ad73fdb27600e0afe71284e3082f.tar.gz
archweb-5d9f87c02bd8ad73fdb27600e0afe71284e3082f.tar.xz
Add JSON search view
This still might change and should not be viewed as a public API yet. This has been a longstanding request in FS#13026. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--packages/urls.py1
-rw-r--r--packages/views/__init__.py2
-rw-r--r--packages/views/search.py26
3 files changed, 28 insertions, 1 deletions
diff --git a/packages/urls.py b/packages/urls.py
index 7e12a23..6eddc5f 100644
--- a/packages/urls.py
+++ b/packages/urls.py
@@ -22,6 +22,7 @@ urlpatterns = patterns('packages.views',
(r'^update/$', 'update'),
(r'^$', 'search', {}, 'packages-search'),
+ (r'^search/json/$', 'search_json'),
(r'^(?P<page>\d+)/$', 'search'),
(r'^differences/$', 'arch_differences', {}, 'packages-differences'),
diff --git a/packages/views/__init__.py b/packages/views/__init__.py
index 2ed266e..6a9c527 100644
--- a/packages/views/__init__.py
+++ b/packages/views/__init__.py
@@ -20,7 +20,7 @@ from ..utils import (get_group_info, get_differences_info,
# make other views available from this same package
from .flag import flaghelp, flag, flag_confirmed, unflag, unflag_all
-from .search import search
+from .search import search, search_json
from .signoff import signoffs, signoff_package, signoff_options, signoffs_json
diff --git a/packages/views/search.py b/packages/views/search.py
index a23c6b4..a09de0a 100644
--- a/packages/views/search.py
+++ b/packages/views/search.py
@@ -4,11 +4,14 @@ from django import forms
from django.contrib.admin.widgets import AdminDateWidget
from django.contrib.auth.models import User
from django.db.models import Q
+from django.http import HttpResponse
from django.views.generic import list_detail
+from django.utils import simplejson
from main.models import Package, Arch, Repo
from main.utils import make_choice
from ..models import PackageRelation
+from ..utils import PackageJSONEncoder
def coerce_limit_value(value):
@@ -157,4 +160,27 @@ def search(request, page=None):
template_object_name="package",
extra_context=page_dict)
+
+def search_json(request):
+ limit = 250
+
+ container = {
+ 'version': 2,
+ 'limit': limit,
+ 'valid': False,
+ 'results': [],
+ }
+
+ if request.GET:
+ form = PackageSearchForm(data=request.GET)
+ if form.is_valid():
+ packages = Package.objects.normal()
+ packages = parse_form(form, packages)[:limit]
+ container['results'] = packages
+ container['valid'] = True
+
+ to_json = simplejson.dumps(container, ensure_ascii=False,
+ cls=PackageJSONEncoder)
+ return HttpResponse(to_json, mimetype='application/json')
+
# vim: set ts=4 sw=4 et: