* [WEB-1424] chore: page and view logo implementation, and emoji/icon picker improvement (#4583) * chore: added logo_props * chore: logo props in cycles, views and modules * chore: emoji icon picker types updated * chore: info icon added to plane ui package * chore: icon color adjust helper function added * style: icon picker ui improvement and default color options updated * chore: update page logo action added in store * chore: emoji code to unicode helper function added * chore: common logo renderer component added * chore: app header project logo updated * chore: project logo updated across platform * chore: page logo picker added * chore: control link component improvement * chore: list item improvement * chore: emoji picker component updated * chore: space app and package logo prop type updated * chore: migration * chore: logo added to project view * chore: page logo picker added in create modal and breadcrumbs * chore: view logo picker added in create modal and updated breadcrumbs * fix: build error * chore: AIO docker images for preview deployments (#4605) * fix: adding single docker base file * action added * fix action * dockerfile.base modified * action fix * dockerfile * fix: base aio dockerfile * fix: dockerfile.base * fix: dockerfile base * fix: modified folder structure * fix: action * fix: dockerfile * fix: dockerfile.base * fix: supervisor file name changed * fix: base dockerfile updated * fix dockerfile base * fix: base dockerfile * fix: docker files * fix: base dockerfile * update base image * modified docker aio base * aio base modified to debian-12-slim * fixes * finalize the dockerfiles with volume exposure * modified the aio build and dockerfile * fix: codacy suggestions implemented * fix: codacy fix * update aio build action --------- Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com> * fix: merge conflict * chore: lucide react added to planu ui package * chore: new emoji picker component added with lucid icon and code refactor * chore: logo component updated * chore: emoji picker updated for pages and views --------- Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com> Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com> * fix: build error --------- Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> Co-authored-by: Manish Gupta <59428681+mguptahub@users.noreply.github.com> Co-authored-by: Anmol Singh Bhatia <anmolsinghbhatia@plane.so>
146 lines
No EOL
4 KiB
Python
146 lines
No EOL
4 KiB
Python
# Third party imports
|
|
from rest_framework import serializers
|
|
|
|
# Module imports
|
|
from .base import BaseSerializer
|
|
from plane.db.models import (
|
|
Page,
|
|
PageLog,
|
|
PageLabel,
|
|
Label,
|
|
)
|
|
|
|
|
|
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,
|
|
)
|
|
|
|
class Meta:
|
|
model = Page
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"owned_by",
|
|
"access",
|
|
"color",
|
|
"labels",
|
|
"parent",
|
|
"is_favorite",
|
|
"is_locked",
|
|
"archived_at",
|
|
"workspace",
|
|
"project",
|
|
"created_at",
|
|
"updated_at",
|
|
"created_by",
|
|
"updated_by",
|
|
"view_props",
|
|
"logo_props",
|
|
]
|
|
read_only_fields = [
|
|
"workspace",
|
|
"project",
|
|
"owned_by",
|
|
]
|
|
|
|
def to_representation(self, instance):
|
|
data = super().to_representation(instance)
|
|
data["labels"] = [str(label.id) for label in instance.labels.all()]
|
|
return data
|
|
|
|
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_html = self.context["description_html"]
|
|
page = Page.objects.create(
|
|
**validated_data,
|
|
description_html=description_html,
|
|
project_id=project_id,
|
|
owned_by_id=owned_by_id,
|
|
)
|
|
|
|
if labels is not None:
|
|
PageLabel.objects.bulk_create(
|
|
[
|
|
PageLabel(
|
|
label=label,
|
|
page=page,
|
|
project_id=project_id,
|
|
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,
|
|
project_id=instance.project_id,
|
|
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",
|
|
"project",
|
|
"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",
|
|
"project",
|
|
"page",
|
|
] |