Skip to content

Commit

Permalink
Add related-URLs support
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelmulley committed Jan 17, 2012
1 parent 89d2dd9 commit cd75c31
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 11 deletions.
17 changes: 15 additions & 2 deletions boundaryservice/base_views.py
Expand Up @@ -4,6 +4,7 @@
import re

from django.contrib.gis.measure import D
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse, Http404, HttpResponseForbidden
from django.template.defaultfilters import escapejs
from django.utils import simplejson as json
Expand Down Expand Up @@ -78,6 +79,9 @@ def filter(self, request, qs):
qs = qs.filter(**{filter_field + '__' + filter_type: val})
return qs

def get_related_resources(self, request, qs, meta):
return {}

def get(self, request, **kwargs):
qs = self.get_qs(request, **kwargs)
qs = self.filter(request, qs)
Expand All @@ -86,6 +90,9 @@ def get(self, request, **kwargs):
paginator = Paginator(request.GET, qs, resource_uri=request.path)
result = paginator.page()
result['objects'] = self.model.get_dicts(result['objects'])
related = self.get_related_resources(request, qs, result['meta'])
if related:
result['meta']['related'] = related
return result

class ModelGeoListView(ModelListView):
Expand Down Expand Up @@ -175,7 +182,10 @@ def __init__(self):
self.base_qs = self.model.objects.all()

def get(self, request, **kwargs):
return self.get_object(request, self.base_qs, **kwargs).as_dict()
try:
return self.get_object(request, self.base_qs, **kwargs).as_dict()
except ObjectDoesNotExist:
raise Http404

class ModelGeoDetailView(ModelDetailView):
"""Adds geospatial support to ModelDetailView
Expand All @@ -197,7 +207,10 @@ def get(self, request, **kwargs):
if field not in self.allowed_geo_fields:
raise Http404

obj = self.get_object(request, self.base_qs.only(field, self.name_field), **kwargs)
try:
obj = self.get_object(request, self.base_qs.only(field, self.name_field), **kwargs)
except ObjectDoesNotExist:
raise Http404

geom = getattr(obj, field)
name = getattr(obj, self.name_field)
Expand Down
24 changes: 20 additions & 4 deletions boundaryservice/models.py
Expand Up @@ -52,7 +52,9 @@ def __unicode__(self):

def as_dict(self):
r = {
'boundaries_url': urlresolvers.reverse('boundaryservice_boundary_list', kwargs={'set_slug': self.slug}),
'related': {
'boundaries_url': urlresolvers.reverse('boundaryservice_boundary_list', kwargs={'set_slug': self.slug}),
},
'last_updated': unicode(self.last_updated),
}
for f in ('name', 'singular', 'authority', 'domain', 'source_url', 'notes'):
Expand All @@ -64,7 +66,9 @@ def get_dicts(sets):
return [
{
'url': urlresolvers.reverse('boundaryservice_set_detail', kwargs={'slug': s.slug}),
'boundaries_url': urlresolvers.reverse('boundaryservice_boundary_list', kwargs={'set_slug': s.slug}),
'related': {
'boundaries_url': urlresolvers.reverse('boundaryservice_boundary_list', kwargs={'set_slug': s.slug}),
},
'name': s.name,
'domain': s.domain,
} for s in sets
Expand Down Expand Up @@ -104,9 +108,19 @@ def save(self, *args, **kwargs):
def __unicode__(self):
return u"%s (%s)" % (self.name, self.set_name)

@models.permalink
def get_absolute_url(self):
return 'boundaryservice_boundary_detail', [], {'set_slug': self.set_id, 'slug': self.slug}

def as_dict(self):
my_url = self.get_absolute_url()
return {
'set_url': urlresolvers.reverse('boundaryservice_set_detail', kwargs={'slug': self.set_id}),
'related': {
'boundary_set_url': urlresolvers.reverse('boundaryservice_set_detail', kwargs={'slug': self.set_id}),
'shape_url': my_url + 'shape',
'centroid_url': my_url + 'centroid',
'simple_shape_url': my_url + 'simple_shape'
},
'set_name': self.set_name,
'name': self.name,
'metadata': self.metadata,
Expand All @@ -123,7 +137,9 @@ def get_dicts(boundaries):
{
'url': urlresolvers.reverse('boundaryservice_boundary_detail', kwargs={'slug': b[0], 'set_slug': b[1]}),
'name': b[2],
'set_url': urlresolvers.reverse('boundaryservice_set_detail', kwargs={'slug': b[1]}),
'related': {
'boundary_set_url': urlresolvers.reverse('boundaryservice_set_detail', kwargs={'slug': b[1]}),
},
'set_name': b[3],
} for b in boundaries
]
Expand Down
12 changes: 8 additions & 4 deletions boundaryservice/urls.py
Expand Up @@ -6,9 +6,13 @@
url(r'^boundary-sets/$', BoundarySetListView.as_view(), name='boundaryservice_set_list'),
url(r'^boundary-sets/(?P<slug>[\w_-]+)/$', BoundarySetDetailView.as_view(), name='boundaryservice_set_detail'),
url(r'^boundaries/$', BoundaryListView.as_view(), name='boundaryservice_boundary_list'),
url(r'^boundaries/(?P<geo_field>shape|simple_shape|centroid)$', BoundaryListView.as_view()),
url(r'^boundaries/(?P<geo_field>shape|simple_shape|centroid)$', BoundaryListView.as_view(),
name='boundaryservice_boundary_list'),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/$', BoundaryListView.as_view(), name='boundaryservice_boundary_list'),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/(?P<geo_field>shape|simple_shape|centroid)$', BoundaryListView.as_view()),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', BoundaryDetailView.as_view(), name='boundaryservice_boundary_detail'),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/(?P<slug>[\w_-]+)/(?P<geo_field>shape|simple_shape|centroid)$', BoundaryGeoDetailView.as_view()),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/(?P<geo_field>shape|simple_shape|centroid)$', BoundaryListView.as_view(),
name='boundaryservice_boundary_list'),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', BoundaryDetailView.as_view(),
name='boundaryservice_boundary_detail'),
url(r'^boundaries/(?P<set_slug>[\w_-]+)/(?P<slug>[\w_-]+)/(?P<geo_field>shape|simple_shape|centroid)$',
BoundaryGeoDetailView.as_view(), name='boundaryservice_boundary_detail'),
)
19 changes: 18 additions & 1 deletion boundaryservice/views.py
Expand Up @@ -3,7 +3,7 @@

from boundaryservice.base_views import (ModelListView, ModelDetailView,
ModelGeoListView, ModelGeoDetailView)
from boundaryservice.models import BoundarySet, Boundary
from boundaryservice.models import BoundarySet, Boundary, app_settings

class BoundarySetListView(ModelListView):
""" e.g. /boundary-set/ """
Expand Down Expand Up @@ -65,6 +65,23 @@ def get_qs(self, request, set_slug=None):
return qs.filter(set=set_slug)
return qs

def get_related_resources(self, request, qs, meta):
r = super(BoundaryListView, self).get_related_resources(request, qs, meta)
if meta['total_count'] == 0 or meta['total_count'] > app_settings.MAX_GEO_LIST_RESULTS:
return r

geo_url = request.path + r'%s'
if request.META['QUERY_STRING']:
geo_url += '?' + request.META['QUERY_STRING']

r.update(
shapes_url=geo_url % 'shape',
simple_shapes_url=geo_url % 'simple_shape',
centroids_url=geo_url % 'centroid'
)
return r


class BoundaryObjectGetterMixin(object):

model = Boundary
Expand Down

0 comments on commit cd75c31

Please sign in to comment.