From 026a7c7a0b6929ec9e76a9e54129460a230a27bb Mon Sep 17 00:00:00 2001 From: Chatewgne Date: Fri, 1 Oct 2021 11:26:02 +0200 Subject: [PATCH] Add filter by practices on outdoor courses --- docs/changelog.rst | 3 +++ geotrek/api/tests/test_v2.py | 30 ++++++++++++++++++++++++++++++ geotrek/api/v2/filters.py | 11 +++++++++++ 3 files changed, 44 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 1c0071c75b..e33a64a03c 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,6 +7,9 @@ CHANGELOG **New features** +- APIv2 : Add filter by pratices on outdoor courses + + 2.66.0 (2021-09-27) ---------------------- diff --git a/geotrek/api/tests/test_v2.py b/geotrek/api/tests/test_v2.py index d019bcc65e..458f755ef0 100644 --- a/geotrek/api/tests/test_v2.py +++ b/geotrek/api/tests/test_v2.py @@ -3350,3 +3350,33 @@ def test_filter_ratings_in_tree_hierarchy3(self): self.assertIn(self.site2.pk, all_ids) self.assertIn(self.site3.pk, all_ids) self.assertIn(self.site4.pk, all_ids) + + +class OutdoorFilterByPracticesTestCase(BaseApiTest): + """ Test APIV2 filtering by practices on courses + """ + + @classmethod + def setUpTestData(cls): + cls.practice = outdoor_factory.PracticeFactory() + cls.site_practice = outdoor_factory.SiteFactory(practice=cls.practice) + cls.course_practice = outdoor_factory.CourseFactory(site=cls.site_practice) + + cls.other_practice = outdoor_factory.PracticeFactory() + cls.site_other_practice = outdoor_factory.SiteFactory(practice=cls.other_practice) + cls.course_other_practice = outdoor_factory.CourseFactory(site=cls.site_other_practice) + + cls.site_no_practice = outdoor_factory.SiteFactory(practice=None) + cls.course_site_no_practice = outdoor_factory.CourseFactory(site=cls.site_no_practice) + + def test_filter_practices_on_courses(self): + response = self.get_course_list({'practices': self.practice.pk}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.json()['count'], 1) + returned_types = response.json()['results'] + all_ids = [] + for type in returned_types: + all_ids.append(type['id']) + self.assertIn(self.course_practice.pk, all_ids) + self.assertNotIn(self.course_site_no_practice.pk, all_ids) + self.assertNotIn(self.course_other_practice.pk, all_ids) diff --git a/geotrek/api/v2/filters.py b/geotrek/api/v2/filters.py index a9edd8174a..6d43b7a3a1 100644 --- a/geotrek/api/v2/filters.py +++ b/geotrek/api/v2/filters.py @@ -795,6 +795,11 @@ def get_schema_fields(self, view): class GeotrekCourseFilter(BaseFilterBackend): def filter_queryset(self, request, queryset, view): + practices = request.GET.get('practices') + if practices: + queryset = queryset.filter(site__isnull=False) + queryset = queryset.filter(site__practice__isnull=False) + queryset = queryset.filter(site__practice__in=practices.split(',')) q = request.GET.get('q') if q: queryset = queryset.filter(name__icontains=q) @@ -802,6 +807,12 @@ def filter_queryset(self, request, queryset, view): def get_schema_fields(self, view): return ( + Field( + name='practices', required=False, location='query', schema=coreschema.Integer( + title=_("Practices"), + description=_('Filter by one or more practice id, comma-separated.') + ) + ), Field( name='q', required=False, location='query', schema=coreschema.String( title=_("Query string"),