From 21ad06f3970238a3c5205391e8d6bd4d08a70269 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Wed, 3 Dec 2025 13:34:21 +0530 Subject: [PATCH 1/7] chore: migrating description to description json --- apps/api/plane/api/serializers/intake.py | 2 +- apps/api/plane/api/serializers/issue.py | 2 +- apps/api/plane/api/views/intake.py | 4 ++-- apps/api/plane/app/serializers/issue.py | 2 +- apps/api/plane/app/serializers/page.py | 10 ++++---- apps/api/plane/app/views/intake/base.py | 2 +- apps/api/plane/app/views/page/base.py | 2 +- apps/api/plane/bgtasks/copy_s3_object.py | 2 +- .../bgtasks/issue_description_version_sync.py | 4 ++-- .../bgtasks/issue_description_version_task.py | 2 +- apps/api/plane/bgtasks/page_version_task.py | 2 +- apps/api/plane/bgtasks/workspace_seed_task.py | 2 +- ...ription_issue_description_json_and_more.py | 23 +++++++++++++++++++ apps/api/plane/db/models/draft.py | 2 +- apps/api/plane/db/models/issue.py | 4 ++-- apps/api/plane/db/models/page.py | 2 +- apps/api/plane/space/serializer/issue.py | 2 +- apps/api/plane/space/views/intake.py | 4 ++-- apps/api/plane/space/views/issue.py | 2 +- apps/web/core/hooks/use-page-fallback.ts | 2 +- apps/web/core/store/pages/base-page.ts | 8 +++---- .../editors/document/page-renderer.tsx | 2 +- 22 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 apps/api/plane/db/migrations/0113_rename_description_issue_description_json_and_more.py 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 5e3b93ab674..cb6b42d13ce 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 ffd72503788..48a6ae034ab 100644 --- a/apps/api/plane/app/views/intake/base.py +++ b/apps/api/plane/app/views/intake/base.py @@ -391,7 +391,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 50daf440adc..8c837be775f 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 fb9980c3fd6..bd0021fb690 100644 --- a/apps/api/plane/bgtasks/workspace_seed_task.py +++ b/apps/api/plane/bgtasks/workspace_seed_task.py @@ -347,7 +347,7 @@ def create_pages(workspace: Workspace, project_map: Dict[int, uuid.UUID]) -> Non 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/0113_rename_description_issue_description_json_and_more.py b/apps/api/plane/db/migrations/0113_rename_description_issue_description_json_and_more.py new file mode 100644 index 00000000000..fccdebd8f2c --- /dev/null +++ b/apps/api/plane/db/migrations/0113_rename_description_issue_description_json_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.25 on 2025-12-02 08:50 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0112_auto_20251124_0603'), + ] + + operations = [ + 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 d3377f0ad37..6ba5afe5dbf 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -136,7 +136,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) @@ -840,7 +840,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/web/core/hooks/use-page-fallback.ts b/apps/web/core/hooks/use-page-fallback.ts index 4551031d1d0..aafe2fdea38 100644 --- a/apps/web/core/hooks/use-page-fallback.ts +++ b/apps/web/core/hooks/use-page-fallback.ts @@ -39,7 +39,7 @@ export const usePageFallback = (args: TArgs) => { await updatePageDescription({ description_binary: encodedBinary, description_html: html, - description: json, + description_json: json, }); } catch (error) { console.error("Error in updating description using fallback logic:", error); diff --git a/apps/web/core/store/pages/base-page.ts b/apps/web/core/store/pages/base-page.ts index b9381f248f8..b648abcf2aa 100644 --- a/apps/web/core/store/pages/base-page.ts +++ b/apps/web/core/store/pages/base-page.ts @@ -77,7 +77,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { id: string | undefined; name: string | undefined; logo_props: TLogoProps | undefined; - description: object | undefined; + description_json: object | undefined; description_html: string | undefined; color: string | undefined; label_ids: string[] | undefined; @@ -114,7 +114,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { this.id = page?.id || undefined; this.name = page?.name; this.logo_props = page?.logo_props || undefined; - this.description = page?.description || undefined; + this.description_json = page?.description_json || undefined; this.description_html = page?.description_html || undefined; this.color = page?.color || undefined; this.label_ids = page?.label_ids || undefined; @@ -139,7 +139,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { id: observable.ref, name: observable.ref, logo_props: observable.ref, - description: observable, + description_json: observable.ref, description_html: observable.ref, color: observable.ref, label_ids: observable, @@ -213,7 +213,7 @@ export class BasePage extends ExtendedBasePage implements TBasePage { return { id: this.id, name: this.name, - description: this.description, + description_json: this.description_json, description_html: this.description_html, color: this.color, label_ids: this.label_ids, diff --git a/packages/editor/src/core/components/editors/document/page-renderer.tsx b/packages/editor/src/core/components/editors/document/page-renderer.tsx index 26a69e45744..9365b8dbc8e 100644 --- a/packages/editor/src/core/components/editors/document/page-renderer.tsx +++ b/packages/editor/src/core/components/editors/document/page-renderer.tsx @@ -53,7 +53,7 @@ export function PageRenderer(props: Props) { "wide-layout": displayConfig.wideLayout, })} > - {isLoading ? ( + {false ? ( ) : ( Date: Tue, 30 Dec 2025 13:48:38 +0530 Subject: [PATCH 2/7] chore: replace description with description_json --- apps/live/src/controllers/document.controller.ts | 4 ++-- apps/live/src/extensions/database.ts | 13 +++++++------ apps/live/src/services/page/core.service.ts | 10 ++-------- .../components/editors/document/page-renderer.tsx | 2 +- packages/editor/src/core/helpers/yjs-utils.ts | 4 ++-- packages/types/src/page/core.ts | 4 ++-- 6 files changed, 16 insertions(+), 21 deletions(-) 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 { + async updateDescriptionBinary(pageId: string, data: TDocumentPayload): Promise { return this.patch(`${this.basePath}/pages/${pageId}/description/`, data, { headers: this.getHeader(), }) diff --git a/packages/editor/src/core/components/editors/document/page-renderer.tsx b/packages/editor/src/core/components/editors/document/page-renderer.tsx index b35d9534a42..591c5e55b25 100644 --- a/packages/editor/src/core/components/editors/document/page-renderer.tsx +++ b/packages/editor/src/core/components/editors/document/page-renderer.tsx @@ -59,7 +59,7 @@ export function PageRenderer(props: Props) { "wide-layout": displayConfig.wideLayout, })} > - {false ? ( + {isLoading ? ( ) : ( <> diff --git a/packages/editor/src/core/helpers/yjs-utils.ts b/packages/editor/src/core/helpers/yjs-utils.ts index bb7d1fef681..61c6923c741 100644 --- a/packages/editor/src/core/helpers/yjs-utils.ts +++ b/packages/editor/src/core/helpers/yjs-utils.ts @@ -215,7 +215,7 @@ export const convertHTMLDocumentToAllFormats = (args: TConvertHTMLDocumentToAllF const { contentBinaryEncoded, contentHTML, contentJSON } = getAllDocumentFormatsFromRichTextEditorBinaryData(contentBinary); allFormats = { - description: contentJSON, + description_json: contentJSON, description_html: contentHTML, description_binary: contentBinaryEncoded, }; @@ -228,7 +228,7 @@ export const convertHTMLDocumentToAllFormats = (args: TConvertHTMLDocumentToAllF false ); allFormats = { - description: contentJSON, + description_json: contentJSON, description_html: contentHTML, description_binary: contentBinaryEncoded, }; diff --git a/packages/types/src/page/core.ts b/packages/types/src/page/core.ts index 99b46418850..d1703ad0621 100644 --- a/packages/types/src/page/core.ts +++ b/packages/types/src/page/core.ts @@ -8,7 +8,7 @@ export type TPage = { color: string | undefined; created_at: Date | undefined; created_by: string | undefined; - description: object | undefined; + description_json: object | undefined; description_html: string | undefined; id: string | undefined; is_favorite: boolean; @@ -66,7 +66,7 @@ export type TPageVersion = { export type TDocumentPayload = { description_binary: string; description_html: string; - description: object; + description_json: object; }; export type TWebhookConnectionQueryParams = { From b8844b2f62e51d2b69d9b914fc3d126dd03fcdc5 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Sat, 3 Jan 2026 17:24:40 +0530 Subject: [PATCH 3/7] chore: updated migration file --- ..._description_draftissue_description_json_and_more.py} | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) rename apps/api/plane/db/migrations/{0113_rename_description_issue_description_json_and_more.py => 0114_rename_description_draftissue_description_json_and_more.py} (63%) diff --git a/apps/api/plane/db/migrations/0113_rename_description_issue_description_json_and_more.py b/apps/api/plane/db/migrations/0114_rename_description_draftissue_description_json_and_more.py similarity index 63% rename from apps/api/plane/db/migrations/0113_rename_description_issue_description_json_and_more.py rename to apps/api/plane/db/migrations/0114_rename_description_draftissue_description_json_and_more.py index fccdebd8f2c..0df7271eb51 100644 --- a/apps/api/plane/db/migrations/0113_rename_description_issue_description_json_and_more.py +++ b/apps/api/plane/db/migrations/0114_rename_description_draftissue_description_json_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.25 on 2025-12-02 08:50 +# Generated by Django 4.2.22 on 2026-01-03 11:53 from django.db import migrations @@ -6,10 +6,15 @@ class Migration(migrations.Migration): dependencies = [ - ('db', '0112_auto_20251124_0603'), + ('db', '0113_webhook_version'), ] operations = [ + migrations.RenameField( + model_name='draftissue', + old_name='description', + new_name='description_json', + ), migrations.RenameField( model_name='issue', old_name='description', From c3fdd1ee36f0e497baf596d6b4bdf877cb708cec Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Fri, 9 Jan 2026 13:48:19 +0530 Subject: [PATCH 4/7] chore: updated the migration file --- ...ename_description_draftissue_description_json_and_more.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename apps/api/plane/db/migrations/{0114_rename_description_draftissue_description_json_and_more.py => 0116_rename_description_draftissue_description_json_and_more.py} (86%) diff --git a/apps/api/plane/db/migrations/0114_rename_description_draftissue_description_json_and_more.py b/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py similarity index 86% rename from apps/api/plane/db/migrations/0114_rename_description_draftissue_description_json_and_more.py rename to apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py index 0df7271eb51..6bf647b777c 100644 --- a/apps/api/plane/db/migrations/0114_rename_description_draftissue_description_json_and_more.py +++ b/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.22 on 2026-01-03 11:53 +# Generated by Django 4.2.22 on 2026-01-09 08:17 from django.db import migrations @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('db', '0113_webhook_version'), + ('db', '0115_auto_20260105_0836'), ] operations = [ From bc8321e3317c9d08d2a02614713a3e1fd7ee8f05 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 15 Jan 2026 14:27:19 +0530 Subject: [PATCH 5/7] chore: added description key in external endpoint --- apps/api/plane/api/serializers/intake.py | 3 +++ apps/api/plane/api/serializers/issue.py | 1 + apps/api/plane/api/views/intake.py | 14 +++++++++----- ...ription_draftissue_description_json_and_more.py | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/api/plane/api/serializers/intake.py b/apps/api/plane/api/serializers/intake.py index d8741d84f8b..d8b9a1ba8c8 100644 --- a/apps/api/plane/api/serializers/intake.py +++ b/apps/api/plane/api/serializers/intake.py @@ -13,10 +13,13 @@ class IssueForIntakeSerializer(BaseSerializer): content validation and priority assignment for triage workflows. """ + description = serializers.JSONField(source="description_json", required=False, allow_null=True) + class Meta: model = Issue fields = [ "name", + "description", # Depricated "description_json", "description_html", "priority", diff --git a/apps/api/plane/api/serializers/issue.py b/apps/api/plane/api/serializers/issue.py index 4f9447bd9f5..a8bdd557bb9 100644 --- a/apps/api/plane/api/serializers/issue.py +++ b/apps/api/plane/api/serializers/issue.py @@ -633,6 +633,7 @@ class IssueExpandSerializer(BaseSerializer): labels = serializers.SerializerMethodField() assignees = serializers.SerializerMethodField() state = StateLiteSerializer(read_only=True) + description = serializers.JSONField(source="description_json", read_only=True) def get_labels(self, obj): expand = self.context.get("expand", []) diff --git a/apps/api/plane/api/views/intake.py b/apps/api/plane/api/views/intake.py index 077f484e905..a3d86bf16c7 100644 --- a/apps/api/plane/api/views/intake.py +++ b/apps/api/plane/api/views/intake.py @@ -180,11 +180,14 @@ def post(self, request, slug, project_id): ) # create an issue + issue_data = request.data.get("issue", {}) + # Accept both "description" and "description_json" keys for the description_json field + description_json = issue_data.get("description") or issue_data.get("description_json") or {} issue = Issue.objects.create( - name=request.data.get("issue", {}).get("name"), - 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"), + name=issue_data.get("name"), + description_json=description_json, + description_html=issue_data.get("description_html", "

