|
| 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 | +) |
0 commit comments