diff --git a/osmcal/test_views.py b/osmcal/test_views.py index 6dbc11e..9bead31 100644 --- a/osmcal/test_views.py +++ b/osmcal/test_views.py @@ -8,7 +8,17 @@ def test_location_out_of_range(self): resp = c.get("/events.ics?around=5564") # The around parameter obviously doesn't make any sense. self.assertEqual(resp.status_code, 400) - def test_location_around(self): + def test_location_radius_out_of_range(self): + c = Client() + resp = c.get("/events.ics?around=52,13&around_radius=260") # The around radius parameter is too large. + self.assertEqual(resp.status_code, 400) + + def test_location_around_50k(self): c = Client() resp = c.get("/events.ics?around=52,13") self.assertEqual(resp.status_code, 200) + + def test_location_around_dist(self): + c = Client() + resp = c.get("/events.ics?around=52,13&around_radius=5") + self.assertEqual(resp.status_code, 200) diff --git a/osmcal/views.py b/osmcal/views.py index 2ec3e42..997fc30 100644 --- a/osmcal/views.py +++ b/osmcal/views.py @@ -66,13 +66,23 @@ def get_queryset(self, params, after=None): filter_around = params.get("around", None) if filter_around: + filter_around_radius = params.get("around_radius", None) + if filter_around_radius: + dist = float(filter_around_radius) + if dist <= 0 or dist > 250: + raise BadRequest("filter_around_radius invalid") + else: + dist = 50 filter_around = [float(x) for x in filter_around.split(",")] - if len(filter_around) < 2: + if len(filter_around) == 2: + lat = filter_around[0] + lon = filter_around[1] + else: raise BadRequest("filter_around invalid") - pt = Point(filter_around[1], filter_around[0], srid=4326) + pt = Point(lon, lat, srid=4326) upcoming_events = upcoming_events.annotate(distance=Distance("location", pt)).filter( - distance__lte=50000 - ) # distance in meters + distance__lte=dist * 1000 # dist variable contains km, filter must be in meters + ) days = params.get("days", None) if days: