BREAKING: Task status "Closed" renamed to Task status "Completed" and ability to close, cancel projects in bulk

This commit is contained in:
Rushabh Mehta 2019-02-19 14:38:03 +05:30
parent 2d2d176e5c
commit 02a9ec33ed
8 changed files with 1778 additions and 1692 deletions

View File

@ -29,11 +29,11 @@ def make_timesheet_for_projects(current_date ):
def close_tasks(current_date): def close_tasks(current_date):
for task in frappe.get_all("Task", ["name"], {"status": "Open", "exp_end_date": ("<", current_date)}): for task in frappe.get_all("Task", ["name"], {"status": "Open", "exp_end_date": ("<", current_date)}):
task = frappe.get_doc("Task", task.name) task = frappe.get_doc("Task", task.name)
task.status = "Closed" task.status = "Completed"
task.save() task.save()
def make_project(current_date): def make_project(current_date):
if not frappe.db.exists('Project', if not frappe.db.exists('Project',
"New Product Development " + current_date.strftime("%Y-%m-%d")): "New Product Development " + current_date.strftime("%Y-%m-%d")):
project = frappe.get_doc({ project = frappe.get_doc({
"doctype": "Project", "doctype": "Project",

View File

@ -584,4 +584,4 @@ erpnext.patches.v11_1.setup_guardian_role
execute:frappe.delete_doc('DocType', 'Notification Control') execute:frappe.delete_doc('DocType', 'Notification Control')
erpnext.patches.v11_0.remove_barcodes_field_from_copy_fields_to_variants erpnext.patches.v11_0.remove_barcodes_field_from_copy_fields_to_variants
erpnext.patches.v11_0.make_italian_localization_fields erpnext.patches.v11_0.make_italian_localization_fields
erpnext.patches.v12_0.move_item_tax_to_item_tax_template erpnext.patches.v12_0.set_task_status

View File

@ -0,0 +1,5 @@
import frappe
def execute():
# renamed default status to Completed as status "Closed" is ambiguous
frappe.db.sql('update tabTask set status = "Completed" where status = "Closed"')

View File

@ -17,6 +17,7 @@ frappe.ui.form.on("Project", {
); );
}, },
onload: function (frm) { onload: function (frm) {
var so = frappe.meta.get_docfield("Project", "sales_order"); var so = frappe.meta.get_docfield("Project", "sales_order");
so.get_route_options_for_new_doc = function (field) { so.get_route_options_for_new_doc = function (field) {
@ -76,7 +77,28 @@ frappe.ui.form.on("Project", {
frm.trigger('show_dashboard'); frm.trigger('show_dashboard');
} }
frm.events.set_buttons(frm);
}, },
set_buttons: function(frm) {
if (!frm.is_new()) {
frm.add_custom_button(__('Completed'), () => {
frm.events.set_status(frm, 'Completed');
}, __('Set Status'));
frm.add_custom_button(__('Cancelled'), () => {
frm.events.set_status(frm, 'Cancelled');
}, __('Set Status'));
}
},
set_status: function(frm, status) {
frappe.confirm(__('Set Project and all Tasks to status {0}?', [status.bold()]), () => {
frappe.xcall('erpnext.projects.doctype.project.project.set_project_status',
{project: frm.doc.name, status: status}).then((r) => { /* page will auto reload */ });
})
},
tasks_refresh: function (frm) { tasks_refresh: function (frm) {
var grid = frm.get_field('tasks').grid; var grid = frm.get_field('tasks').grid;
grid.wrapper.find('select[data-fieldname="status"]').each(function () { grid.wrapper.find('select[data-fieldname="status"]').each(function () {

View File

@ -237,12 +237,14 @@ class Project(Document):
def update_percent_complete(self): def update_percent_complete(self):
if not self.tasks: return if not self.tasks: return
total = frappe.db.sql("""select count(name) from tabTask where project=%s""", self.name)[0][0] total = frappe.db.sql("""select count(name) from tabTask where project=%s""", self.name)[0][0]
if not total and self.percent_complete: if not total and self.percent_complete:
self.percent_complete = 0 self.percent_complete = 0
if (self.percent_complete_method == "Task Completion" and total > 0) or ( if (self.percent_complete_method == "Task Completion" and total > 0) or (
not self.percent_complete_method and total > 0): not self.percent_complete_method and total > 0):
completed = frappe.db.sql("""select count(name) from tabTask where completed = frappe.db.sql("""select count(name) from tabTask where
project=%s and status in ('Closed', 'Cancelled')""", self.name)[0][0] project=%s and status in ('Cancelled', 'Completed')""", self.name)[0][0]
self.percent_complete = flt(flt(completed) / total * 100, 2) self.percent_complete = flt(flt(completed) / total * 100, 2)
if (self.percent_complete_method == "Task Progress" and total > 0): if (self.percent_complete_method == "Task Progress" and total > 0):
@ -253,15 +255,21 @@ class Project(Document):
if (self.percent_complete_method == "Task Weight" and total > 0): if (self.percent_complete_method == "Task Weight" and total > 0):
weight_sum = frappe.db.sql("""select sum(task_weight) from tabTask where weight_sum = frappe.db.sql("""select sum(task_weight) from tabTask where
project=%s""", self.name)[0][0] project=%s""", self.name)[0][0]
weighted_progress = frappe.db.sql("""select progress,task_weight from tabTask where weighted_progress = frappe.db.sql("""select progress, task_weight from tabTask where
project=%s""", self.name, as_dict=1) project=%s""", self.name, as_dict=1)
pct_complete = 0 pct_complete = 0
for row in weighted_progress: for row in weighted_progress:
pct_complete += row["progress"] * frappe.utils.safe_div(row["task_weight"], weight_sum) pct_complete += row["progress"] * frappe.utils.safe_div(row["task_weight"], weight_sum)
self.percent_complete = flt(flt(pct_complete), 2) self.percent_complete = flt(flt(pct_complete), 2)
# don't update status if it is cancelled
if self.status == 'Cancelled':
return
if self.percent_complete == 100: if self.percent_complete == 100:
self.status = "Completed" self.status = "Completed"
elif not self.status == "Cancelled":
else:
self.status = "Open" self.status = "Open"
def update_costing(self): def update_costing(self):
@ -623,3 +631,21 @@ def create_kanban_board_if_not_exists(project):
quick_kanban_board('Task', project, 'status') quick_kanban_board('Task', project, 'status')
return True return True
@frappe.whitelist()
def set_project_status(project, status):
'''
set status for project and all related tasks
'''
if not status in ('Completed', 'Cancelled'):
frappe.throw('Status must be Cancelled or Completed')
project = frappe.get_doc('Project', project)
frappe.has_permission(doc = project, throw = True)
for task in frappe.get_all('Task', dict(project = project.name)):
frappe.db.set_value('Task', task.name, 'status', status)
project.status = status
project.save()

View File

@ -1,404 +1,430 @@
{ {
"allow_copy": 0, "allow_copy": 0,
"allow_guest_to_view": 0, "allow_events_in_timeline": 0,
"allow_import": 0, "allow_guest_to_view": 0,
"allow_rename": 0, "allow_import": 0,
"beta": 0, "allow_rename": 0,
"creation": "2015-02-22 11:15:28.201059", "beta": 0,
"custom": 0, "creation": "2015-02-22 11:15:28.201059",
"docstatus": 0, "custom": 0,
"doctype": "DocType", "docstatus": 0,
"document_type": "Other", "doctype": "DocType",
"editable_grid": 1, "document_type": "Other",
"engine": "InnoDB", "editable_grid": 1,
"engine": "InnoDB",
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 3, "collapsible": 0,
"fieldname": "title", "columns": 3,
"fieldtype": "Data", "fieldname": "title",
"hidden": 0, "fieldtype": "Data",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 1, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 1,
"label": "Title", "in_standard_filter": 0,
"length": 0, "label": "Title",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 1, "report_hide": 0,
"search_index": 0, "reqd": 1,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 3, "collapsible": 0,
"default": "Open", "columns": 3,
"fieldname": "status", "default": "Open",
"fieldtype": "Select", "fieldname": "status",
"hidden": 0, "fieldtype": "Select",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 1, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 1,
"label": "Status", "in_standard_filter": 0,
"length": 0, "label": "Status",
"no_copy": 1, "length": 0,
"options": "Open\nWorking\nPending Review\nOverdue\nClosed\nCancelled", "no_copy": 1,
"permlevel": 0, "options": "Open\nWorking\nPending Review\nOverdue\nCompleted\nCancelled",
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 1, "report_hide": 0,
"search_index": 0, "reqd": 1,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"depends_on": "task_id", "columns": 0,
"fieldname": "edit_task", "depends_on": "task_id",
"fieldtype": "Button", "fieldname": "edit_task",
"hidden": 0, "fieldtype": "Button",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"label": "View Task", "in_standard_filter": 0,
"length": 0, "label": "View Task",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "edit_timesheet", "columns": 0,
"fieldtype": "Button", "fieldname": "edit_timesheet",
"hidden": 0, "fieldtype": "Button",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"label": "View Timesheet", "in_standard_filter": 0,
"length": 0, "label": "View Timesheet",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "make_timesheet", "columns": 0,
"fieldtype": "Button", "fieldname": "make_timesheet",
"hidden": 0, "fieldtype": "Button",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"label": "Make Timesheet", "in_standard_filter": 0,
"length": 0, "label": "Make Timesheet",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "column_break_6", "columns": 0,
"fieldtype": "Column Break", "fieldname": "column_break_6",
"hidden": 0, "fieldtype": "Column Break",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"length": 0, "in_standard_filter": 0,
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 2, "collapsible": 0,
"fieldname": "start_date", "columns": 2,
"fieldtype": "Date", "fieldname": "start_date",
"hidden": 0, "fieldtype": "Date",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 1, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 1,
"label": "Start Date", "in_standard_filter": 0,
"length": 0, "label": "Start Date",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 2, "collapsible": 0,
"default": "", "columns": 2,
"fieldname": "end_date", "default": "",
"fieldtype": "Date", "fieldname": "end_date",
"hidden": 0, "fieldtype": "Date",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 1, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 1,
"label": "End Date", "in_standard_filter": 0,
"length": 0, "label": "End Date",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "task_weight", "columns": 0,
"fieldtype": "Float", "fieldname": "task_weight",
"hidden": 0, "fieldtype": "Float",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 1, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 1,
"label": "Weight", "in_standard_filter": 0,
"length": 0, "label": "Weight",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 1, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 1,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "section_break_6", "columns": 0,
"fieldtype": "Section Break", "fieldname": "section_break_6",
"hidden": 0, "fieldtype": "Section Break",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"length": 0, "in_standard_filter": 0,
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "description", "columns": 0,
"fieldtype": "Text Editor", "fieldname": "description",
"hidden": 0, "fieldtype": "Text Editor",
"ignore_user_permissions": 0, "hidden": 0,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"label": "Description", "in_standard_filter": 0,
"length": 0, "label": "Description",
"no_copy": 0, "length": 0,
"permlevel": 0, "no_copy": 0,
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 0, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 0,
"reqd": 0, "report_hide": 0,
"search_index": 0, "reqd": 0,
"set_only_once": 0, "search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
}, },
{ {
"allow_bulk_edit": 0, "allow_bulk_edit": 0,
"allow_on_submit": 0, "allow_in_quick_entry": 0,
"bold": 0, "allow_on_submit": 0,
"collapsible": 0, "bold": 0,
"columns": 0, "collapsible": 0,
"fieldname": "task_id", "columns": 0,
"fieldtype": "Link", "fieldname": "task_id",
"hidden": 1, "fieldtype": "Link",
"ignore_user_permissions": 0, "hidden": 1,
"ignore_xss_filter": 0, "ignore_user_permissions": 0,
"in_filter": 0, "ignore_xss_filter": 0,
"in_global_search": 0, "in_filter": 0,
"in_list_view": 0, "in_global_search": 0,
"in_standard_filter": 0, "in_list_view": 0,
"label": "Task ID", "in_standard_filter": 0,
"length": 0, "label": "Task ID",
"no_copy": 1, "length": 0,
"options": "Task", "no_copy": 1,
"permlevel": 0, "options": "Task",
"precision": "", "permlevel": 0,
"print_hide": 0, "precision": "",
"print_hide_if_no_value": 0, "print_hide": 0,
"read_only": 0, "print_hide_if_no_value": 0,
"remember_last_selected_value": 1, "read_only": 0,
"report_hide": 0, "remember_last_selected_value": 1,
"reqd": 0, "report_hide": 0,
"search_index": 1, "reqd": 0,
"set_only_once": 0, "search_index": 1,
"set_only_once": 0,
"translatable": 0,
"unique": 0 "unique": 0
} }
], ],
"has_web_view": 0, "has_web_view": 0,
"hide_heading": 0, "hide_heading": 0,
"hide_toolbar": 0, "hide_toolbar": 0,
"idx": 0, "idx": 0,
"image_view": 0, "image_view": 0,
"in_create": 0, "in_create": 0,
"is_submittable": 0, "is_submittable": 0,
"issingle": 0, "issingle": 0,
"istable": 1, "istable": 1,
"max_attachments": 0, "max_attachments": 0,
"modified": "2018-07-05 19:34:31.204454", "modified": "2019-02-19 12:30:52.648868",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Projects", "module": "Projects",
"name": "Project Task", "name": "Project Task",
"name_case": "", "name_case": "",
"owner": "Administrator", "owner": "Administrator",
"permissions": [], "permissions": [],
"quick_entry": 0, "quick_entry": 0,
"read_only": 0, "read_only": 0,
"read_only_onload": 0, "read_only_onload": 0,
"show_name_in_global_search": 0, "show_name_in_global_search": 0,
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 0, "track_changes": 0,
"track_seen": 0 "track_seen": 0,
"track_views": 0
} }

File diff suppressed because it is too large Load Diff

View File

@ -45,9 +45,9 @@ class Task(NestedSet):
frappe.throw(_("'Actual Start Date' can not be greater than 'Actual End Date'")) frappe.throw(_("'Actual Start Date' can not be greater than 'Actual End Date'"))
def validate_status(self): def validate_status(self):
if self.status!=self.get_db_value("status") and self.status == "Closed": if self.status!=self.get_db_value("status") and self.status == "Completed":
for d in self.depends_on: for d in self.depends_on:
if frappe.db.get_value("Task", d.task, "status") != "Closed": if frappe.db.get_value("Task", d.task, "status") != "Completed":
frappe.throw(_("Cannot close task as its dependant task {0} is not closed.").format(d.task)) frappe.throw(_("Cannot close task as its dependant task {0} is not closed.").format(d.task))
from frappe.desk.form.assign_to import clear from frappe.desk.form.assign_to import clear
@ -57,6 +57,12 @@ class Task(NestedSet):
if (self.progress or 0) > 100: if (self.progress or 0) > 100:
frappe.throw(_("Progress % for a task cannot be more than 100.")) frappe.throw(_("Progress % for a task cannot be more than 100."))
if self.progress == 100:
self.status = 'Completed'
if self.status == 'Completed':
self.progress = 100
def update_depends_on(self): def update_depends_on(self):
depends_on_tasks = self.depends_on_tasks or "" depends_on_tasks = self.depends_on_tasks or ""
for d in self.depends_on: for d in self.depends_on:
@ -76,7 +82,7 @@ class Task(NestedSet):
self.populate_depends_on() self.populate_depends_on()
def unassign_todo(self): def unassign_todo(self):
if self.status == "Closed" or self.status == "Cancelled": if self.status in ("Completed", "Cancelled"):
from frappe.desk.form.assign_to import clear from frappe.desk.form.assign_to import clear
clear(self.doctype, self.name) clear(self.doctype, self.name)
@ -193,7 +199,7 @@ def set_tasks_as_overdue():
frappe.db.sql("""update tabTask set `status`='Overdue' frappe.db.sql("""update tabTask set `status`='Overdue'
where exp_end_date is not null where exp_end_date is not null
and exp_end_date < CURDATE() and exp_end_date < CURDATE()
and `status` not in ('Closed', 'Cancelled')""") and `status` not in ('Completed', 'Cancelled')""")
@frappe.whitelist() @frappe.whitelist()
def get_children(doctype, parent, task=None, project=None, is_root=False): def get_children(doctype, parent, task=None, project=None, is_root=False):