"), + priority=issue_data.get("priority", "none"), project_id=project_id, state_id=triage_state.id, ) @@ -365,10 +368,11 @@ def patch(self, request, slug, project_id, issue_id): # Only allow guests to edit name and description if project_member.role <= 5: + description_json = issue_data.get("description") or issue_data.get("description_json") or {} issue_data = { "name": issue_data.get("name", issue.name), "description_html": issue_data.get("description_html", issue.description_html), - "description_json": issue_data.get("description_json", issue.description_json), + "description_json": description_json, } issue_serializer = IssueSerializer(issue, data=issue_data, partial=True) 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 index 6bf647b777c..18dc9aa8062 100644 --- 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 @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('db', '0115_auto_20260105_0836'), + ('db', '0115_auto_20260105_1406'), ] operations = [ From 0c81ea27cd4077a4ccc3f5177276578f7980ae05 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 15 Jan 2026 14:32:26 +0530 Subject: [PATCH 6/7] chore: updated the migration file --- ...ename_description_draftissue_description_json_and_more.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename apps/api/plane/db/migrations/{0116_rename_description_draftissue_description_json_and_more.py => 0117_rename_description_draftissue_description_json_and_more.py} (83%) diff --git a/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py b/apps/api/plane/db/migrations/0117_rename_description_draftissue_description_json_and_more.py similarity index 83% rename from apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py rename to apps/api/plane/db/migrations/0117_rename_description_draftissue_description_json_and_more.py index 18dc9aa8062..2317a4cdd77 100644 --- a/apps/api/plane/db/migrations/0116_rename_description_draftissue_description_json_and_more.py +++ b/apps/api/plane/db/migrations/0117_rename_description_draftissue_description_json_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.22 on 2026-01-09 08:17 +# Generated by Django 4.2.22 on 2026-01-15 09:02 from django.db import migrations @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('db', '0115_auto_20260105_1406'), + ('db', '0116_workspacemember_explored_features_and_more'), ] operations = [ From 64bd2178a6da835db8e626bac75dda046dffde51 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Thu, 15 Jan 2026 14:33:28 +0530 Subject: [PATCH 7/7] chore: updated the typo --- apps/api/plane/api/serializers/intake.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/plane/api/serializers/intake.py b/apps/api/plane/api/serializers/intake.py index d8b9a1ba8c8..8f560f0757d 100644 --- a/apps/api/plane/api/serializers/intake.py +++ b/apps/api/plane/api/serializers/intake.py @@ -19,7 +19,7 @@ class Meta: model = Issue fields = [ "name", - "description", # Depricated + "description", # Deprecated "description_json", "description_html", "priority",