summaryrefslogtreecommitdiff
path: root/mirrors/views.py
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2013-04-14 13:59:49 -0500
committerDan McGee <dan@archlinux.org>2013-04-14 13:59:49 -0500
commit0cad22a5eca20ecb64b04d0912592ea6a5361e0d (patch)
tree13288c5b09bfae8e7391e6624a5e941261b9c5d6 /mirrors/views.py
parent4d7d08f93de9e6af9e664a00e090158e738a890c (diff)
Add a JSON view for retrieving mirror check locations
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'mirrors/views.py')
-rw-r--r--mirrors/views.py33
1 files changed, 31 insertions, 2 deletions
diff --git a/mirrors/views.py b/mirrors/views.py
index 07e28d40..30f96b63 100644
--- a/mirrors/views.py
+++ b/mirrors/views.py
@@ -13,7 +13,8 @@ from django.utils.timezone import now
from django.views.decorators.csrf import csrf_exempt
from django_countries.countries import COUNTRIES
-from .models import Mirror, MirrorUrl, MirrorProtocol, MirrorLog
+from .models import (Mirror, MirrorUrl, MirrorProtocol, MirrorLog,
+ CheckLocation)
from .utils import get_mirror_statuses, get_mirror_errors, DEFAULT_CUTOFF
COUNTRY_LOOKUP = dict(COUNTRIES)
@@ -264,7 +265,8 @@ class MirrorStatusJSONEncoder(DjangoJSONEncoder):
class ExtendedMirrorStatusJSONEncoder(MirrorStatusJSONEncoder):
'''Adds URL check history information.'''
- log_attributes = ('check_time', 'last_sync', 'duration', 'is_success')
+ log_attributes = ('check_time', 'last_sync', 'duration', 'is_success',
+ 'location_id')
def default(self, obj):
if isinstance(obj, MirrorUrl):
@@ -292,4 +294,31 @@ def status_json(request, tier=None):
response = HttpResponse(to_json, content_type='application/json')
return response
+
+class LocationJSONEncoder(DjangoJSONEncoder):
+ '''Base JSONEncoder extended to handle CheckLocation objects.'''
+
+ def default(self, obj):
+ if hasattr(obj, '__iter__'):
+ # mainly for queryset serialization
+ return list(obj)
+ if isinstance(obj, CheckLocation):
+ return {
+ 'hostname': obj.hostname,
+ 'source_ip': obj.source_ip,
+ 'country': unicode(obj.country.name),
+ 'country_code': obj.country.code,
+ 'ip_version': obj.ip_version,
+ }
+ return super(LocationJSONEncoder, self).default(obj)
+
+
+def locations_json(request):
+ data = {}
+ data['version'] = 1
+ data['locations'] = CheckLocation.objects.all()
+ to_json = json.dumps(data, ensure_ascii=False, cls=LocationJSONEncoder)
+ response = HttpResponse(to_json, content_type='application/json')
+ return response
+
# vim: set ts=4 sw=4 et: