Merge pull request #2271 from makeplane/chore/date_filters

chore: date filters
This commit is contained in:
sriram veeraghanta 2023-10-09 16:01:56 +05:30 committed by GitHub
commit d88eb09fad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 71 additions and 117 deletions

View File

@ -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(

View File

@ -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,

View File

@ -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):

View File

@ -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

View File

@ -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