[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:
Bavisetti Narayan 2024-12-13 13:34:07 +05:30 committed by GitHub
parent b4112358ac
commit ab11e83535
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 24 additions and 13 deletions

View file

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

View file

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

View file

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

View file

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

View file

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