From 5327d0253d7904419b8c21ec573c8c3875d3fb79 Mon Sep 17 00:00:00 2001 From: Rohan Bansal Date: Thu, 14 Feb 2019 13:20:50 +0530 Subject: [PATCH] feat(issue): Create tasks from issues --- erpnext/support/doctype/issue/issue.js | 9 ++++++++- erpnext/support/doctype/issue/issue.py | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) mode change 100644 => 100755 erpnext/support/doctype/issue/issue.js mode change 100644 => 100755 erpnext/support/doctype/issue/issue.py diff --git a/erpnext/support/doctype/issue/issue.js b/erpnext/support/doctype/issue/issue.js old mode 100644 new mode 100755 index d0a9bf3808..05c9130378 --- a/erpnext/support/doctype/issue/issue.js +++ b/erpnext/support/doctype/issue/issue.js @@ -9,6 +9,13 @@ frappe.ui.form.on("Issue", { frm.set_value("status", "Closed"); frm.save(); }); + + frm.add_custom_button(__("Task"), function () { + frappe.model.open_mapped_doc({ + method: "erpnext.support.doctype.issue.issue.make_task", + frm: frm + }); + }, __("Make")); } else { frm.add_custom_button(__("Reopen"), function() { frm.set_value("status", "Open"); @@ -37,7 +44,7 @@ frappe.ui.form.on("Issue", { if (!frm.timeline.wrapper.find('.btn-split-issue').length) { let split_issue = __("Split Issue") $(``) .appendTo(frm.timeline.wrapper.find('.comment-header .asset-details:not([data-communication-type="Comment"])')) if (!frm.timeline.wrapper.data("split-issue-event-attached")){ diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py old mode 100644 new mode 100755 index 0b5eb539c8..3e498c8269 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -7,11 +7,13 @@ import json from frappe import _ from frappe.model.document import Document +from frappe.model.mapper import get_mapped_doc from frappe.utils import now from frappe.utils.user import is_website_user sender_field = "raised_by" + class Issue(Document): def get_feed(self): return "{0}: {1}".format(_(self.status), self.subject) @@ -97,6 +99,7 @@ class Issue(Document): doc.save(ignore_permissions=True) return replicated_issue.name + def get_list_context(context=None): return { "title": _("Issues"), @@ -107,6 +110,7 @@ def get_list_context(context=None): 'no_breadcrumbs': True } + def get_issue_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by=None): from frappe.www.list import get_list user = frappe.session.user @@ -124,12 +128,14 @@ def get_issue_list(doctype, txt, filters, limit_start, limit_page_length=20, ord return get_list(doctype, txt, filters, limit_start, limit_page_length, ignore_permissions=ignore_permissions) + @frappe.whitelist() def set_status(name, status): st = frappe.get_doc("Issue", name) st.status = status st.save() + def auto_close_tickets(): """ auto close the replied support tickets after 7 days """ auto_close_after_days = frappe.db.get_value("Support Settings", "Support Settings", "close_issue_after_days") or 7 @@ -150,6 +156,7 @@ def set_multiple_status(names, status): for name in names: set_status(name, status) + def has_website_permission(doc, ptype, user, verbose=False): from erpnext.controllers.website_list_for_contact import has_website_permission permission_based_on_customer = has_website_permission(doc, ptype, user, verbose) @@ -160,3 +167,18 @@ def has_website_permission(doc, ptype, user, verbose=False): def update_issue(contact, method): """Called when Contact is deleted""" frappe.db.sql("""UPDATE `tabIssue` set contact='' where contact=%s""", contact.name) + + +@frappe.whitelist() +def make_task(source_name, target_doc=None): + def set_missing_values(source, target): + if not target.project: + target.project = frappe.db.get_value("Project", {"customer": source.customer}) + + doclist = get_mapped_doc("Issue", source_name, { + "Issue": { + "doctype": "Task" + } + }, target_doc, set_missing_values) + + return doclist