Merge pull request #37025 from s-aga-r/FIX-883
fix: `Parent Task` link with `Project Task`
This commit is contained in:
commit
3c6e527dd1
@ -87,6 +87,7 @@ class Project(Document):
|
|||||||
issue=task_details.issue,
|
issue=task_details.issue,
|
||||||
is_group=task_details.is_group,
|
is_group=task_details.is_group,
|
||||||
color=task_details.color,
|
color=task_details.color,
|
||||||
|
template_task=task_details.name,
|
||||||
)
|
)
|
||||||
).insert()
|
).insert()
|
||||||
|
|
||||||
@ -106,9 +107,13 @@ class Project(Document):
|
|||||||
return date
|
return date
|
||||||
|
|
||||||
def dependency_mapping(self, template_tasks, project_tasks):
|
def dependency_mapping(self, template_tasks, project_tasks):
|
||||||
for template_task in template_tasks:
|
for project_task in project_tasks:
|
||||||
project_task = list(filter(lambda x: x.subject == template_task.subject, project_tasks))[0]
|
if project_task.get("template_task"):
|
||||||
project_task = frappe.get_doc("Task", project_task.name)
|
template_task = frappe.get_doc("Task", project_task.template_task)
|
||||||
|
else:
|
||||||
|
template_task = list(filter(lambda x: x.subject == project_task.subject, template_tasks))[0]
|
||||||
|
template_task = frappe.get_doc("Task", template_task.name)
|
||||||
|
|
||||||
self.check_depends_on_value(template_task, project_task, project_tasks)
|
self.check_depends_on_value(template_task, project_task, project_tasks)
|
||||||
self.check_for_parent_tasks(template_task, project_task, project_tasks)
|
self.check_for_parent_tasks(template_task, project_task, project_tasks)
|
||||||
|
|
||||||
@ -120,6 +125,7 @@ class Project(Document):
|
|||||||
filter(lambda x: x.subject == child_task_subject, project_tasks)
|
filter(lambda x: x.subject == child_task_subject, project_tasks)
|
||||||
)
|
)
|
||||||
if len(corresponding_project_task):
|
if len(corresponding_project_task):
|
||||||
|
project_task.reload() # reload, as it might have been updated in the previous iteration
|
||||||
project_task.append("depends_on", {"task": corresponding_project_task[0].name})
|
project_task.append("depends_on", {"task": corresponding_project_task[0].name})
|
||||||
project_task.save()
|
project_task.save()
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
# License: GNU General Public License v3. See license.txt
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
|
from frappe.tests.utils import FrappeTestCase
|
||||||
from frappe.utils import add_days, getdate, nowdate
|
from frappe.utils import add_days, getdate, nowdate
|
||||||
|
|
||||||
from erpnext.projects.doctype.project_template.test_project_template import make_project_template
|
from erpnext.projects.doctype.project_template.test_project_template import make_project_template
|
||||||
@ -15,7 +14,7 @@ test_records = frappe.get_test_records("Project")
|
|||||||
test_ignore = ["Sales Order"]
|
test_ignore = ["Sales Order"]
|
||||||
|
|
||||||
|
|
||||||
class TestProject(unittest.TestCase):
|
class TestProject(FrappeTestCase):
|
||||||
def test_project_with_template_having_no_parent_and_depend_tasks(self):
|
def test_project_with_template_having_no_parent_and_depend_tasks(self):
|
||||||
project_name = "Test Project with Template - No Parent and Dependend Tasks"
|
project_name = "Test Project with Template - No Parent and Dependend Tasks"
|
||||||
frappe.db.sql(""" delete from tabTask where project = %s """, project_name)
|
frappe.db.sql(""" delete from tabTask where project = %s """, project_name)
|
||||||
@ -155,6 +154,50 @@ class TestProject(unittest.TestCase):
|
|||||||
so.reload()
|
so.reload()
|
||||||
self.assertFalse(so.project)
|
self.assertFalse(so.project)
|
||||||
|
|
||||||
|
def test_project_with_template_tasks_having_common_name(self):
|
||||||
|
# Step - 1: Create Template Parent Tasks
|
||||||
|
template_parent_task1 = create_task(subject="Parent Task - 1", is_template=1, is_group=1)
|
||||||
|
template_parent_task2 = create_task(subject="Parent Task - 2", is_template=1, is_group=1)
|
||||||
|
template_parent_task3 = create_task(subject="Parent Task - 1", is_template=1, is_group=1)
|
||||||
|
|
||||||
|
# Step - 2: Create Template Child Tasks
|
||||||
|
template_task1 = create_task(
|
||||||
|
subject="Task - 1", is_template=1, parent_task=template_parent_task1.name
|
||||||
|
)
|
||||||
|
template_task2 = create_task(
|
||||||
|
subject="Task - 2", is_template=1, parent_task=template_parent_task2.name
|
||||||
|
)
|
||||||
|
template_task3 = create_task(
|
||||||
|
subject="Task - 1", is_template=1, parent_task=template_parent_task3.name
|
||||||
|
)
|
||||||
|
|
||||||
|
# Step - 3: Create Project Template
|
||||||
|
template_tasks = [
|
||||||
|
template_parent_task1,
|
||||||
|
template_task1,
|
||||||
|
template_parent_task2,
|
||||||
|
template_task2,
|
||||||
|
template_parent_task3,
|
||||||
|
template_task3,
|
||||||
|
]
|
||||||
|
project_template = make_project_template(
|
||||||
|
"Project template with common Task Subject", template_tasks
|
||||||
|
)
|
||||||
|
|
||||||
|
# Step - 4: Create Project against the Project Template
|
||||||
|
project = get_project("Project with common Task Subject", project_template)
|
||||||
|
project_tasks = frappe.get_all(
|
||||||
|
"Task", {"project": project.name}, ["subject", "parent_task", "is_group"]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test - 1: No. of Project Tasks should be equal to No. of Template Tasks
|
||||||
|
self.assertEquals(len(project_tasks), len(template_tasks))
|
||||||
|
|
||||||
|
# Test - 2: All child Project Tasks should have Parent Task linked
|
||||||
|
for pt in project_tasks:
|
||||||
|
if not pt.is_group:
|
||||||
|
self.assertIsNotNone(pt.parent_task)
|
||||||
|
|
||||||
|
|
||||||
def get_project(name, template):
|
def get_project(name, template):
|
||||||
|
|
||||||
|
|||||||
@ -52,13 +52,15 @@
|
|||||||
"company",
|
"company",
|
||||||
"lft",
|
"lft",
|
||||||
"rgt",
|
"rgt",
|
||||||
"old_parent"
|
"old_parent",
|
||||||
|
"template_task"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"fieldname": "subject",
|
"fieldname": "subject",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"in_global_search": 1,
|
"in_global_search": 1,
|
||||||
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 1,
|
"in_standard_filter": 1,
|
||||||
"label": "Subject",
|
"label": "Subject",
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
@ -138,6 +140,7 @@
|
|||||||
"fieldname": "parent_task",
|
"fieldname": "parent_task",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"ignore_user_permissions": 1,
|
"ignore_user_permissions": 1,
|
||||||
|
"in_list_view": 1,
|
||||||
"label": "Parent Task",
|
"label": "Parent Task",
|
||||||
"options": "Task",
|
"options": "Task",
|
||||||
"search_index": 1
|
"search_index": 1
|
||||||
@ -382,6 +385,12 @@
|
|||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"label": "Completed On",
|
"label": "Completed On",
|
||||||
"mandatory_depends_on": "eval: doc.status == \"Completed\""
|
"mandatory_depends_on": "eval: doc.status == \"Completed\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "template_task",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Template Task"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-check",
|
"icon": "fa fa-check",
|
||||||
@ -389,7 +398,7 @@
|
|||||||
"is_tree": 1,
|
"is_tree": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"max_attachments": 5,
|
"max_attachments": 5,
|
||||||
"modified": "2023-04-17 21:06:50.174418",
|
"modified": "2023-09-06 13:52:05.861175",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Projects",
|
"module": "Projects",
|
||||||
"name": "Task",
|
"name": "Task",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user