summaryrefslogtreecommitdiffstats
path: root/mirrors
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2013-04-14 20:59:49 +0200
committerDan McGee <dan@archlinux.org>2013-04-14 20:59:49 +0200
commit0cad22a5eca20ecb64b04d0912592ea6a5361e0d (patch)
tree13288c5b09bfae8e7391e6624a5e941261b9c5d6 /mirrors
parent4d7d08f93de9e6af9e664a00e090158e738a890c (diff)
downloadarchweb-0cad22a5eca20ecb64b04d0912592ea6a5361e0d.tar.gz
archweb-0cad22a5eca20ecb64b04d0912592ea6a5361e0d.tar.xz
Add a JSON view for retrieving mirror check locations
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'mirrors')
-rw-r--r--mirrors/urls.py1
-rw-r--r--mirrors/views.py33
2 files changed, 32 insertions, 2 deletions
diff --git a/mirrors/urls.py b/mirrors/urls.py
index 4e92941..7cf76aa 100644
--- a/mirrors/urls.py
+++ b/mirrors/urls.py
@@ -6,6 +6,7 @@ urlpatterns = patterns('mirrors.views',
(r'^status/json/$', 'status_json', {}, 'mirror-status-json'),
(r'^status/tier/(?P<tier>\d+)/$', 'status', {}, 'mirror-status-tier'),
(r'^status/tier/(?P<tier>\d+)/json/$', 'status_json', {}, 'mirror-status-tier-json'),
+ (r'^locations/json/$', 'locations_json', {}, 'mirror-locations-json'),
(r'^(?P<name>[\.\-\w]+)/$', 'mirror_details'),
(r'^(?P<name>[\.\-\w]+)/json/$', 'mirror_details_json'),
)
diff --git a/mirrors/views.py b/mirrors/views.py
index 07e28d4..30f96b6 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: