Merge pull request #50405 from frappe/mergify/bp/version-15-hotfix/pr-50326

fix: validate is_group for parent task (backport #50326)
This commit is contained in:
ruthra kumar
2025-11-10 12:58:34 +05:30
committed by GitHub
2 changed files with 40 additions and 5 deletions

View File

@@ -17,6 +17,10 @@ class CircularReferenceError(frappe.ValidationError):
pass
class ParentIsGroupError(frappe.ValidationError):
pass
class Task(NestedSet):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.
@@ -83,6 +87,7 @@ class Task(NestedSet):
self.update_depends_on()
self.validate_dependencies_for_template_task()
self.validate_completed_on()
self.validate_parent_is_group()
def validate_dates(self):
self.validate_from_to_dates("exp_start_date", "exp_end_date")
@@ -153,20 +158,36 @@ class Task(NestedSet):
def validate_parent_template_task(self):
if self.parent_task:
if not frappe.db.get_value("Task", self.parent_task, "is_template"):
parent_task_format = f"""<a href="/app/task/{self.parent_task}">{self.parent_task}</a>"""
frappe.throw(_("Parent Task {0} is not a Template Task").format(parent_task_format))
frappe.throw(
_("Parent Task {0} is not a Template Task").format(
get_link_to_form("Task", self.parent_task)
)
)
def validate_depends_on_tasks(self):
if self.depends_on:
for task in self.depends_on:
if not frappe.db.get_value("Task", task.task, "is_template"):
dependent_task_format = f"""<a href="/app/task/{task.task}">{task.task}</a>"""
frappe.throw(_("Dependent Task {0} is not a Template Task").format(dependent_task_format))
frappe.throw(
_("Dependent Task {0} is not a Template Task").format(
get_link_to_form("Task", task.task)
)
)
def validate_completed_on(self):
if self.completed_on and getdate(self.completed_on) > getdate():
frappe.throw(_("Completed On cannot be greater than Today"))
def validate_parent_is_group(self):
if self.parent_task:
if not frappe.db.get_value("Task", self.parent_task, "is_group"):
frappe.throw(
_("Parent Task {0} must be a Group Task").format(
get_link_to_form("Task", self.parent_task)
),
ParentIsGroupError,
)
def update_depends_on(self):
depends_on_tasks = ""
for d in self.depends_on:

View File

@@ -6,7 +6,7 @@ import unittest
import frappe
from frappe.utils import add_days, getdate, nowdate
from erpnext.projects.doctype.task.task import CircularReferenceError
from erpnext.projects.doctype.task.task import CircularReferenceError, ParentIsGroupError
class TestTask(unittest.TestCase):
@@ -109,6 +109,20 @@ class TestTask(unittest.TestCase):
self.assertEqual(frappe.db.get_value("Task", task.name, "status"), "Overdue")
def test_parent_task_must_be_group(self):
parent_task = create_task(
subject="_Test Parent Task Non Group",
is_group=0,
)
child_task = create_task(
subject="_Test Child Task",
parent_task=parent_task.name,
save=False,
)
self.assertRaises(ParentIsGroupError, child_task.save)
def create_task(
subject,