# Third party imports from rest_framework import serializers # Module imports from .base import BaseSerializer from plane.db.models import ( Page, PageLog, PageLabel, Label, ProjectPage, Project, PageVersion, ) class PageSerializer(BaseSerializer): is_favorite = serializers.BooleanField(read_only=True) labels = serializers.ListField( child=serializers.PrimaryKeyRelatedField(queryset=Label.objects.all()), write_only=True, required=False, ) # Many to many label_ids = serializers.ListField(child=serializers.UUIDField(), required=False) project_ids = serializers.ListField(child=serializers.UUIDField(), required=False) class Meta: model = Page fields = [ "id", "name", "owned_by", "access", "color", "labels", "parent", "is_favorite", "is_locked", "archived_at", "workspace", "created_at", "updated_at", "created_by", "updated_by", "view_props", "logo_props", "label_ids", "project_ids", ] read_only_fields = ["workspace", "owned_by"] def create(self, validated_data): labels = validated_data.pop("labels", None) project_id = self.context["project_id"] owned_by_id = self.context["owned_by_id"] description = self.context["description"] description_binary = self.context["description_binary"] description_html = self.context["description_html"] # Get the workspace id from the project project = Project.objects.get(pk=project_id) # Create the page page = Page.objects.create( **validated_data, description=description, description_binary=description_binary, description_html=description_html, owned_by_id=owned_by_id, workspace_id=project.workspace_id, ) # Create the project page ProjectPage.objects.create( workspace_id=page.workspace_id, project_id=project_id, page_id=page.id, created_by_id=page.created_by_id, updated_by_id=page.updated_by_id, ) # Create page labels if labels is not None: PageLabel.objects.bulk_create( [ PageLabel( label=label, page=page, workspace_id=page.workspace_id, created_by_id=page.created_by_id, updated_by_id=page.updated_by_id, ) for label in labels ], batch_size=10, ) return page def update(self, instance, validated_data): labels = validated_data.pop("labels", None) if labels is not None: PageLabel.objects.filter(page=instance).delete() PageLabel.objects.bulk_create( [ PageLabel( label=label, page=instance, workspace_id=instance.workspace_id, created_by_id=instance.created_by_id, updated_by_id=instance.updated_by_id, ) for label in labels ], batch_size=10, ) return super().update(instance, validated_data) class PageDetailSerializer(PageSerializer): description_html = serializers.CharField() class Meta(PageSerializer.Meta): fields = PageSerializer.Meta.fields + ["description_html"] class SubPageSerializer(BaseSerializer): entity_details = serializers.SerializerMethodField() class Meta: model = PageLog fields = "__all__" read_only_fields = ["workspace", "page"] def get_entity_details(self, obj): entity_name = obj.entity_name if entity_name == "forward_link" or entity_name == "back_link": try: page = Page.objects.get(pk=obj.entity_identifier) return PageSerializer(page).data except Page.DoesNotExist: return None return None class PageLogSerializer(BaseSerializer): class Meta: model = PageLog fields = "__all__" read_only_fields = ["workspace", "page"] class PageVersionSerializer(BaseSerializer): class Meta: model = PageVersion fields = [ "id", "workspace", "page", "last_saved_at", "owned_by", "created_at", "updated_at", "created_by", "updated_by", ] read_only_fields = ["workspace", "page"] class PageVersionDetailSerializer(BaseSerializer): class Meta: model = PageVersion fields = [ "id", "workspace", "page", "last_saved_at", "description_binary", "description_html", "description_json", "owned_by", "created_at", "updated_at", "created_by", "updated_by", ] read_only_fields = ["workspace", "page"]