diff --git a/apps/api/plane/api/serializers/intake.py b/apps/api/plane/api/serializers/intake.py index 40cbba38b62..d8741d84f8b 100644 --- a/apps/api/plane/api/serializers/intake.py +++ b/apps/api/plane/api/serializers/intake.py @@ -17,7 +17,7 @@ class Meta: model = Issue fields = [ "name", - "description", + "description_json", "description_html", "priority", ] diff --git a/apps/api/plane/api/serializers/issue.py b/apps/api/plane/api/serializers/issue.py index d86dfa6b6ea..4f9447bd9f5 100644 --- a/apps/api/plane/api/serializers/issue.py +++ b/apps/api/plane/api/serializers/issue.py @@ -65,7 +65,7 @@ class IssueSerializer(BaseSerializer): class Meta: model = Issue read_only_fields = ["id", "workspace", "project", "updated_by", "updated_at"] - exclude = ["description", "description_stripped"] + exclude = ["description_json", "description_stripped"] def validate(self, data): if ( diff --git a/apps/api/plane/api/views/intake.py b/apps/api/plane/api/views/intake.py index 216b27afc0d..077f484e905 100644 --- a/apps/api/plane/api/views/intake.py +++ b/apps/api/plane/api/views/intake.py @@ -182,7 +182,7 @@ def post(self, request, slug, project_id): # create an issue issue = Issue.objects.create( name=request.data.get("issue", {}).get("name"), - description=request.data.get("issue", {}).get("description", {}), + description_json=request.data.get("issue", {}).get("description_json", {}), description_html=request.data.get("issue", {}).get("description_html", "
"), priority=request.data.get("issue", {}).get("priority", "none"), project_id=project_id, @@ -368,7 +368,7 @@ def patch(self, request, slug, project_id, issue_id): issue_data = { "name": issue_data.get("name", issue.name), "description_html": issue_data.get("description_html", issue.description_html), - "description": issue_data.get("description", issue.description), + "description_json": issue_data.get("description_json", issue.description_json), } issue_serializer = IssueSerializer(issue, data=issue_data, partial=True) diff --git a/apps/api/plane/app/serializers/issue.py b/apps/api/plane/app/serializers/issue.py index c8f530ba18c..b1e1044cd69 100644 --- a/apps/api/plane/app/serializers/issue.py +++ b/apps/api/plane/app/serializers/issue.py @@ -53,7 +53,7 @@ class Meta: fields = [ "id", "name", - "description", + "description_json", "description_html", "priority", "start_date", diff --git a/apps/api/plane/app/serializers/page.py b/apps/api/plane/app/serializers/page.py index 3aecbafda3f..1c2d2d676ca 100644 --- a/apps/api/plane/app/serializers/page.py +++ b/apps/api/plane/app/serializers/page.py @@ -58,7 +58,7 @@ 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_json = self.context["description_json"] description_binary = self.context["description_binary"] description_html = self.context["description_html"] @@ -68,7 +68,7 @@ def create(self, validated_data): # Create the page page = Page.objects.create( **validated_data, - description=description, + description_json=description_json, description_binary=description_binary, description_html=description_html, owned_by_id=owned_by_id, @@ -171,7 +171,7 @@ class PageBinaryUpdateSerializer(serializers.Serializer): description_binary = serializers.CharField(required=False, allow_blank=True) description_html = serializers.CharField(required=False, allow_blank=True) - description = serializers.JSONField(required=False, allow_null=True) + description_json = serializers.JSONField(required=False, allow_null=True) def validate_description_binary(self, value): """Validate the base64-encoded binary data""" @@ -214,8 +214,8 @@ def update(self, instance, validated_data): if "description_html" in validated_data: instance.description_html = validated_data.get("description_html") - if "description" in validated_data: - instance.description = validated_data.get("description") + if "description_json" in validated_data: + instance.description_json = validated_data.get("description_json") instance.save() return instance diff --git a/apps/api/plane/app/views/intake/base.py b/apps/api/plane/app/views/intake/base.py index 7dd7828cbdf..babe2e021ef 100644 --- a/apps/api/plane/app/views/intake/base.py +++ b/apps/api/plane/app/views/intake/base.py @@ -394,7 +394,7 @@ def partial_update(self, request, slug, project_id, pk): issue_data = { "name": issue_data.get("name", issue.name), "description_html": issue_data.get("description_html", issue.description_html), - "description": issue_data.get("description", issue.description), + "description_json": issue_data.get("description_json", issue.description_json), } issue_current_instance = json.dumps(IssueDetailSerializer(issue).data, cls=DjangoJSONEncoder) diff --git a/apps/api/plane/app/views/page/base.py b/apps/api/plane/app/views/page/base.py index d3ad49b5fda..e94b26b90c8 100644 --- a/apps/api/plane/app/views/page/base.py +++ b/apps/api/plane/app/views/page/base.py @@ -128,7 +128,7 @@ def create(self, request, slug, project_id): context={ "project_id": project_id, "owned_by_id": request.user.id, - "description": request.data.get("description", {}), + "description_json": request.data.get("description_json", {}), "description_binary": request.data.get("description_binary", None), "description_html": request.data.get("description_html", ""), }, diff --git a/apps/api/plane/bgtasks/copy_s3_object.py b/apps/api/plane/bgtasks/copy_s3_object.py index e7ef09e353a..7db7fd3b3fc 100644 --- a/apps/api/plane/bgtasks/copy_s3_object.py +++ b/apps/api/plane/bgtasks/copy_s3_object.py @@ -141,7 +141,7 @@ def copy_s3_objects_of_description_and_assets(entity_name, entity_identifier, pr external_data = sync_with_external_service(entity_name, updated_html) if external_data: - entity.description = external_data.get("description") + entity.description_json = external_data.get("description_json") entity.description_binary = base64.b64decode(external_data.get("description_binary")) entity.save() diff --git a/apps/api/plane/bgtasks/issue_description_version_sync.py b/apps/api/plane/bgtasks/issue_description_version_sync.py index d10ebfcbac7..763d10cd541 100644 --- a/apps/api/plane/bgtasks/issue_description_version_sync.py +++ b/apps/api/plane/bgtasks/issue_description_version_sync.py @@ -59,7 +59,7 @@ def sync_issue_description_version(batch_size=5000, offset=0, countdown=300): "description_binary", "description_html", "description_stripped", - "description", + "description_json", )[offset:end_offset] ) @@ -92,7 +92,7 @@ def sync_issue_description_version(batch_size=5000, offset=0, countdown=300): description_binary=issue.description_binary, description_html=issue.description_html, description_stripped=issue.description_stripped, - description_json=issue.description, + description_json=issue.description_json, ) ) diff --git a/apps/api/plane/bgtasks/issue_description_version_task.py b/apps/api/plane/bgtasks/issue_description_version_task.py index 06d15705a73..51d5f4a6494 100644 --- a/apps/api/plane/bgtasks/issue_description_version_task.py +++ b/apps/api/plane/bgtasks/issue_description_version_task.py @@ -19,7 +19,7 @@ def should_update_existing_version( def update_existing_version(version: IssueDescriptionVersion, issue) -> None: - version.description_json = issue.description + version.description_json = issue.description_json version.description_html = issue.description_html version.description_binary = issue.description_binary version.description_stripped = issue.description_stripped diff --git a/apps/api/plane/bgtasks/page_version_task.py b/apps/api/plane/bgtasks/page_version_task.py index 4de2387becf..111b4f23603 100644 --- a/apps/api/plane/bgtasks/page_version_task.py +++ b/apps/api/plane/bgtasks/page_version_task.py @@ -28,7 +28,7 @@ def page_version(page_id, existing_instance, user_id): description_binary=page.description_binary, owned_by_id=user_id, last_saved_at=page.updated_at, - description_json=page.description, + description_json=page.description_json, description_stripped=page.description_stripped, ) diff --git a/apps/api/plane/bgtasks/workspace_seed_task.py b/apps/api/plane/bgtasks/workspace_seed_task.py index df69b1f4acc..66c7969b49f 100644 --- a/apps/api/plane/bgtasks/workspace_seed_task.py +++ b/apps/api/plane/bgtasks/workspace_seed_task.py @@ -359,7 +359,7 @@ def create_pages(workspace: Workspace, project_map: Dict[int, uuid.UUID], bot_us is_global=False, access=page_seed.get("access", Page.PUBLIC_ACCESS), name=page_seed.get("name"), - description=page_seed.get("description", {}), + description_json=page_seed.get("description_json", {}), description_html=page_seed.get("description_html", ""), description_binary=page_seed.get("description_binary", None), description_stripped=page_seed.get("description_stripped", None), diff --git a/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py b/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py new file mode 100644 index 00000000000..6bf647b777c --- /dev/null +++ b/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.22 on 2026-01-09 08:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0115_auto_20260105_0836'), + ] + + operations = [ + migrations.RenameField( + model_name='draftissue', + old_name='description', + new_name='description_json', + ), + migrations.RenameField( + model_name='issue', + old_name='description', + new_name='description_json', + ), + migrations.RenameField( + model_name='page', + old_name='description', + new_name='description_json', + ), + ] diff --git a/apps/api/plane/db/models/draft.py b/apps/api/plane/db/models/draft.py index 55dbb61df94..cabe73d597d 100644 --- a/apps/api/plane/db/models/draft.py +++ b/apps/api/plane/db/models/draft.py @@ -39,7 +39,7 @@ class DraftIssue(WorkspaceBaseModel): blank=True, ) name = models.CharField(max_length=255, verbose_name="Issue Name", blank=True, null=True) - description = models.JSONField(blank=True, default=dict) + description_json = models.JSONField(blank=True, default=dict) description_html = models.TextField(blank=True, default="") description_stripped = models.TextField(blank=True, null=True) description_binary = models.BinaryField(null=True) diff --git a/apps/api/plane/db/models/issue.py b/apps/api/plane/db/models/issue.py index 68a4ae6dd0f..a2b3af41b6f 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -128,7 +128,7 @@ class Issue(ProjectBaseModel): blank=True, ) name = models.CharField(max_length=255, verbose_name="Issue Name") - description = models.JSONField(blank=True, default=dict) + description_json = models.JSONField(blank=True, default=dict) description_html = models.TextField(blank=True, default="") description_stripped = models.TextField(blank=True, null=True) description_binary = models.BinaryField(null=True) @@ -800,7 +800,7 @@ def log_issue_description_version(cls, issue, user): description_binary=issue.description_binary, description_html=issue.description_html, description_stripped=issue.description_stripped, - description_json=issue.description, + description_json=issue.description_json, ) return True except Exception as e: diff --git a/apps/api/plane/db/models/page.py b/apps/api/plane/db/models/page.py index 213954d1498..e51ee9b4c88 100644 --- a/apps/api/plane/db/models/page.py +++ b/apps/api/plane/db/models/page.py @@ -25,7 +25,7 @@ class Page(BaseModel): workspace = models.ForeignKey("db.Workspace", on_delete=models.CASCADE, related_name="pages") name = models.TextField(blank=True) - description = models.JSONField(default=dict, blank=True) + description_json = models.JSONField(default=dict, blank=True) description_binary = models.BinaryField(null=True) description_html = models.TextField(blank=True, default="") description_stripped = models.TextField(blank=True, null=True) diff --git a/apps/api/plane/space/serializer/issue.py b/apps/api/plane/space/serializer/issue.py index a89846cfc78..237e00c5ddc 100644 --- a/apps/api/plane/space/serializer/issue.py +++ b/apps/api/plane/space/serializer/issue.py @@ -193,7 +193,7 @@ class Meta: fields = [ "id", "name", - "description", + "description_json", "description_html", "priority", "start_date", diff --git a/apps/api/plane/space/views/intake.py b/apps/api/plane/space/views/intake.py index 7ea2dee91fb..d4f6f6b7e41 100644 --- a/apps/api/plane/space/views/intake.py +++ b/apps/api/plane/space/views/intake.py @@ -140,7 +140,7 @@ def create(self, request, anchor, intake_id): # create an issue issue = Issue.objects.create( name=request.data.get("issue", {}).get("name"), - description=request.data.get("issue", {}).get("description", {}), + description_json=request.data.get("issue", {}).get("description_json", {}), description_html=request.data.get("issue", {}).get("description_html", ""), priority=request.data.get("issue", {}).get("priority", "low"), project_id=project_deploy_board.project_id, @@ -201,7 +201,7 @@ def partial_update(self, request, anchor, intake_id, pk): issue_data = { "name": issue_data.get("name", issue.name), "description_html": issue_data.get("description_html", issue.description_html), - "description": issue_data.get("description", issue.description), + "description_json": issue_data.get("description_json", issue.description_json), } issue_serializer = IssueCreateSerializer( diff --git a/apps/api/plane/space/views/issue.py b/apps/api/plane/space/views/issue.py index 220fc130734..d0d926319c3 100644 --- a/apps/api/plane/space/views/issue.py +++ b/apps/api/plane/space/views/issue.py @@ -744,7 +744,7 @@ def get(self, request, anchor, issue_id): "name", "state_id", "sort_order", - "description", + "description_json", "description_html", "description_stripped", "description_binary", diff --git a/apps/live/src/controllers/document.controller.ts b/apps/live/src/controllers/document.controller.ts index 832045766fe..b77426ab5de 100644 --- a/apps/live/src/controllers/document.controller.ts +++ b/apps/live/src/controllers/document.controller.ts @@ -27,14 +27,14 @@ export class DocumentController { const { description_html, variant } = validatedData; // Process document conversion - const { description, description_binary } = convertHTMLDocumentToAllFormats({ + const { description_json, description_binary } = convertHTMLDocumentToAllFormats({ document_html: description_html, variant, }); // Return successful response res.status(200).json({ - description, + description_json, description_binary, }); } catch (error) { diff --git a/apps/live/src/extensions/database.ts b/apps/live/src/extensions/database.ts index 2c6c6ac7e5b..1b40d3b2313 100644 --- a/apps/live/src/extensions/database.ts +++ b/apps/live/src/extensions/database.ts @@ -1,11 +1,12 @@ import { Database as HocuspocusDatabase } from "@hocuspocus/extension-database"; -// utils +// plane imports import { getAllDocumentFormatsFromDocumentEditorBinaryData, getBinaryDataFromDocumentEditorHTMLString, } from "@plane/editor"; -// logger +import type { TDocumentPayload } from "@plane/types"; import { logger } from "@plane/logger"; +// lib import { AppError } from "@/lib/errors"; // services import { getPageService } from "@/services/page/handler"; @@ -36,10 +37,10 @@ const fetchDocument = async ({ context, documentName: pageId, instance }: FetchP convertedBinaryData, true ); - const payload = { + const payload: TDocumentPayload = { description_binary: contentBinaryEncoded, description_html: contentHTML, - description: contentJSON, + description_json: contentJSON, }; await service.updateDescriptionBinary(pageId, payload); } catch (e) { @@ -76,10 +77,10 @@ const storeDocument = async ({ true ); // create payload - const payload = { + const payload: TDocumentPayload = { description_binary: contentBinaryEncoded, description_html: contentHTML, - description: contentJSON, + description_json: contentJSON, }; await service.updateDescriptionBinary(pageId, payload); } catch (error) { diff --git a/apps/live/src/services/page/core.service.ts b/apps/live/src/services/page/core.service.ts index 04a06409127..53ba24261c4 100644 --- a/apps/live/src/services/page/core.service.ts +++ b/apps/live/src/services/page/core.service.ts @@ -1,15 +1,9 @@ import { logger } from "@plane/logger"; -import type { TPage } from "@plane/types"; +import type { TDocumentPayload, TPage } from "@plane/types"; // services import { AppError } from "@/lib/errors"; import { APIService } from "../api.service"; -export type TPageDescriptionPayload = { - description_binary: string; - description_html: string; - description: object; -}; - export abstract class PageCoreService extends APIService { protected abstract basePath: string; @@ -103,7 +97,7 @@ export abstract class PageCoreService extends APIService { } } - async updateDescriptionBinary(pageId: string, data: TPageDescriptionPayload): Promise