mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
Merge pull request #2271 from makeplane/chore/date_filters
chore: date filters
This commit is contained in:
commit
d88eb09fad
@ -106,7 +106,6 @@ from plane.api.views import (
|
|||||||
GlobalViewViewSet,
|
GlobalViewViewSet,
|
||||||
GlobalViewIssuesViewSet,
|
GlobalViewIssuesViewSet,
|
||||||
IssueViewViewSet,
|
IssueViewViewSet,
|
||||||
ViewIssuesEndpoint,
|
|
||||||
IssueViewFavoriteViewSet,
|
IssueViewFavoriteViewSet,
|
||||||
## End Views
|
## End Views
|
||||||
# Cycles
|
# Cycles
|
||||||
@ -657,11 +656,6 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
name="project-view",
|
name="project-view",
|
||||||
),
|
),
|
||||||
path(
|
|
||||||
"workspaces/<str:slug>/projects/<uuid:project_id>/views/<uuid:view_id>/issues/",
|
|
||||||
ViewIssuesEndpoint.as_view(),
|
|
||||||
name="project-view-issues",
|
|
||||||
),
|
|
||||||
path(
|
path(
|
||||||
"workspaces/<str:slug>/views/",
|
"workspaces/<str:slug>/views/",
|
||||||
GlobalViewViewSet.as_view(
|
GlobalViewViewSet.as_view(
|
||||||
|
@ -57,7 +57,7 @@ from .workspace import (
|
|||||||
LeaveWorkspaceEndpoint,
|
LeaveWorkspaceEndpoint,
|
||||||
)
|
)
|
||||||
from .state import StateViewSet
|
from .state import StateViewSet
|
||||||
from .view import GlobalViewViewSet, GlobalViewIssuesViewSet, IssueViewViewSet, ViewIssuesEndpoint, IssueViewFavoriteViewSet
|
from .view import GlobalViewViewSet, GlobalViewIssuesViewSet, IssueViewViewSet, IssueViewFavoriteViewSet
|
||||||
from .cycle import (
|
from .cycle import (
|
||||||
CycleViewSet,
|
CycleViewSet,
|
||||||
CycleIssueViewSet,
|
CycleIssueViewSet,
|
||||||
|
@ -24,7 +24,6 @@ from django.core.serializers.json import DjangoJSONEncoder
|
|||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views.decorators.gzip import gzip_page
|
from django.views.decorators.gzip import gzip_page
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from django.db import IntegrityError
|
|
||||||
|
|
||||||
# Third Party imports
|
# Third Party imports
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
@ -84,7 +83,6 @@ from plane.db.models import (
|
|||||||
from plane.bgtasks.issue_activites_task import issue_activity
|
from plane.bgtasks.issue_activites_task import issue_activity
|
||||||
from plane.utils.grouper import group_results
|
from plane.utils.grouper import group_results
|
||||||
from plane.utils.issue_filters import issue_filters
|
from plane.utils.issue_filters import issue_filters
|
||||||
from plane.bgtasks.export_task import issue_export_task
|
|
||||||
|
|
||||||
|
|
||||||
class IssueViewSet(BaseViewSet):
|
class IssueViewSet(BaseViewSet):
|
||||||
|
@ -243,51 +243,6 @@ class IssueViewViewSet(BaseViewSet):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class ViewIssuesEndpoint(BaseAPIView):
|
|
||||||
permission_classes = [
|
|
||||||
ProjectEntityPermission,
|
|
||||||
]
|
|
||||||
|
|
||||||
def get(self, request, slug, project_id, view_id):
|
|
||||||
try:
|
|
||||||
view = IssueView.objects.get(pk=view_id)
|
|
||||||
queries = view.query
|
|
||||||
|
|
||||||
filters = issue_filters(request.query_params, "GET")
|
|
||||||
|
|
||||||
issues = (
|
|
||||||
Issue.issue_objects.filter(
|
|
||||||
**queries, project_id=project_id, workspace__slug=slug
|
|
||||||
)
|
|
||||||
.filter(**filters)
|
|
||||||
.select_related("project")
|
|
||||||
.select_related("workspace")
|
|
||||||
.select_related("state")
|
|
||||||
.select_related("parent")
|
|
||||||
.prefetch_related("assignees")
|
|
||||||
.prefetch_related("labels")
|
|
||||||
.prefetch_related(
|
|
||||||
Prefetch(
|
|
||||||
"issue_reactions",
|
|
||||||
queryset=IssueReaction.objects.select_related("actor"),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
serializer = IssueLiteSerializer(issues, many=True)
|
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
|
||||||
except IssueView.DoesNotExist:
|
|
||||||
return Response(
|
|
||||||
{"error": "Issue View does not exist"}, status=status.HTTP_404_NOT_FOUND
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
capture_exception(e)
|
|
||||||
return Response(
|
|
||||||
{"error": "Something went wrong please try again later"},
|
|
||||||
status=status.HTTP_400_BAD_REQUEST,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueViewFavoriteViewSet(BaseViewSet):
|
class IssueViewFavoriteViewSet(BaseViewSet):
|
||||||
serializer_class = IssueViewFavoriteSerializer
|
serializer_class = IssueViewFavoriteSerializer
|
||||||
model = IssueViewFavorite
|
model = IssueViewFavorite
|
||||||
|
@ -1,5 +1,62 @@
|
|||||||
from django.utils.timezone import make_aware
|
import re
|
||||||
from django.utils.dateparse import parse_datetime
|
from datetime import timedelta
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
|
# The date from pattern
|
||||||
|
pattern = re.compile(r"\d+_(weeks|months)$")
|
||||||
|
|
||||||
|
|
||||||
|
# Get the 2_weeks, 3_months
|
||||||
|
def string_date_filter(filter, duration, subsequent, term, date_filter, offset):
|
||||||
|
now = timezone.now().date()
|
||||||
|
if term == "months":
|
||||||
|
if subsequent == "after":
|
||||||
|
if offset == "fromnow":
|
||||||
|
filter[f"{date_filter}__gte"] = now + timedelta(days=duration * 30)
|
||||||
|
else:
|
||||||
|
filter[f"{date_filter}__gte"] = now - timedelta(days=duration * 30)
|
||||||
|
else:
|
||||||
|
if offset == "fromnow":
|
||||||
|
filter[f"{date_filter}__lte"] = now + timedelta(days=duration * 30)
|
||||||
|
else:
|
||||||
|
filter[f"{date_filter}__lte"] = now - timedelta(days=duration * 30)
|
||||||
|
if term == "weeks":
|
||||||
|
if subsequent == "after":
|
||||||
|
if offset == "fromnow":
|
||||||
|
filter[f"{date_filter}__gte"] = now + timedelta(weeks=duration)
|
||||||
|
else:
|
||||||
|
filter[f"{date_filter}__gte"] = now - timedelta(weeks=duration)
|
||||||
|
else:
|
||||||
|
if offset == "fromnow":
|
||||||
|
filter[f"{date_filter}__lte"] = now + timedelta(days=duration)
|
||||||
|
else:
|
||||||
|
filter[f"{date_filter}__lte"] = now - timedelta(days=duration)
|
||||||
|
|
||||||
|
|
||||||
|
def date_filter(filter, date_term, queries):
|
||||||
|
"""
|
||||||
|
Handle all date filters
|
||||||
|
"""
|
||||||
|
for query in queries:
|
||||||
|
date_query = query.split(";")
|
||||||
|
if len(date_query) >= 2:
|
||||||
|
match = pattern.match(date_query[0])
|
||||||
|
if match:
|
||||||
|
if len(date_query) == 3:
|
||||||
|
digit, term = date_query[0].split("_")
|
||||||
|
string_date_filter(
|
||||||
|
filter=filter,
|
||||||
|
duration=int(digit),
|
||||||
|
subsequent=date_query[1],
|
||||||
|
term=term,
|
||||||
|
date_filter="created_at__date",
|
||||||
|
offset=date_query[2],
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if "after" in date_query:
|
||||||
|
filter[f"{date_term}__gte"] = date_query[0]
|
||||||
|
else:
|
||||||
|
filter[f"{date_term}__lte"] = date_query[0]
|
||||||
|
|
||||||
|
|
||||||
def filter_state(params, filter, method):
|
def filter_state(params, filter, method):
|
||||||
@ -97,20 +154,10 @@ def filter_created_at(params, filter, method):
|
|||||||
if method == "GET":
|
if method == "GET":
|
||||||
created_ats = params.get("created_at").split(",")
|
created_ats = params.get("created_at").split(",")
|
||||||
if len(created_ats) and "" not in created_ats:
|
if len(created_ats) and "" not in created_ats:
|
||||||
for query in created_ats:
|
date_filter(filter=filter, date_term="created_at__date", queries=created_ats)
|
||||||
created_at_query = query.split(";")
|
|
||||||
if len(created_at_query) == 2 and "after" in created_at_query:
|
|
||||||
filter["created_at__date__gte"] = created_at_query[0]
|
|
||||||
else:
|
|
||||||
filter["created_at__date__lte"] = created_at_query[0]
|
|
||||||
else:
|
else:
|
||||||
if params.get("created_at", None) and len(params.get("created_at")):
|
if params.get("created_at", None) and len(params.get("created_at")):
|
||||||
for query in params.get("created_at"):
|
date_filter(filter=filter, date_term="created_at__date", queries=params.get("created_at", []))
|
||||||
created_at_query = query.split(";")
|
|
||||||
if len(created_at_query) == 2 and "after" in created_at_query:
|
|
||||||
filter["created_at__date__gte"] = created_at_query[0]
|
|
||||||
else:
|
|
||||||
filter["created_at__date__lte"] = created_at_query[0]
|
|
||||||
return filter
|
return filter
|
||||||
|
|
||||||
|
|
||||||
@ -118,20 +165,10 @@ def filter_updated_at(params, filter, method):
|
|||||||
if method == "GET":
|
if method == "GET":
|
||||||
updated_ats = params.get("updated_at").split(",")
|
updated_ats = params.get("updated_at").split(",")
|
||||||
if len(updated_ats) and "" not in updated_ats:
|
if len(updated_ats) and "" not in updated_ats:
|
||||||
for query in updated_ats:
|
date_filter(filter=filter, date_term="created_at__date", queries=updated_ats)
|
||||||
updated_at_query = query.split(";")
|
|
||||||
if len(updated_at_query) == 2 and "after" in updated_at_query:
|
|
||||||
filter["updated_at__date__gte"] = updated_at_query[0]
|
|
||||||
else:
|
|
||||||
filter["updated_at__date__lte"] = updated_at_query[0]
|
|
||||||
else:
|
else:
|
||||||
if params.get("updated_at", None) and len(params.get("updated_at")):
|
if params.get("updated_at", None) and len(params.get("updated_at")):
|
||||||
for query in params.get("updated_at"):
|
date_filter(filter=filter, date_term="created_at__date", queries=params.get("updated_at", []))
|
||||||
updated_at_query = query.split(";")
|
|
||||||
if len(updated_at_query) == 2 and "after" in updated_at_query:
|
|
||||||
filter["updated_at__date__gte"] = updated_at_query[0]
|
|
||||||
else:
|
|
||||||
filter["updated_at__date__lte"] = updated_at_query[0]
|
|
||||||
return filter
|
return filter
|
||||||
|
|
||||||
|
|
||||||
@ -139,20 +176,10 @@ def filter_start_date(params, filter, method):
|
|||||||
if method == "GET":
|
if method == "GET":
|
||||||
start_dates = params.get("start_date").split(",")
|
start_dates = params.get("start_date").split(",")
|
||||||
if len(start_dates) and "" not in start_dates:
|
if len(start_dates) and "" not in start_dates:
|
||||||
for query in start_dates:
|
date_filter(filter=filter, date_term="start_date", queries=start_dates)
|
||||||
start_date_query = query.split(";")
|
|
||||||
if len(start_date_query) == 2 and "after" in start_date_query:
|
|
||||||
filter["start_date__gte"] = start_date_query[0]
|
|
||||||
else:
|
|
||||||
filter["start_date__lte"] = start_date_query[0]
|
|
||||||
else:
|
else:
|
||||||
if params.get("start_date", None) and len(params.get("start_date")):
|
if params.get("start_date", None) and len(params.get("start_date")):
|
||||||
for query in params.get("start_date"):
|
date_filter(filter=filter, date_term="start_date", queries=params.get("start_date", []))
|
||||||
start_date_query = query.split(";")
|
|
||||||
if len(start_date_query) == 2 and "after" in start_date_query:
|
|
||||||
filter["start_date__gte"] = start_date_query[0]
|
|
||||||
else:
|
|
||||||
filter["start_date__lte"] = start_date_query[0]
|
|
||||||
return filter
|
return filter
|
||||||
|
|
||||||
|
|
||||||
@ -160,21 +187,11 @@ def filter_target_date(params, filter, method):
|
|||||||
if method == "GET":
|
if method == "GET":
|
||||||
target_dates = params.get("target_date").split(",")
|
target_dates = params.get("target_date").split(",")
|
||||||
if len(target_dates) and "" not in target_dates:
|
if len(target_dates) and "" not in target_dates:
|
||||||
for query in target_dates:
|
|
||||||
target_date_query = query.split(";")
|
date_filter(filter=filter, date_term="target_date", queries=target_dates)
|
||||||
if len(target_date_query) == 2 and "after" in target_date_query:
|
|
||||||
filter["target_date__gte"] = target_date_query[0]
|
|
||||||
else:
|
|
||||||
filter["target_date__lte"] = target_date_query[0]
|
|
||||||
else:
|
else:
|
||||||
if params.get("target_date", None) and len(params.get("target_date")):
|
if params.get("target_date", None) and len(params.get("target_date")):
|
||||||
for query in params.get("target_date"):
|
date_filter(filter=filter, date_term="target_date", queries=params.get("target_date", []))
|
||||||
target_date_query = query.split(";")
|
|
||||||
if len(target_date_query) == 2 and "after" in target_date_query:
|
|
||||||
filter["target_date__gte"] = target_date_query[0]
|
|
||||||
else:
|
|
||||||
filter["target_date__lte"] = target_date_query[0]
|
|
||||||
|
|
||||||
return filter
|
return filter
|
||||||
|
|
||||||
|
|
||||||
@ -182,20 +199,10 @@ def filter_completed_at(params, filter, method):
|
|||||||
if method == "GET":
|
if method == "GET":
|
||||||
completed_ats = params.get("completed_at").split(",")
|
completed_ats = params.get("completed_at").split(",")
|
||||||
if len(completed_ats) and "" not in completed_ats:
|
if len(completed_ats) and "" not in completed_ats:
|
||||||
for query in completed_ats:
|
date_filter(filter=filter, date_term="completed_at__date", queries=completed_ats)
|
||||||
completed_at_query = query.split(";")
|
|
||||||
if len(completed_at_query) == 2 and "after" in completed_at_query:
|
|
||||||
filter["completed_at__date__gte"] = completed_at_query[0]
|
|
||||||
else:
|
|
||||||
filter["completed_at__lte"] = completed_at_query[0]
|
|
||||||
else:
|
else:
|
||||||
if params.get("completed_at", None) and len(params.get("completed_at")):
|
if params.get("completed_at", None) and len(params.get("completed_at")):
|
||||||
for query in params.get("completed_at"):
|
date_filter(filter=filter, date_term="completed_at__date", queries=params.get("completed_at", []))
|
||||||
completed_at_query = query.split(";")
|
|
||||||
if len(completed_at_query) == 2 and "after" in completed_at_query:
|
|
||||||
filter["completed_at__date__gte"] = completed_at_query[0]
|
|
||||||
else:
|
|
||||||
filter["completed_at__lte"] = completed_at_query[0]
|
|
||||||
return filter
|
return filter
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user