diff --git a/osmcal/test_views.py b/osmcal/test_views.py index 6dbc11e..0345041 100644 --- a/osmcal/test_views.py +++ b/osmcal/test_views.py @@ -2,13 +2,24 @@ class EventListTest(TestCase): - def test_location_out_of_range(self): + def test_location_out_of_range_low(self): # Based on Sentry report OSM-CALENDAR-1W c = Client() 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_out_of_range_high(self): + # Based on Sentry report OSM-CALENDAR-1W + c = Client() + resp = c.get("/events.ics?around=55,13,5,1") # The around parameter obviously doesn't make any sense. + 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,5") + self.assertEqual(resp.status_code, 200) diff --git a/osmcal/views.py b/osmcal/views.py index 2ec3e42..945446c 100644 --- a/osmcal/views.py +++ b/osmcal/views.py @@ -67,12 +67,22 @@ def get_queryset(self, params, after=None): filter_around = params.get("around", None) if filter_around: 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] + dist = 50000 + elif len(filter_around) == 3: + lat = filter_around[0] + lon = filter_around[1] + dist = filter_around[2] * 1000 + else: raise BadRequest("filter_around invalid") - pt = Point(filter_around[1], filter_around[0], srid=4326) - upcoming_events = upcoming_events.annotate(distance=Distance("location", pt)).filter( - distance__lte=50000 - ) # distance in meters + pt = Point(lon, lat, srid = 4326) + upcoming_events = upcoming_events.annotate( + distance = Distance("location", pt) + ).filter( + distance__lte = dist # distance in meters + ) days = params.get("days", None) if days: