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

Merge branch 'GREG-28_add_filter_for_active' into 'master'

GREG-28: Adding a filter for active roles

See merge request !32
parents 234c1d18 fd0f1373
No related branches found
No related tags found
1 merge request!32GREG-28: Adding a filter for active roles
Pipeline #91655 failed
from datetime import datetime
from django.db.models import Q, When, Case, BooleanField
from django_filters.rest_framework import (
BaseInFilter,
BooleanFilter,
......@@ -23,10 +26,29 @@ class PersonFilter(FilterSet):
verified = BooleanFilter(
field_name="identities__verified_by_id", lookup_expr="isnull", exclude=True
)
active = BooleanFilter(method="active_role_filter")
class Meta:
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):
......
......@@ -32,7 +32,13 @@ class PersonViewSet(viewsets.ModelViewSet):
"both verified and not verified are returned",
required=False,
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):
......
import datetime
from typing import Dict
import pytest
......@@ -418,3 +419,39 @@ def test_add_duplicate_role_fails(client, person_foo: Person, person_foo_role: R
# Check that there is still only one role attached to the person
roles_for_person = client.get(url).json()["results"]
assert len(roles_for_person) == 1
@pytest.mark.django_db
def test_filter_active_includes_person_with_active_role(
client,
person_foo: Person,
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
):
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