From 1b0b487cb8f786bf66cfc6ccf0bddb6472374b2f Mon Sep 17 00:00:00 2001 From: Harsh Tandiya Date: Wed, 7 Jan 2026 18:44:16 +0530 Subject: [PATCH 01/22] fix: improve type hinting and ensure boolean conversion for desk access --- forms_pro/api/user.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forms_pro/api/user.py b/forms_pro/api/user.py index 11c49f7..d43d1e4 100644 --- a/forms_pro/api/user.py +++ b/forms_pro/api/user.py @@ -1,5 +1,6 @@ import frappe from frappe.core.doctype.has_role.has_role import HasRole +from frappe.core.doctype.user.user import User from pydantic import BaseModel, Field, field_validator from forms_pro.utils.teams import get_user_teams as get_user_teams_utils @@ -51,10 +52,10 @@ def get_current_user() -> GetUserResponseSchema: """ user_id = frappe.session.user - user_doc = frappe.get_doc("User", user_id) + user_doc: User = frappe.get_doc("User", user_id) data = user_doc.as_dict() data["roles"] = user_doc.get("roles") - data["has_desk_access"] = user_doc.has_desk_access() + data["has_desk_access"] = bool(user_doc.has_desk_access()) return GetUserResponseSchema.model_validate(data).model_dump() From 1984a5a48245a9ac3780d8a83e285b1c62b61bcb Mon Sep 17 00:00:00 2001 From: Harsh Tandiya Date: Wed, 7 Jan 2026 18:51:54 +0530 Subject: [PATCH 02/22] feat: get user submission api endpoint --- forms_pro/api/submission.py | 68 +++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/forms_pro/api/submission.py b/forms_pro/api/submission.py index a4d892d..2d12f90 100644 --- a/forms_pro/api/submission.py +++ b/forms_pro/api/submission.py @@ -1,9 +1,41 @@ +from datetime import datetime +from typing import Any + import frappe +from pydantic import BaseModel, Field, field_validator + +from forms_pro.forms_pro.doctype.form.form import Form + + +class UserSubmissionResponse(BaseModel): + name: str = Field(description="Name of the submission") + creation: datetime = Field(description="Creation date of the submission") + modified: datetime = Field(description="Last modified date of the submission") + + @field_validator("creation", "modified", mode="before") + @classmethod + def parse_datetime(cls, v: Any) -> datetime: + """Convert datetime string to datetime object.""" + if isinstance(v, str): + return frappe.utils.get_datetime(v) + if isinstance(v, datetime): + return v + raise ValueError(f"Invalid datetime value: {v}") @frappe.whitelist(allow_guest=True) -def submit_form_response(form_id: str, form_data: list[dict]): - form = frappe.get_doc("Form", form_id) +def submit_form_response(form_id: str, form_data: list[dict]) -> str: + """ + Submit a form response + + Args: + form_id: The ID of the form + form_data: The data of the form + + Returns: + The name of the submission + """ + form: Form = frappe.get_doc("Form", form_id) linked_doctype = form.linked_doctype submission = frappe.new_doc(linked_doctype) @@ -12,3 +44,35 @@ def submit_form_response(form_id: str, form_data: list[dict]): submission.insert(ignore_permissions=True) return submission.name + + +@frappe.whitelist() +def get_user_submissions(form_id: str) -> list[UserSubmissionResponse]: + """ + Get the submissions for a user + + Args: + form_id: The ID of the form + + Returns: + A list of submissions for the user + """ + + print(form_id) + + if frappe.session.user == "Guest": + return [] + + form: Form = frappe.get_doc("Form", form_id) + linked_doctype = form.linked_doctype + + submissions = frappe.db.get_all( + doctype=linked_doctype, + filters={"owner": frappe.session.user}, + fields=["name", "creation", "modified"], + order_by="creation desc", + ) + + print(submissions) + + return [UserSubmissionResponse.model_validate(submission).model_dump() for submission in submissions] From 41b71529f6d1a0a8f0d3e3213ab0c92d7054f91c Mon Sep 17 00:00:00 2001 From: Harsh Tandiya Date: Wed, 7 Jan 2026 19:16:40 +0530 Subject: [PATCH 03/22] feat: share form submission with owner upon creation --- forms_pro/api/submission.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/forms_pro/api/submission.py b/forms_pro/api/submission.py index 2d12f90..c0341a7 100644 --- a/forms_pro/api/submission.py +++ b/forms_pro/api/submission.py @@ -2,6 +2,8 @@ from typing import Any import frappe +from frappe.model.document import Document +from frappe.share import add_docshare from pydantic import BaseModel, Field, field_validator from forms_pro.forms_pro.doctype.form.form import Form @@ -43,6 +45,19 @@ def submit_form_response(form_id: str, form_data: list[dict]) -> str: submission.set(data["fieldname"], data["value"]) submission.insert(ignore_permissions=True) + # Share the submission with the owner + add_docshare( + doctype=linked_doctype, + name=submission.name, + user=frappe.session.user, + read=1, + write=1, + submit=1, + flags={ + "ignore_share_permission": True, + }, + ) + return submission.name @@ -58,8 +73,6 @@ def get_user_submissions(form_id: str) -> list[UserSubmissionResponse]: A list of submissions for the user """ - print(form_id) - if frappe.session.user == "Guest": return [] @@ -73,6 +86,4 @@ def get_user_submissions(form_id: str) -> list[UserSubmissionResponse]: order_by="creation desc", ) - print(submissions) - return [UserSubmissionResponse.model_validate(submission).model_dump() for submission in submissions] From c109f51b23d8b3716789b68f878ba1dc2bf880fe Mon Sep 17 00:00:00 2001 From: Harsh Tandiya Date: Wed, 7 Jan 2026 19:17:07 +0530 Subject: [PATCH 04/22] feat: add PreviousSubmissionSection component to display user submissions --- .../submission/PreviousSubmissionSection.vue | 38 +++++++++++++++++ frontend/src/pages/SubmissionPage.vue | 7 ++-- frontend/src/stores/submissionForm.ts | 41 +++++++++++++++++-- 3 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 frontend/src/components/submission/PreviousSubmissionSection.vue diff --git a/frontend/src/components/submission/PreviousSubmissionSection.vue b/frontend/src/components/submission/PreviousSubmissionSection.vue new file mode 100644 index 0000000..9cb8945 --- /dev/null +++ b/frontend/src/components/submission/PreviousSubmissionSection.vue @@ -0,0 +1,38 @@ + + diff --git a/frontend/src/pages/SubmissionPage.vue b/frontend/src/pages/SubmissionPage.vue index cb76ebc..ab15b75 100644 --- a/frontend/src/pages/SubmissionPage.vue +++ b/frontend/src/pages/SubmissionPage.vue @@ -5,17 +5,18 @@ import FormHeader from "@/components/submission/FormHeader.vue"; import FormRenderer from "@/components/submission/FormRenderer.vue"; import Logo from "@/assets/Logo.vue"; import PageHeader from "@/components/submission/PageHeader.vue"; +import PreviousSubmissionSection from "@/components/submission/PreviousSubmissionSection.vue"; const route = useRoute(); const submissionFormStore = useSubmissionForm(); submissionFormStore.initialize(route.params.route as string);