Skip to content
Snippets Groups Projects
Commit 8baaafba authored by Tore.Brede's avatar Tore.Brede
Browse files

GREG-28: Adding a filter for active roles

parent db154c5e
No related branches found
No related tags found
1 merge request!32GREG-28: Adding a filter for active roles
Pipeline #91470 failed
from datetime import datetime
from django.db.models import Q, When, Case, BooleanField
from django_filters.rest_framework import ( from django_filters.rest_framework import (
BaseInFilter, BaseInFilter,
BooleanFilter, BooleanFilter,
...@@ -23,10 +26,29 @@ class PersonFilter(FilterSet): ...@@ -23,10 +26,29 @@ class PersonFilter(FilterSet):
verified = BooleanFilter( verified = BooleanFilter(
field_name="identities__verified_by_id", lookup_expr="isnull", exclude=True field_name="identities__verified_by_id", lookup_expr="isnull", exclude=True
) )
active = BooleanFilter(method="active_role_filter")
class Meta: class Meta:
model = Person model = Person
fields = ["first_name", "last_name", "verified"] fields = ["first_name", "last_name", "verified", "active"]
def active_role_filter(self, queryset, name, value):
if value:
datetime_now = datetime.now()
return queryset.annotate(
active=Case(
When(
Q(person_roles__start_date__isnull=True)
| Q(person_roles__start_date__lte=datetime_now),
person_roles__end_date__gte=datetime_now,
then=True,
),
default=False,
output_field=BooleanField(),
)
).filter(active=value)
return queryset
class PersonIdentityFilter(FilterSet): class PersonIdentityFilter(FilterSet):
......
...@@ -32,7 +32,13 @@ class PersonViewSet(viewsets.ModelViewSet): ...@@ -32,7 +32,13 @@ class PersonViewSet(viewsets.ModelViewSet):
"both verified and not verified are returned", "both verified and not verified are returned",
required=False, required=False,
type=bool, type=bool,
) ),
OpenApiParameter(
name="active",
description="If try only include persons with an active role",
required=False,
type=bool,
),
] ]
) )
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
......
import datetime
from typing import Dict from typing import Dict
import pytest import pytest
...@@ -420,3 +421,45 @@ def test_add_duplicate_role_fails( ...@@ -420,3 +421,45 @@ def test_add_duplicate_role_fails(
# Check that there is still only one role attached to the person # Check that there is still only one role attached to the person
roles_for_person = client.get(url).json()["results"] roles_for_person = client.get(url).json()["results"]
assert len(roles_for_person) == 1 assert len(roles_for_person) == 1
@pytest.mark.django_db
def test_filter_active_includes_person_with_active_role(
client,
person_foo: Person,
person_foo_role: PersonRole,
sponsor_guy: Sponsor,
unit_foo: OrganizationalUnit,
role_test_guest: Role,
):
date_today = datetime.date.today()
PersonRole.objects.create(
person=person_foo,
role=role_test_guest,
end_date=date_today + datetime.timedelta(days=1),
registered_by=sponsor_guy,
unit=unit_foo,
)
url = reverse("v1:person-list")
response = client.get(url, {"active": "true"})
results = response.json()["results"]
assert len(results) == 1
assert results[0]["first_name"] == "Foo"
assert results[0]["last_name"] == "Foo"
@pytest.mark.django_db
def test_filter_active_excludes_person_with_no_active_role(
client,
person_foo: Person,
person_foo_role: PersonRole,
sponsor_guy: Sponsor,
unit_foo: OrganizationalUnit,
role_test_guest: Role,
):
url = reverse("v1:person-list")
response = client.get(url, {"active": "true"})
results = response.json()["results"]
assert len(results) == 0
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment