Skip to content

Commit 1491368

Browse files
committed
Allowing for xml or json using formatted urls.
1 parent c35fe5b commit 1491368

File tree

3 files changed

+63
-27
lines changed

3 files changed

+63
-27
lines changed

mainapp/views/json.py

Lines changed: 0 additions & 25 deletions
This file was deleted.

mainapp/views/rest.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from contrib.django_restapi.model_resource import Collection
2+
from contrib.django_restapi.responder import JSONResponder, XMLResponder
3+
from django.contrib.gis.geos import fromstr
4+
from django.contrib.gis.measure import D
5+
from django.forms.util import ErrorDict
6+
7+
from mainapp.models import Report
8+
9+
10+
class RestCollection(Collection):
11+
''' Subclasses Collection to provide multiple responders '''
12+
def __init__(self, queryset, responders=None, **kwargs):
13+
'''
14+
Replaces the responder in Collection.__init__ with responders, which
15+
maybe a list of responders or None. In the case of None, default
16+
responders are allocated to the colelction.
17+
18+
See Collection.__init__ for more details
19+
'''
20+
if responders is None:
21+
responders = {
22+
'json' : JSONResponder(),
23+
'xml' :XMLResponder(),
24+
}
25+
self.responders = {}
26+
for k, r in responders.items():
27+
Collection.__init__(self, queryset, r, **kwargs)
28+
self.responders[k] = self.responder
29+
30+
def __call__(self, request, format, *args, **kwargs):
31+
'''
32+
urls.py must contain .(?P<format>\w+) at the end of the url
33+
for rest resources, such that it would match one of the keys
34+
in self.responders
35+
'''
36+
if format in self.responders:
37+
self.responder = self.responders[format]
38+
return Collection.__call__(self, request, *args, **kwargs)
39+
errors = ErrorDict(
40+
{'info': ['Requested content type "%s" not available!' %format]})
41+
# Using the last used responder to reutrn a 415
42+
return self.responder.error(request, 415, errors)
43+
44+
45+
class ReportRest(RestCollection):
46+
47+
def read(self, request):
48+
lon = request.GET["lon"]
49+
lat = request.GET["lat"]
50+
radius = float(request.GET.get('r', 4))
51+
point_str = "POINT(%s %s)" %(lon, lat)
52+
pnt = fromstr(point_str, srid=4326)
53+
reports = Report.objects.filter(is_confirmed = True,point__distance_lte=(pnt,D(km=radius))).distance(pnt).order_by('distance')
54+
return self.responder.list(request, reports)
55+
56+
reports_rest = ReportRest(
57+
queryset=Report.objects.all(),
58+
permitted_methods = ('GET', 'POST'),
59+
# expose_fields = ('id','point'),
60+
)

urls.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@
8181
)
8282

8383
# REST Urls
84-
urlpatterns += patterns('mainapp.views.json',
85-
url(r'^json/report/?$', 'reports_resource'),
84+
rest_format = r'(?P<format>\w+)'
85+
urlpatterns += patterns('mainapp.views.rest',
86+
url(r'^rest/reports.%s$'%rest_format, 'reports_rest'),
8687
)
8788

8889

0 commit comments

Comments
 (0)