[WEB-2843] chore: updated the cycle end date logic (#6194)
* chore: updated the cycle end date logic * chore: changed the key for timezone
This commit is contained in:
parent
b4112358ac
commit
ab11e83535
5 changed files with 24 additions and 13 deletions
|
|
@ -4,7 +4,7 @@ from rest_framework import serializers
|
||||||
# Module imports
|
# Module imports
|
||||||
from .base import BaseSerializer
|
from .base import BaseSerializer
|
||||||
from plane.db.models import Cycle, CycleIssue
|
from plane.db.models import Cycle, CycleIssue
|
||||||
|
from plane.utils.timezone_converter import convert_to_utc
|
||||||
|
|
||||||
class CycleSerializer(BaseSerializer):
|
class CycleSerializer(BaseSerializer):
|
||||||
total_issues = serializers.IntegerField(read_only=True)
|
total_issues = serializers.IntegerField(read_only=True)
|
||||||
|
|
@ -24,6 +24,18 @@ class CycleSerializer(BaseSerializer):
|
||||||
and data.get("start_date", None) > data.get("end_date", None)
|
and data.get("start_date", None) > data.get("end_date", None)
|
||||||
):
|
):
|
||||||
raise serializers.ValidationError("Start date cannot exceed end date")
|
raise serializers.ValidationError("Start date cannot exceed end date")
|
||||||
|
|
||||||
|
if (
|
||||||
|
data.get("start_date", None) is not None
|
||||||
|
and data.get("end_date", None) is not None
|
||||||
|
):
|
||||||
|
project_id = self.initial_data.get("project_id") or self.instance.project_id
|
||||||
|
data["start_date"] = convert_to_utc(
|
||||||
|
str(data.get("start_date").date()), project_id, is_start_date=True
|
||||||
|
)
|
||||||
|
data["end_date"] = convert_to_utc(
|
||||||
|
str(data.get("end_date", None).date()), project_id
|
||||||
|
)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,10 @@ class CycleWriteSerializer(BaseSerializer):
|
||||||
):
|
):
|
||||||
project_id = self.initial_data.get("project_id") or self.instance.project_id
|
project_id = self.initial_data.get("project_id") or self.instance.project_id
|
||||||
data["start_date"] = convert_to_utc(
|
data["start_date"] = convert_to_utc(
|
||||||
str(data.get("start_date").date()), project_id
|
str(data.get("start_date").date()), project_id, is_start_date=True
|
||||||
)
|
)
|
||||||
data["end_date"] = convert_to_utc(
|
data["end_date"] = convert_to_utc(
|
||||||
str(data.get("end_date", None).date()), project_id, is_end_date=True
|
str(data.get("end_date", None).date()), project_id
|
||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -259,7 +259,7 @@ class CycleViewSet(BaseViewSet):
|
||||||
"created_by",
|
"created_by",
|
||||||
)
|
)
|
||||||
datetime_fields = ["start_date", "end_date"]
|
datetime_fields = ["start_date", "end_date"]
|
||||||
data = user_timezone_converter(data, datetime_fields, project_timezone)
|
data = user_timezone_converter(data, datetime_fields, request.user.user_timezone)
|
||||||
return Response(data, status=status.HTTP_200_OK)
|
return Response(data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
@allow_permission([ROLE.ADMIN, ROLE.MEMBER])
|
@allow_permission([ROLE.ADMIN, ROLE.MEMBER])
|
||||||
|
|
@ -404,7 +404,6 @@ class CycleViewSet(BaseViewSet):
|
||||||
|
|
||||||
@allow_permission([ROLE.ADMIN, ROLE.MEMBER])
|
@allow_permission([ROLE.ADMIN, ROLE.MEMBER])
|
||||||
def retrieve(self, request, slug, project_id, pk):
|
def retrieve(self, request, slug, project_id, pk):
|
||||||
project = Project.objects.get(id=project_id)
|
|
||||||
queryset = self.get_queryset().filter(archived_at__isnull=True).filter(pk=pk)
|
queryset = self.get_queryset().filter(archived_at__isnull=True).filter(pk=pk)
|
||||||
data = (
|
data = (
|
||||||
self.get_queryset()
|
self.get_queryset()
|
||||||
|
|
@ -458,7 +457,7 @@ class CycleViewSet(BaseViewSet):
|
||||||
|
|
||||||
queryset = queryset.first()
|
queryset = queryset.first()
|
||||||
datetime_fields = ["start_date", "end_date"]
|
datetime_fields = ["start_date", "end_date"]
|
||||||
data = user_timezone_converter(data, datetime_fields, project.timezone)
|
data = user_timezone_converter(data, datetime_fields, request.user.user_timezone)
|
||||||
|
|
||||||
recent_visited_task.delay(
|
recent_visited_task.delay(
|
||||||
slug=slug,
|
slug=slug,
|
||||||
|
|
@ -534,8 +533,8 @@ class CycleDateCheckEndpoint(BaseAPIView):
|
||||||
status=status.HTTP_400_BAD_REQUEST,
|
status=status.HTTP_400_BAD_REQUEST,
|
||||||
)
|
)
|
||||||
|
|
||||||
start_date = convert_to_utc(str(start_date), project_id)
|
start_date = convert_to_utc(str(start_date), project_id, is_start_date=True)
|
||||||
end_date = convert_to_utc(str(end_date), project_id, is_end_date=True)
|
end_date = convert_to_utc(str(end_date), project_id)
|
||||||
|
|
||||||
# Check if any cycle intersects in the given interval
|
# Check if any cycle intersects in the given interval
|
||||||
cycles = Cycle.objects.filter(
|
cycles = Cycle.objects.filter(
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ from plane.app.views.base import BaseAPIView
|
||||||
from plane.db.models import Cycle
|
from plane.db.models import Cycle
|
||||||
from plane.app.permissions import WorkspaceViewerPermission
|
from plane.app.permissions import WorkspaceViewerPermission
|
||||||
from plane.app.serializers.cycle import CycleSerializer
|
from plane.app.serializers.cycle import CycleSerializer
|
||||||
|
from plane.utils.timezone_converter import user_timezone_converter
|
||||||
|
|
||||||
class WorkspaceCyclesEndpoint(BaseAPIView):
|
class WorkspaceCyclesEndpoint(BaseAPIView):
|
||||||
permission_classes = [WorkspaceViewerPermission]
|
permission_classes = [WorkspaceViewerPermission]
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ def user_timezone_converter(queryset, datetime_fields, user_timezone):
|
||||||
return queryset_values
|
return queryset_values
|
||||||
|
|
||||||
|
|
||||||
def convert_to_utc(date, project_id, is_end_date=False):
|
def convert_to_utc(date, project_id, is_start_date=False):
|
||||||
"""
|
"""
|
||||||
Converts a start date string to the project's local timezone at 12:00 AM
|
Converts a start date string to the project's local timezone at 12:00 AM
|
||||||
and then converts it to UTC for storage.
|
and then converts it to UTC for storage.
|
||||||
|
|
@ -58,9 +58,9 @@ def convert_to_utc(date, project_id, is_end_date=False):
|
||||||
# Localize the datetime to the project's timezone
|
# Localize the datetime to the project's timezone
|
||||||
localized_datetime = local_tz.localize(local_datetime)
|
localized_datetime = local_tz.localize(local_datetime)
|
||||||
|
|
||||||
# If it's an end date, subtract one minute
|
# If it's an start date, add one minute
|
||||||
if is_end_date:
|
if is_start_date:
|
||||||
localized_datetime -= timedelta(minutes=1)
|
localized_datetime += timedelta(minutes=1)
|
||||||
|
|
||||||
# Convert the localized datetime to UTC
|
# Convert the localized datetime to UTC
|
||||||
utc_datetime = localized_datetime.astimezone(pytz.utc)
|
utc_datetime = localized_datetime.astimezone(pytz.utc)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue