fix: change request modifications
diff --git a/erpnext/patches/v13_0/update_project_template_tasks.py b/erpnext/patches/v13_0/update_project_template_tasks.py
index 1303efd..26c4259 100644
--- a/erpnext/patches/v13_0/update_project_template_tasks.py
+++ b/erpnext/patches/v13_0/update_project_template_tasks.py
@@ -6,7 +6,13 @@
def execute():
frappe.reload_doc("projects", "doctype", "project_template")
- for template_name in frappe.db.sql(""" select name from `tabProject Template` """, as_dict=1):
+ for template_name in frappe.db.sql("""
+ select
+ name
+ from
+ `tabProject Template` """,
+ as_dict=1):
+
template = frappe.get_doc("Project Template", template_name.name)
replace_tasks = False
new_tasks = []
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 13e72fe..2cdfb7a 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -59,8 +59,8 @@
for task in template.tasks:
template_task_details = frappe.get_doc("Task", task.task)
tmp_task_details.append(template_task_details)
- project_tasks.append(self.create_task_from_template(template_task_details))
-
+ task = self.create_task_from_template(template_task_details)
+ project_tasks.append(task)
self.dependency_mapping(tmp_task_details, project_tasks)
def create_task_from_template(self, task_details):
@@ -75,36 +75,33 @@
task_weight = task_details.task_weight,
type = task_details.type,
issue = task_details.issue,
- is_group = task_details.is_group,
- start = task_details.start,
- duration = task_details.duration
+ is_group = task_details.is_group
)).insert()
def dependency_mapping(self, template_tasks, project_tasks):
- for tmp_task in template_tasks:
- prj_task = list(filter(lambda x: x.subject == tmp_task.subject, project_tasks))[0]
- prj_task = frappe.get_doc("Task", prj_task.name)
- self.check_depends_on_value(tmp_task, prj_task, project_tasks)
- self.check_for_parent_tasks(tmp_task, prj_task, project_tasks)
+ for template_task in template_tasks:
+ project_task = list(filter(lambda x: x.subject == template_task.subject, project_tasks))[0]
+ if template_task.get("depends_on") and not project_task.get("depends_on"):
+ self.check_depends_on_value(template_task, project_task, project_tasks)
+ if template_task.get("parent_task") and not project_task.get("parent_task"):
+ self.check_for_parent_tasks(template_task, project_task, project_tasks)
- def check_depends_on_value(self, tmp_task, prj_task, project_tasks):
- if tmp_task.get("depends_on") and not prj_task.get("depends_on"):
- for child_task in tmp_task.get("depends_on"):
- child_task_subject = frappe.db.get_value("Task", child_task.task, "subject")
- corresponding_prj_task = list(filter(lambda x: x.subject == child_task_subject, project_tasks))
- if len(corresponding_prj_task):
- prj_task.append("depends_on",{
- "task": corresponding_prj_task[0].name
- })
- prj_task.save()
+ def check_depends_on_value(self, template_task, project_task, project_tasks):
+ for child_task in template_task.get("depends_on"):
+ child_task_subject = frappe.db.get_value("Task", child_task.task, "subject")
+ corresponding_project_task = list(filter(lambda x: x.subject == child_task_subject, project_tasks))
+ if len(corresponding_project_task):
+ project_task.append("depends_on",{
+ "task": corresponding_project_task[0].name
+ })
+ project_task.save()
- def check_for_parent_tasks(self, tmp_task, prj_task, project_tasks):
- if tmp_task.get("parent_task") and not prj_task.get("parent_task"):
- parent_task_subject = frappe.db.get_value("Task", tmp_task.get("parent_task"), "subject")
- corresponding_prj_task = list(filter(lambda x: x.subject == parent_task_subject, project_tasks))
- if len(corresponding_prj_task):
- prj_task.parent_task = corresponding_prj_task[0].name
- prj_task.save()
+ def check_for_parent_tasks(self, template_task, project_task, project_tasks):
+ parent_task_subject = frappe.db.get_value("Task", template_task.get("parent_task"), "subject")
+ corresponding_project_task = list(filter(lambda x: x.subject == parent_task_subject, project_tasks))
+ if len(corresponding_project_task):
+ project_task.parent_task = corresponding_project_task[0].name
+ project_task.save()
def is_row_updated(self, row, existing_task_data, fields):
if self.get("__islocal") or not existing_task_data: return True
diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py
index ce56a50..1d2980c 100644
--- a/erpnext/projects/doctype/project/test_project.py
+++ b/erpnext/projects/doctype/project/test_project.py
@@ -17,78 +17,79 @@
"""
Test Action: Basic Test of a Project created from template. The template has a single task.
"""
- frappe.db.sql('delete from tabTask where project = "Test Project with Templ - no parent and dependend tasks"')
- frappe.delete_doc('Project', 'Test Project with Templ - 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.delete_doc('Project', project_name)
- task1 = task_exists("Test Temp Task with no parent and dependency")
+ task1 = task_exists("Test Template Task with No Parent and Dependency")
if not task1:
- task1 = create_task(subject="Test Temp Task with no parent and dependency", is_template=1, begin=5, duration=3)
+ task1 = create_task(subject="Test Template Task with No Parent and Dependency", is_template=1, begin=5, duration=3)
- template = make_project_template("Test Project Template - no parent and dependend tasks", [task1])
- project = get_project("Test Project with Templ - no parent and dependend tasks", template)
- tasks = frappe.get_all('Task', '*', dict(project=project.name), order_by='creation asc')
+ template = make_project_template("Test Project Template - No Parent and Dependend Tasks", [task1])
+ project = get_project(project_name, template)
+ tasks = frappe.get_all('Task', ['subject','exp_end_date','depends_on_tasks'], dict(project=project.name), order_by='creation asc')
- self.assertEqual(tasks[0].subject, 'Test Temp Task with no parent and dependency')
- self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, tasks[0]))
+ self.assertEqual(tasks[0].subject, 'Test Template Task with No Parent and Dependency')
+ self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 5, 3))
self.assertEqual(len(tasks), 1)
def test_project_template_having_parent_child_tasks(self):
+ project_name = "Test Project with Template - Tasks with Parent-Child Relation"
+ frappe.db.sql(""" delete from tabTask where project = %s """, project_name)
+ frappe.delete_doc('Project', project_name)
- frappe.db.sql('delete from tabTask where project = "Test Project with Templ - tasks with parent-child"')
- frappe.delete_doc('Project', 'Test Project with Templ - tasks with parent-child')
-
- task1 = task_exists("Test Temp Task parent")
+ task1 = task_exists("Test Template Task Parent")
if not task1:
- task1 = create_task(subject="Test Temp Task parent", is_group=1, is_template=1, begin=1, duration=1)
+ task1 = create_task(subject="Test Template Task Parent", is_group=1, is_template=1, begin=1, duration=1)
- task2 = task_exists("Test Temp Task child 1")
+ task2 = task_exists("Test Template Task Child 1")
if not task2:
- task2 = create_task(subject="Test Temp Task child 1", parent_task=task1.name, is_template=1, begin=1, duration=3)
+ task2 = create_task(subject="Test Template Task Child 1", parent_task=task1.name, is_template=1, begin=1, duration=3)
- task3 = task_exists("Test Temp Task child 2")
+ task3 = task_exists("Test Template Task Child 2")
if not task3:
- task3 = create_task(subject="Test Temp Task child 2", parent_task=task1.name, is_template=1, begin=2, duration=3)
+ task3 = create_task(subject="Test Template Task Child 2", parent_task=task1.name, is_template=1, begin=2, duration=3)
- template = make_project_template("Test Project Template - tasks with parent-child", [task1, task2, task3])
- project = get_project("Test Project with Templ - tasks with parent-child", template)
- tasks = frappe.get_all('Task', '*', dict(project=project.name), order_by='creation asc')
+ template = make_project_template("Test Project Template - Tasks with Parent-Child Relation", [task1, task2, task3])
+ project = get_project(project_name, template)
+ tasks = frappe.get_all('Task', ['subject','exp_end_date','depends_on_tasks', 'name'], dict(project=project.name), order_by='creation asc')
- self.assertEqual(tasks[0].subject, 'Test Temp Task parent')
- self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, tasks[0]))
+ self.assertEqual(tasks[0].subject, 'Test Template Task Parent')
+ self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 1, 1))
- self.assertEqual(tasks[1].subject, 'Test Temp Task child 1')
- self.assertEqual(getdate(tasks[1].exp_end_date), calculate_end_date(project, tasks[1]))
+ self.assertEqual(tasks[1].subject, 'Test Template Task Child 1')
+ self.assertEqual(getdate(tasks[1].exp_end_date), calculate_end_date(project, 1, 3))
self.assertEqual(tasks[1].parent_task, tasks[0].name)
- self.assertEqual(tasks[2].subject, 'Test Temp Task child 2')
- self.assertEqual(getdate(tasks[2].exp_end_date), calculate_end_date(project, tasks[2]))
+ self.assertEqual(tasks[2].subject, 'Test Template Task Child 2')
+ self.assertEqual(getdate(tasks[2].exp_end_date), calculate_end_date(project, 2, 3))
self.assertEqual(tasks[2].parent_task, tasks[0].name)
self.assertEqual(len(tasks), 3)
def test_project_template_having_dependent_tasks(self):
+ project_name = "Test Project with Template - Dependent Tasks"
+ frappe.db.sql(""" delete from tabTask where project = %s """, project_name)
+ frappe.delete_doc('Project', project_name)
- frappe.db.sql('delete from tabTask where project = "Test Project with Templ - dependent tasks"')
- frappe.delete_doc('Project', 'Test Project with Templ - dependent tasks')
-
- task1 = task_exists("Test Temp Task for dependency")
+ task1 = task_exists("Test Template Task for Dependency")
if not task1:
- task1 = create_task(subject="Test Temp Task for dependency", is_template=1, begin=3, duration=1)
+ task1 = create_task(subject="Test Template Task for Dependency", is_template=1, begin=3, duration=1)
- task2 = task_exists("Test Temp Task with dependency")
+ task2 = task_exists("Test Template Task with Dependency")
if not task2:
- task2 = create_task(subject="Test Temp Task with dependency", depends_on=task1.name, is_template=1, begin=2, duration=2)
+ task2 = create_task(subject="Test Template Task with Dependency", depends_on=task1.name, is_template=1, begin=2, duration=2)
- template = make_project_template("Test Project with Templ - dependent tasks", [task1, task2])
- project = get_project("Test Project with Templ - dependent tasks", template)
- tasks = frappe.get_all('Task', '*', dict(project=project.name), order_by='creation asc')
+ template = make_project_template("Test Project with Template - Dependent Tasks", [task1, task2])
+ project = get_project(project_name, template)
+ tasks = frappe.get_all('Task', ['subject','exp_end_date','depends_on_tasks', 'name'], dict(project=project.name), order_by='creation asc')
- self.assertEqual(tasks[1].subject, 'Test Temp Task with dependency')
- self.assertEqual(getdate(tasks[1].exp_end_date), calculate_end_date(project, tasks[1]))
+ self.assertEqual(tasks[1].subject, 'Test Template Task with Dependency')
+ self.assertEqual(getdate(tasks[1].exp_end_date), calculate_end_date(project, 2, 2))
self.assertTrue(tasks[1].depends_on_tasks.find(tasks[0].name) >= 0 )
- self.assertEqual(tasks[0].subject, 'Test Temp Task for dependency')
- self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, tasks[0]) )
+ self.assertEqual(tasks[0].subject, 'Test Template Task for Dependency')
+ self.assertEqual(getdate(tasks[0].exp_end_date), calculate_end_date(project, 3, 1) )
self.assertEqual(len(tasks), 2)
@@ -129,5 +130,5 @@
return False
return frappe.get_doc("Task", result[0].name)
-def calculate_end_date(project, task):
- return getdate(add_days(project.expected_start_date, task.start + task.duration))
\ No newline at end of file
+def calculate_end_date(project, start, duration):
+ return getdate(add_days(project.expected_start_date, start + duration))
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project_template/project_template.py b/erpnext/projects/doctype/project_template/project_template.py
index 1beebf7..aace402 100644
--- a/erpnext/projects/doctype/project_template/project_template.py
+++ b/erpnext/projects/doctype/project_template/project_template.py
@@ -6,6 +6,7 @@
import frappe
from frappe.model.document import Document
from frappe import _
+from frappe.utils import get_link_to_form
class ProjectTemplate(Document):
@@ -18,8 +19,8 @@
if task_details.depends_on:
for dependency_task in task_details.depends_on:
if not self.check_dependent_task_presence(dependency_task.task):
- task_details_format = """<a href="#Form/Task/{0}">{0}</a>""".format(task_details.name)
- dependency_task_format = """<a href="#Form/Task/{0}">{0}</a>""".format(dependency_task.task)
+ task_details_format = get_link_to_form("Task",task_details.name)
+ dependency_task_format = get_link_to_form("Task", dependency_task.task)
frappe.throw(_("Task {0} depends on Task {1}. Please add Task {1} to the Tasks list.").format(frappe.bold(task_details_format), frappe.bold(dependency_task_format)))
def check_dependent_task_presence(self, task):
diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json
index a9e3d9b..bb55256 100644
--- a/erpnext/projects/doctype/task/task.json
+++ b/erpnext/projects/doctype/task/task.json
@@ -371,11 +371,13 @@
"label": "Is Template"
},
{
+ "depends_on": "is_template",
"fieldname": "start",
"fieldtype": "Int",
"label": "Begin On (Days)"
},
{
+ "depends_on": "is_template",
"fieldname": "duration",
"fieldtype": "Int",
"label": "Duration (Days)"
@@ -386,7 +388,7 @@
"is_tree": 1,
"links": [],
"max_attachments": 5,
- "modified": "2020-12-07 13:26:53.614689",
+ "modified": "2020-12-21 11:59:24.196834",
"modified_by": "Administrator",
"module": "Projects",
"name": "Task",
diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py
index aded78b..25714f8 100644
--- a/erpnext/projects/doctype/task/test_task.py
+++ b/erpnext/projects/doctype/task/test_task.py
@@ -104,7 +104,7 @@
task.subject = subject
task.exp_start_date = start or nowdate()
task.exp_end_date = end or nowdate()
- task.project = project or "_Test Project"
+ task.project = project or None if is_template else "_Test Project"
task.is_template = is_template
task.start = begin
task.duration = duration