# Third party imports from rest_framework import serializers # Module imports from .base import BaseSerializer from .issue import IssueStateSerializer from plane.db.models import Cycle, CycleIssue, CycleUserProperties from plane.utils.timezone_converter import convert_to_utc class CycleWriteSerializer(BaseSerializer): def validate(self, data): if ( data.get("start_date", None) is not None and data.get("end_date", None) is not None 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", None) or (self.instance and self.instance.project_id) or self.context.get("project_id", None) ) is_start_date_end_date_equal = ( True if str(data.get("start_date")) == str(data.get("end_date")) else False ) data["start_date"] = convert_to_utc( date=str(data.get("start_date").date()), project_id=project_id, is_start_date=True, ) data["end_date"] = convert_to_utc( date=str(data.get("end_date", None).date()), project_id=project_id, is_start_date_end_date_equal=is_start_date_end_date_equal, ) return data class Meta: model = Cycle fields = "__all__" read_only_fields = ["workspace", "project", "owned_by", "archived_at"] class CycleSerializer(BaseSerializer): # favorite is_favorite = serializers.BooleanField(read_only=True) total_issues = serializers.IntegerField(read_only=True) # state group wise distribution cancelled_issues = serializers.IntegerField(read_only=True) completed_issues = serializers.IntegerField(read_only=True) started_issues = serializers.IntegerField(read_only=True) unstarted_issues = serializers.IntegerField(read_only=True) backlog_issues = serializers.IntegerField(read_only=True) # active | draft | upcoming | completed status = serializers.CharField(read_only=True) class Meta: model = Cycle fields = [ # necessary fields "id", "workspace_id", "project_id", # model fields "name", "description", "start_date", "end_date", "owned_by_id", "view_props", "sort_order", "external_source", "external_id", "progress_snapshot", "logo_props", # meta fields "is_favorite", "total_issues", "cancelled_issues", "completed_issues", "started_issues", "unstarted_issues", "backlog_issues", "status", ] read_only_fields = fields class CycleIssueSerializer(BaseSerializer): issue_detail = IssueStateSerializer(read_only=True, source="issue") sub_issues_count = serializers.IntegerField(read_only=True) class Meta: model = CycleIssue fields = "__all__" read_only_fields = ["workspace", "project", "cycle"] class CycleUserPropertiesSerializer(BaseSerializer): class Meta: model = CycleUserProperties fields = "__all__" read_only_fields = ["workspace", "project", "cycle" "user"]