diff --git a/Makefile b/Makefile index 014748ef27a219a7416695ba8ab713f7ea559bb7..34fc384c01c440dd03e4b02f7d3c123d427fc104 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ PIP ?= pip -q POETRY ?= poetry PYLINT ?= pylint -sn PYTEST ?= pytest -v -s --no-header -PYTHON ?= python3.9 +PYTHON ?= python3.10 VENV ?= venv mypy = $(MYPY) --config-file mypy.ini diff --git a/greg/api/filters.py b/greg/api/filters.py index b8384d7960ddb9398d564830e4b7d9b7e9e443e4..c71b6be157731961facc75a8732abdac546ce9f1 100644 --- a/greg/api/filters.py +++ b/greg/api/filters.py @@ -4,6 +4,7 @@ from django.db.models import Q, When, Case, BooleanField from django_filters.rest_framework import ( BaseInFilter, BooleanFilter, + CharFilter, FilterSet, ) @@ -26,10 +27,11 @@ class RoleFilter(FilterSet): class PersonFilter(FilterSet): verified = BooleanFilter(method="verified_filter") active = BooleanFilter(method="active_role_filter") + role_type = CharFilter(method="role_type_filter") class Meta: model = Person - fields = ["first_name", "last_name", "verified", "active"] + fields = ["first_name", "last_name", "verified", "active", "role_type"] def verified_filter(self, queryset, name, value): if value is True: @@ -56,6 +58,9 @@ class PersonFilter(FilterSet): return queryset + def role_type_filter(self, queryset, name, value): + return queryset.filter(roles__type__identifier=value) + class IdentityFilter(FilterSet): class Meta: diff --git a/greg/api/views/person.py b/greg/api/views/person.py index 6a574d27eec2778c7df2c4e25a718e881c4f4c5f..51b870853ef0897c534cf4aa1528de2b39dcf948 100644 --- a/greg/api/views/person.py +++ b/greg/api/views/person.py @@ -47,6 +47,11 @@ class PersonViewSet(viewsets.ModelViewSet): required=False, type=bool, ), + OpenApiParameter( + name="role_type", + required=False, + type=str, + ), ] ) def list(self, request, *args, **kwargs): diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py index 9f5d148d1b43446a69e0e976f4719f23e56fd2e5..dc411637cd75d2856c0ae0334816e64fb3884fd1 100644 --- a/greg/tests/api/test_person.py +++ b/greg/tests/api/test_person.py @@ -521,6 +521,52 @@ def test_filter_active_value_false( assert len(results) == 1 +@pytest.mark.django_db +def test_filter_role_type( + client: APIClient, + person_foo: Person, + person: Person, + person_bar: Person, + role_type_test_guest: Role, + sponsor_guy: Sponsor, + unit_foo: OrganizationalUnit, +): + + date_today = datetime.date.today() + + best_test_guest = RoleType.objects.create( + identifier="Best Test Guest", + ) + + Role.objects.create( + person=person_foo, + type=best_test_guest, + end_date=date_today + datetime.timedelta(days=1), + sponsor=sponsor_guy, + orgunit=unit_foo, + ) + Role.objects.create( + person=person, + type=role_type_test_guest, + end_date=date_today + datetime.timedelta(days=1), + sponsor=sponsor_guy, + orgunit=unit_foo, + ) + Role.objects.create( + person=person_bar, + type=role_type_test_guest, + end_date=date_today + datetime.timedelta(days=1), + sponsor=sponsor_guy, + orgunit=unit_foo, + ) + + url = reverse("v1:person-list") + response = client.get(url, {"role_type": "Best Test Guest"}) + results = response.json()["results"] + + assert len(results) == 1 + + @pytest.mark.django_db def test_person_consents_get( client: APIClient, person: Person, consent_fixture_choice_yes: Consent