[tests] [projects] merged tasks and projects and added quick edit of tasks from projects

This commit is contained in:
Rushabh Mehta
2015-02-22 22:32:39 +05:30
parent 65a2759432
commit d54031f3b5
45 changed files with 291 additions and 277 deletions

View File

@@ -1,6 +1,15 @@
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
frappe.ui.form.on("Project Task", "edit_task", function(frm, doctype, name) {
var doc = frappe.get_doc(doctype, name);
if(doc.task_id) {
frappe.set_route("Form", "Task", doc.task_id);
} else {
msgprint(__("Save the document first."));
}
})
// show tasks
cur_frm.cscript.refresh = function(doc) {
if(!doc.__islocal) {

View File

@@ -21,7 +21,7 @@
"permlevel": 0
},
{
"description": "Project will get saved and will be searchable with project name given",
"description": "",
"fieldname": "project_name",
"fieldtype": "Data",
"label": "Project Name",
@@ -119,27 +119,24 @@
{
"fieldname": "sb_milestones",
"fieldtype": "Section Break",
"label": "Milestones",
"label": "Tasks",
"oldfieldtype": "Section Break",
"options": "icon-flag",
"permlevel": 0
},
{
"description": "Milestones will be added as Events in the Calendar",
"fieldname": "milestones",
"fieldname": "tasks",
"fieldtype": "Table",
"label": "Milestones",
"no_copy": 0,
"oldfieldname": "project_milestones",
"oldfieldtype": "Table",
"options": "Project Milestone",
"label": "Tasks",
"options": "Project Task",
"permlevel": 0,
"search_index": 0
"precision": ""
},
{
"fieldname": "percent_milestones_completed",
"fieldname": "percent_complete",
"fieldtype": "Percent",
"label": "% Milestones Completed",
"in_list_view": 0,
"label": "% Tasks Completed",
"permlevel": 0,
"read_only": 1
},
@@ -161,14 +158,6 @@
"permlevel": 0,
"search_index": 0
},
{
"fieldname": "percent_complete",
"fieldtype": "Percent",
"in_list_view": 0,
"label": "% Tasks Completed",
"permlevel": 0,
"read_only": 1
},
{
"fieldname": "company",
"fieldtype": "Link",
@@ -273,7 +262,7 @@
"icon": "icon-puzzle-piece",
"idx": 1,
"max_attachments": 4,
"modified": "2015-02-20 05:08:08.569007",
"modified": "2015-02-22 11:17:49.051755",
"modified_by": "Administrator",
"module": "Projects",
"name": "Project",

View File

@@ -6,7 +6,6 @@ import frappe
from frappe.utils import flt, getdate
from frappe import _
from erpnext.utilities.transaction_base import delete_events
from frappe.model.document import Document
@@ -14,6 +13,18 @@ class Project(Document):
def get_feed(self):
return '{0}: {1}'.format(_(self.status), self.project_name)
def onload(self):
"""Load project tasks for quick view"""
for task in frappe.get_all("Task", "*", {"project": self.name}, order_by="exp_start_date asc"):
self.append("tasks", {
"title": task.subject,
"status": task.status,
"start_date": task.exp_start_date,
"end_date": task.exp_end_date,
"desciption": task.description,
"task_id": task.name
})
def get_gross_profit(self):
pft, per_pft =0, 0
pft = flt(self.project_value) - flt(self.est_material_cost)
@@ -23,20 +34,40 @@ class Project(Document):
return ret
def validate(self):
"""validate start date before end date"""
if self.project_start_date and self.completion_date:
if getdate(self.completion_date) < getdate(self.project_start_date):
frappe.throw(_("Expected Completion Date can not be less than Project Start Date"))
self.update_milestones_completed()
self.sync_tasks()
def update_milestones_completed(self):
if self.milestones:
completed = filter(lambda x: x.status=="Completed", self.milestones)
self.percent_milestones_completed = len(completed) * 100 / len(self.milestones)
def sync_tasks(self):
"""sync tasks and remove table"""
task_names = []
for t in self.tasks:
if t.task_id:
task = frappe.get_doc("Task", t.task_id)
else:
task = frappe.new_doc("Task")
task.project = self.name
def on_update(self):
self.add_calendar_event()
task.update({
"subject": t.title,
"status": t.status,
"exp_start_date": t.start_date,
"exp_end_date": t.end_date,
"desciption": t.description,
})
task.flags.ignore_links = True
task.flags.from_project = True
task.save(ignore_permissions = True)
task_names.append(task.name)
# delete
for t in frappe.get_all("Task", ["name"], {"project": self.name, "name": ("not in", task_names)}):
frappe.delete_doc("Task", t.name)
self.tasks = []
def update_percent_complete(self):
total = frappe.db.sql("""select count(*) from tabTask where project=%s""",
@@ -48,28 +79,6 @@ class Project(Document):
int(float(completed) / total * 100))
def add_calendar_event(self):
# delete any earlier event for this project
delete_events(self.doctype, self.name)
# add events
for milestone in self.get("milestones"):
if milestone.milestone_date:
description = (milestone.milestone or "Milestone") + " for " + self.name
frappe.get_doc({
"doctype": "Event",
"owner": self.owner,
"subject": description,
"description": description,
"starts_on": milestone.milestone_date + " 10:00:00",
"event_type": "Private",
"ref_type": self.doctype,
"ref_name": self.name
}).insert(ignore_permissions=True)
def on_trash(self):
delete_events(self.doctype, self.name)
@frappe.whitelist()
def get_cost_center_name(project_name):
return frappe.db.get_value("Project", project_name, "cost_center")

View File

@@ -1 +0,0 @@
Important date in the project lifecycle.

View File

@@ -1 +0,0 @@
from __future__ import unicode_literals

View File

@@ -1,45 +0,0 @@
{
"creation": "2013-02-22 01:27:50.000000",
"docstatus": 0,
"doctype": "DocType",
"fields": [
{
"fieldname": "milestone_date",
"fieldtype": "Date",
"in_list_view": 1,
"label": "Milestone Date",
"oldfieldname": "milestone_date",
"oldfieldtype": "Date",
"permlevel": 0
},
{
"fieldname": "milestone",
"fieldtype": "Text",
"in_list_view": 1,
"label": "Milestone",
"oldfieldname": "milestone",
"oldfieldtype": "Text",
"permlevel": 0,
"print_width": "300px",
"width": "300px"
},
{
"fieldname": "status",
"fieldtype": "Select",
"in_list_view": 1,
"label": "Status",
"no_copy": 1,
"oldfieldname": "status",
"oldfieldtype": "Select",
"options": "Pending\nCompleted",
"permlevel": 0
}
],
"idx": 1,
"istable": 1,
"modified": "2013-12-20 19:23:27.000000",
"modified_by": "Administrator",
"module": "Projects",
"name": "Project Milestone",
"owner": "Administrator"
}

View File

@@ -0,0 +1,157 @@
{
"allow_copy": 0,
"allow_import": 0,
"allow_rename": 0,
"creation": "2015-02-22 11:15:28.201059",
"custom": 0,
"docstatus": 0,
"doctype": "DocType",
"document_type": "Other",
"fields": [
{
"allow_on_submit": 0,
"fieldname": "title",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Title",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0
},
{
"allow_on_submit": 0,
"default": "Open",
"fieldname": "status",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Status",
"no_copy": 0,
"options": "Open\nClosed",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0
},
{
"fieldname": "edit_task",
"fieldtype": "Button",
"label": "Edit Task",
"permlevel": 0,
"precision": ""
},
{
"fieldname": "column_break_3",
"fieldtype": "Column Break",
"permlevel": 0,
"precision": ""
},
{
"allow_on_submit": 0,
"fieldname": "start_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 1,
"label": "Start Date",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0
},
{
"allow_on_submit": 0,
"default": "",
"fieldname": "end_date",
"fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "End Date",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0
},
{
"fieldname": "section_break_6",
"fieldtype": "Section Break",
"permlevel": 0,
"precision": ""
},
{
"allow_on_submit": 0,
"fieldname": "description",
"fieldtype": "Text",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Description",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0
},
{
"fieldname": "task_id",
"fieldtype": "Link",
"hidden": 1,
"label": "Task ID",
"no_copy": 1,
"options": "Task",
"permlevel": 0,
"precision": ""
}
],
"hide_heading": 0,
"hide_toolbar": 0,
"in_create": 0,
"in_dialog": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 1,
"modified": "2015-02-22 11:53:23.317993",
"modified_by": "Administrator",
"module": "Projects",
"name": "Project Task",
"name_case": "",
"owner": "Administrator",
"permissions": [],
"read_only": 0,
"read_only_onload": 0,
"sort_field": "modified",
"sort_order": "DESC"
}

View File

@@ -1,10 +1,9 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and contributors
# For license information, please see license.txt
from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
class ProjectMilestone(Document):
pass
class ProjectTask(Document):
pass

View File

@@ -44,7 +44,7 @@ class Task(Document):
def on_update(self):
"""update percent complete in project"""
if self.project:
if self.project and not self.flags.from_project:
project = frappe.get_doc("Project", self.project)
project.run_method("update_percent_complete")

View File

@@ -1,6 +0,0 @@
[
{
"doctype": "Time Log Batch",
"name": "_Test Time Log Batch 1"
}
]