Skip to content

Commit

Permalink
Merge pull request #2777 from GeotrekCE/add_practice_filter_on_courses
Browse files Browse the repository at this point in the history
Add filter by practices on outdoor courses
  • Loading branch information
Chatewgne committed Oct 1, 2021
2 parents 284c4de + 026a7c7 commit c2b0119
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 0 deletions.
3 changes: 3 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ CHANGELOG

**New features**

- APIv2 : Add filter by pratices on outdoor courses



2.66.0 (2021-09-27)
----------------------
Expand Down
30 changes: 30 additions & 0 deletions geotrek/api/tests/test_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
11 changes: 11 additions & 0 deletions geotrek/api/v2/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -795,13 +795,24 @@ 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)
return queryset

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"),
Expand Down

0 comments on commit c2b0119

Please sign in to comment.