diff --git a/apiserver/plane/api/serializers/cycle.py b/apiserver/plane/api/serializers/cycle.py index f4f06c324..d394dc9bd 100644 --- a/apiserver/plane/api/serializers/cycle.py +++ b/apiserver/plane/api/serializers/cycle.py @@ -4,7 +4,7 @@ from rest_framework import serializers # Module imports from .base import BaseSerializer from plane.db.models import Cycle, CycleIssue - +from plane.utils.timezone_converter import convert_to_utc class CycleSerializer(BaseSerializer): 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) ): 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 class Meta: diff --git a/apiserver/plane/app/serializers/cycle.py b/apiserver/plane/app/serializers/cycle.py index 171494f03..28ec62134 100644 --- a/apiserver/plane/app/serializers/cycle.py +++ b/apiserver/plane/app/serializers/cycle.py @@ -22,10 +22,10 @@ class CycleWriteSerializer(BaseSerializer): ): 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 + 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, is_end_date=True + str(data.get("end_date", None).date()), project_id ) return data diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index 1addc5bec..9bf498886 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -259,7 +259,7 @@ class CycleViewSet(BaseViewSet): "created_by", ) 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) @allow_permission([ROLE.ADMIN, ROLE.MEMBER]) @@ -404,7 +404,6 @@ class CycleViewSet(BaseViewSet): @allow_permission([ROLE.ADMIN, ROLE.MEMBER]) 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) data = ( self.get_queryset() @@ -458,7 +457,7 @@ class CycleViewSet(BaseViewSet): queryset = queryset.first() 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( slug=slug, @@ -534,8 +533,8 @@ class CycleDateCheckEndpoint(BaseAPIView): status=status.HTTP_400_BAD_REQUEST, ) - start_date = convert_to_utc(str(start_date), project_id) - end_date = convert_to_utc(str(end_date), project_id, is_end_date=True) + start_date = convert_to_utc(str(start_date), project_id, is_start_date=True) + end_date = convert_to_utc(str(end_date), project_id) # Check if any cycle intersects in the given interval cycles = Cycle.objects.filter( diff --git a/apiserver/plane/app/views/workspace/cycle.py b/apiserver/plane/app/views/workspace/cycle.py index ec08f47c9..a9398a91d 100644 --- a/apiserver/plane/app/views/workspace/cycle.py +++ b/apiserver/plane/app/views/workspace/cycle.py @@ -10,7 +10,7 @@ from plane.app.views.base import BaseAPIView from plane.db.models import Cycle from plane.app.permissions import WorkspaceViewerPermission from plane.app.serializers.cycle import CycleSerializer - +from plane.utils.timezone_converter import user_timezone_converter class WorkspaceCyclesEndpoint(BaseAPIView): permission_classes = [WorkspaceViewerPermission] diff --git a/apiserver/plane/utils/timezone_converter.py b/apiserver/plane/utils/timezone_converter.py index dc8e20b8c..46a864b62 100644 --- a/apiserver/plane/utils/timezone_converter.py +++ b/apiserver/plane/utils/timezone_converter.py @@ -28,7 +28,7 @@ def user_timezone_converter(queryset, datetime_fields, user_timezone): 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 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 localized_datetime = local_tz.localize(local_datetime) - # If it's an end date, subtract one minute - if is_end_date: - localized_datetime -= timedelta(minutes=1) + # If it's an start date, add one minute + if is_start_date: + localized_datetime += timedelta(minutes=1) # Convert the localized datetime to UTC utc_datetime = localized_datetime.astimezone(pytz.utc)