Releng release JSON view

FS#35049.

Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Dan McGee 2013-05-10 18:22:19 -05:00
parent 7c70083ed5
commit 35a44f7ca7
2 changed files with 47 additions and 0 deletions

View File

@ -14,6 +14,8 @@
releases_patterns = patterns('releng.views',
(r'^$',
ReleaseListView.as_view(), {}, 'releng-release-list'),
(r'^json/$',
'releases_json', {}, 'releng-release-list-json'),
(r'^(?P<version>[-.\w]+)/$',
ReleaseDetailView.as_view(), {}, 'releng-release-detail'),
(r'^(?P<version>[-.\w]+)/torrent/$',

View File

@ -1,7 +1,10 @@
from base64 import b64decode
import json
from django import forms
from django.conf import settings
from django.core.serializers.json import DjangoJSONEncoder
from django.core.urlresolvers import reverse
from django.db.models import Count, Max
from django.http import Http404, HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
@ -238,4 +241,46 @@ def release_torrent(request, version):
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response
class ReleaseJSONEncoder(DjangoJSONEncoder):
release_attributes = ('release_date', 'version', 'kernel_version',
'created', 'md5_sum', 'sha1_sum')
def default(self, obj):
if hasattr(obj, '__iter__'):
# mainly for queryset serialization
return list(obj)
if isinstance(obj, Release):
data = {attr: getattr(obj, attr) or None
for attr in self.release_attributes}
data['available'] = obj.available
data['iso_url'] = '/' + obj.iso_url()
data['magnet_uri'] = obj.magnet_uri()
data['torrent_url'] = reverse('releng-release-torrent', args=[obj.version])
data['info'] = obj.info_html()
torrent_data = obj.torrent()
if torrent_data:
torrent_data.pop('url_list', None)
data['torrent'] = torrent_data
return data
return super(ReleaseJSONEncoder, self).default(obj)
def releases_json(request):
releases = Release.objects.all()
try:
latest_version = Release.objects.filter(available=True).values_list(
'version', flat=True).latest()
except Release.DoesNotExist:
latest_version = None
data = {
'version': 1,
'releases': releases,
'latest_version': latest_version,
}
to_json = json.dumps(data, ensure_ascii=False, cls=ReleaseJSONEncoder)
response = HttpResponse(to_json, content_type='application/json')
return response
# vim: set ts=4 sw=4 et: