mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-02 11:49:10 +00:00
feat(issue): Create tasks from issues
This commit is contained in:
9
erpnext/support/doctype/issue/issue.js
Normal file → Executable file
9
erpnext/support/doctype/issue/issue.js
Normal file → Executable file
@@ -9,6 +9,13 @@ frappe.ui.form.on("Issue", {
|
|||||||
frm.set_value("status", "Closed");
|
frm.set_value("status", "Closed");
|
||||||
frm.save();
|
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 {
|
} else {
|
||||||
frm.add_custom_button(__("Reopen"), function() {
|
frm.add_custom_button(__("Reopen"), function() {
|
||||||
frm.set_value("status", "Open");
|
frm.set_value("status", "Open");
|
||||||
@@ -37,7 +44,7 @@ frappe.ui.form.on("Issue", {
|
|||||||
if (!frm.timeline.wrapper.find('.btn-split-issue').length) {
|
if (!frm.timeline.wrapper.find('.btn-split-issue').length) {
|
||||||
let split_issue = __("Split Issue")
|
let split_issue = __("Split Issue")
|
||||||
$(`<button class="btn btn-xs btn-link btn-add-to-kb text-muted hidden-xs btn-split-issue pull-right" style="display:inline-block; margin-right: 15px">
|
$(`<button class="btn btn-xs btn-link btn-add-to-kb text-muted hidden-xs btn-split-issue pull-right" style="display:inline-block; margin-right: 15px">
|
||||||
${split_issue}
|
${split_issue}
|
||||||
</button>`)
|
</button>`)
|
||||||
.appendTo(frm.timeline.wrapper.find('.comment-header .asset-details:not([data-communication-type="Comment"])'))
|
.appendTo(frm.timeline.wrapper.find('.comment-header .asset-details:not([data-communication-type="Comment"])'))
|
||||||
if (!frm.timeline.wrapper.data("split-issue-event-attached")){
|
if (!frm.timeline.wrapper.data("split-issue-event-attached")){
|
||||||
|
|||||||
22
erpnext/support/doctype/issue/issue.py
Normal file → Executable file
22
erpnext/support/doctype/issue/issue.py
Normal file → Executable file
@@ -7,11 +7,13 @@ import json
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
|
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from frappe.model.mapper import get_mapped_doc
|
||||||
from frappe.utils import now
|
from frappe.utils import now
|
||||||
from frappe.utils.user import is_website_user
|
from frappe.utils.user import is_website_user
|
||||||
|
|
||||||
sender_field = "raised_by"
|
sender_field = "raised_by"
|
||||||
|
|
||||||
|
|
||||||
class Issue(Document):
|
class Issue(Document):
|
||||||
def get_feed(self):
|
def get_feed(self):
|
||||||
return "{0}: {1}".format(_(self.status), self.subject)
|
return "{0}: {1}".format(_(self.status), self.subject)
|
||||||
@@ -97,6 +99,7 @@ class Issue(Document):
|
|||||||
doc.save(ignore_permissions=True)
|
doc.save(ignore_permissions=True)
|
||||||
return replicated_issue.name
|
return replicated_issue.name
|
||||||
|
|
||||||
|
|
||||||
def get_list_context(context=None):
|
def get_list_context(context=None):
|
||||||
return {
|
return {
|
||||||
"title": _("Issues"),
|
"title": _("Issues"),
|
||||||
@@ -107,6 +110,7 @@ def get_list_context(context=None):
|
|||||||
'no_breadcrumbs': True
|
'no_breadcrumbs': True
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_issue_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by=None):
|
def get_issue_list(doctype, txt, filters, limit_start, limit_page_length=20, order_by=None):
|
||||||
from frappe.www.list import get_list
|
from frappe.www.list import get_list
|
||||||
user = frappe.session.user
|
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)
|
return get_list(doctype, txt, filters, limit_start, limit_page_length, ignore_permissions=ignore_permissions)
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def set_status(name, status):
|
def set_status(name, status):
|
||||||
st = frappe.get_doc("Issue", name)
|
st = frappe.get_doc("Issue", name)
|
||||||
st.status = status
|
st.status = status
|
||||||
st.save()
|
st.save()
|
||||||
|
|
||||||
|
|
||||||
def auto_close_tickets():
|
def auto_close_tickets():
|
||||||
""" auto close the replied support tickets after 7 days """
|
""" 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
|
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:
|
for name in names:
|
||||||
set_status(name, status)
|
set_status(name, status)
|
||||||
|
|
||||||
|
|
||||||
def has_website_permission(doc, ptype, user, verbose=False):
|
def has_website_permission(doc, ptype, user, verbose=False):
|
||||||
from erpnext.controllers.website_list_for_contact import has_website_permission
|
from erpnext.controllers.website_list_for_contact import has_website_permission
|
||||||
permission_based_on_customer = has_website_permission(doc, ptype, user, verbose)
|
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):
|
def update_issue(contact, method):
|
||||||
"""Called when Contact is deleted"""
|
"""Called when Contact is deleted"""
|
||||||
frappe.db.sql("""UPDATE `tabIssue` set contact='' where contact=%s""", contact.name)
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user