diff --git a/taiga/projects/tasks/api.py b/taiga/projects/tasks/api.py index 232d496e..3cf43913 100644 --- a/taiga/projects/tasks/api.py +++ b/taiga/projects/tasks/api.py @@ -56,7 +56,10 @@ class TaskViewSet(OCCResourceMixin, VotedResourceMixin, HistoryResourceMixin, filters.StatusesFilter, filters.TagsFilter, filters.WatchersFilter, - filters.QFilter) + filters.QFilter, + filters.CreatedDateFilter, + filters.ModifiedDateFilter, + filters.FinishedDateFilter) retrieve_exclude_filters = (filters.OwnersFilter, filters.AssignedToFilter, filters.StatusesFilter, diff --git a/tests/integration/test_tasks.py b/tests/integration/test_tasks.py index c13add00..c9fd4d01 100644 --- a/tests/integration/test_tasks.py +++ b/tests/integration/test_tasks.py @@ -19,6 +19,10 @@ import uuid import csv +import pytz + +from datetime import datetime, timedelta +from urllib.parse import quote from unittest import mock @@ -451,6 +455,110 @@ def test_get_tasks_including_attachments(client): assert len(response.data[0].get("attachments")) == 1 +def test_api_filter_by_created_date(client): + user = f.UserFactory(is_superuser=True) + one_day_ago = datetime.now(pytz.utc) - timedelta(days=1) + + old_task = f.create_task(owner=user, created_date=one_day_ago) + task = f.create_task(owner=user, subject="test") + + url = reverse("tasks-list") + "?created_date=%s" % ( + quote(task.created_date.isoformat()) + ) + + client.login(task.owner) + response = client.get(url) + number_of_tasks = len(response.data) + + assert response.status_code == 200 + assert number_of_tasks == 1 + assert response.data[0]["subject"] == task.subject + + +def test_api_filter_by_created_date__lt(client): + user = f.UserFactory(is_superuser=True) + one_day_ago = datetime.now(pytz.utc) - timedelta(days=1) + + old_task = f.create_task(owner=user, created_date=one_day_ago) + task = f.create_task(owner=user, subject="test") + + url = reverse("tasks-list") + "?created_date__lt=%s" % ( + quote(task.created_date.isoformat()) + ) + + client.login(task.owner) + response = client.get(url) + number_of_tasks = len(response.data) + + assert response.status_code == 200 + assert response.data[0]["subject"] == old_task.subject + + +def test_api_filter_by_created_date__lte(client): + user = f.UserFactory(is_superuser=True) + one_day_ago = datetime.now(pytz.utc) - timedelta(days=1) + + old_task = f.create_task(owner=user, created_date=one_day_ago) + task = f.create_task(owner=user) + + url = reverse("tasks-list") + "?created_date__lte=%s" % ( + quote(task.created_date.isoformat()) + ) + + client.login(task.owner) + response = client.get(url) + number_of_tasks = len(response.data) + + assert response.status_code == 200 + assert number_of_tasks == 2 + + +def test_api_filter_by_modified_date__gte(client): + user = f.UserFactory(is_superuser=True) + _day_ago = datetime.now(pytz.utc) - timedelta(days=1) + + older_task = f.create_task(owner=user) + task = f.create_task(owner=user, subject="test") + # we have to refresh as it slightly differs + task.refresh_from_db() + + assert older_task.modified_date < task.modified_date + + url = reverse("tasks-list") + "?modified_date__gte=%s" % ( + quote(task.modified_date.isoformat()) + ) + + client.login(task.owner) + response = client.get(url) + number_of_tasks = len(response.data) + + assert response.status_code == 200 + assert number_of_tasks == 1 + assert response.data[0]["subject"] == task.subject + + +def test_api_filter_by_finished_date(client): + user = f.UserFactory(is_superuser=True) + project = f.ProjectFactory.create() + status0 = f.TaskStatusFactory.create(project=project, is_closed=True) + + task = f.create_task(owner=user) + finished_task = f.create_task(owner=user, status=status0, subject="test") + + assert finished_task.finished_date + + url = reverse("tasks-list") + "?finished_date__gte=%s" % ( + quote(finished_task.finished_date.isoformat()) + ) + client.login(task.owner) + response = client.get(url) + number_of_tasks = len(response.data) + + assert response.status_code == 200 + assert number_of_tasks == 1 + assert response.data[0]["subject"] == finished_task.subject + + def test_api_filters_data(client): project = f.ProjectFactory.create() user1 = f.UserFactory.create(is_superuser=True)