Merge pull request #11398 from deepeshgarg007/notification_enhance
feat: Enhancement in notifications
This commit is contained in:
commit
1ce1019466
5 changed files with 147 additions and 15 deletions
|
|
@ -19,9 +19,12 @@ frappe.notification = {
|
|||
}
|
||||
|
||||
frappe.model.with_doctype(frm.doc.document_type, function() {
|
||||
let get_select_options = function(df) {
|
||||
let get_select_options = function(df, parent_field) {
|
||||
// Append parent_field name along with fieldname for child table fields
|
||||
let select_value = parent_field ? df.fieldname + ',' + parent_field : df.fieldname;
|
||||
|
||||
return {
|
||||
value: df.fieldname,
|
||||
value: select_value,
|
||||
label: df.fieldname + ' (' + __(df.label) + ')'
|
||||
};
|
||||
};
|
||||
|
|
@ -59,9 +62,21 @@ frappe.notification = {
|
|||
let receiver_fields = [];
|
||||
if (frm.doc.channel === 'Email') {
|
||||
receiver_fields = $.map(fields, function(d) {
|
||||
return d.options == 'Email' ||
|
||||
(d.options == 'User' && d.fieldtype == 'Link')
|
||||
? get_select_options(d) : null;
|
||||
|
||||
// Add User and Email fields from child into select dropdown
|
||||
if (d.fieldtype == 'Table') {
|
||||
let child_fields = frappe.get_doc('DocType', d.options).fields;
|
||||
return $.map(child_fields, function(df) {
|
||||
return df.options == 'Email' ||
|
||||
(df.options == 'User' && df.fieldtype == 'Link')
|
||||
? get_select_options(df, d.fieldname) : null;
|
||||
});
|
||||
// Add User and Email fields from parent into select dropdown
|
||||
} else {
|
||||
return d.options == 'Email' ||
|
||||
(d.options == 'User' && d.fieldtype == 'Link')
|
||||
? get_select_options(d) : null;
|
||||
}
|
||||
});
|
||||
} else if (in_list(['WhatsApp', 'SMS'], frm.doc.channel)) {
|
||||
receiver_fields = $.map(fields, function(d) {
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
"set_property_after_alert",
|
||||
"property_value",
|
||||
"column_break_5",
|
||||
"send_to_all_assignees",
|
||||
"recipients",
|
||||
"message_sb",
|
||||
"message",
|
||||
|
|
@ -216,7 +217,7 @@
|
|||
"fieldname": "recipients",
|
||||
"fieldtype": "Table",
|
||||
"label": "Recipients",
|
||||
"mandatory_depends_on": "eval:doc.channel!=='Slack'",
|
||||
"mandatory_depends_on": "eval:doc.channel!=='Slack' && !doc.send_to_all_assignees",
|
||||
"options": "Notification Recipient"
|
||||
},
|
||||
{
|
||||
|
|
@ -277,11 +278,19 @@
|
|||
"fieldname": "send_system_notification",
|
||||
"fieldtype": "Check",
|
||||
"label": "Send System Notification"
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"depends_on": "eval:doc.channel == 'Email'",
|
||||
"fieldname": "send_to_all_assignees",
|
||||
"fieldtype": "Check",
|
||||
"label": "Send To All Assignees"
|
||||
}
|
||||
],
|
||||
"icon": "fa fa-envelope",
|
||||
"index_web_pages_for_search": 1,
|
||||
"links": [],
|
||||
"modified": "2020-08-11 19:24:35.479373",
|
||||
"modified": "2020-09-01 18:36:22.550891",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Email",
|
||||
"name": "Notification",
|
||||
|
|
|
|||
|
|
@ -189,6 +189,7 @@ def get_context(context):
|
|||
recipients, cc, bcc = self.get_list_of_recipients(doc, context)
|
||||
if not (recipients or cc or bcc):
|
||||
return
|
||||
|
||||
sender = None
|
||||
if self.sender and self.sender_email:
|
||||
sender = formataddr((self.sender, self.sender_email))
|
||||
|
|
@ -234,13 +235,20 @@ def get_context(context):
|
|||
if not frappe.safe_eval(recipient.condition, None, context):
|
||||
continue
|
||||
if recipient.receiver_by_document_field:
|
||||
email_ids_value = doc.get(recipient.receiver_by_document_field)
|
||||
if validate_email_address(email_ids_value):
|
||||
email_ids = email_ids_value.replace(",", "\n")
|
||||
recipients = recipients + email_ids.split("\n")
|
||||
fields = recipient.receiver_by_document_field.split(',')
|
||||
# fields from child table
|
||||
if len(fields) > 1:
|
||||
for d in doc.get(fields[1]):
|
||||
email_id = d.get(fields[0])
|
||||
if validate_email_address(email_id):
|
||||
recipients.append(email_id)
|
||||
# field from parent doc
|
||||
else:
|
||||
email_ids_value = doc.get(fields[0])
|
||||
if validate_email_address(email_ids_value):
|
||||
email_ids = email_ids_value.replace(",", "\n")
|
||||
recipients = recipients + email_ids.split("\n")
|
||||
|
||||
# else:
|
||||
# print "invalid email"
|
||||
if recipient.cc and "{" in recipient.cc:
|
||||
recipient.cc = frappe.render_template(recipient.cc, context)
|
||||
|
||||
|
|
@ -262,6 +270,9 @@ def get_context(context):
|
|||
for email in emails:
|
||||
recipients = recipients + email.split("\n")
|
||||
|
||||
if self.send_to_all_assignees:
|
||||
recipients = recipients + get_assignees(doc)
|
||||
|
||||
if not recipients and not cc and not bcc:
|
||||
return None, None, None
|
||||
return list(set(recipients)), list(set(cc)), list(set(bcc))
|
||||
|
|
@ -405,3 +416,12 @@ def evaluate_alert(doc, alert, event):
|
|||
|
||||
def get_context(doc):
|
||||
return {"doc": doc, "nowdate": nowdate, "frappe": frappe._dict(utils=frappe.utils)}
|
||||
|
||||
def get_assignees(doc):
|
||||
assignees = []
|
||||
assignees = frappe.get_all('ToDo', filters={'status': 'Open', 'reference_name': doc.name,
|
||||
'reference_type': doc.doctype}, fields=['owner'])
|
||||
|
||||
recipients = [d.owner for d in assignees]
|
||||
|
||||
return recipients
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import frappe, frappe.utils, frappe.utils.scheduler
|
||||
from frappe.desk.form import assign_to
|
||||
import unittest
|
||||
|
||||
test_records = frappe.get_test_records('Notification')
|
||||
|
|
@ -13,7 +14,31 @@ test_dependencies = ["User"]
|
|||
class TestNotification(unittest.TestCase):
|
||||
def setUp(self):
|
||||
frappe.db.sql("""delete from `tabEmail Queue`""")
|
||||
frappe.set_user("test1@example.com")
|
||||
frappe.set_user("test@example.com")
|
||||
|
||||
if not frappe.db.exists('Notification', {'name': 'ToDo Status Update'}, 'name'):
|
||||
notification = frappe.new_doc('Notification')
|
||||
notification.name = 'ToDo Status Update'
|
||||
notification.subject = 'ToDo Status Update'
|
||||
notification.document_type = 'ToDo'
|
||||
notification.event = 'Value Change'
|
||||
notification.value_changed = 'status'
|
||||
notification.send_to_all_assignees = 1
|
||||
notification.save()
|
||||
|
||||
if not frappe.db.exists('Notification', {'name': 'Contact Status Update'}, 'name'):
|
||||
notification = frappe.new_doc('Notification')
|
||||
notification.name = 'Contact Status Update'
|
||||
notification.subject = 'Contact Status Update'
|
||||
notification.document_type = 'Contact'
|
||||
notification.event = 'Value Change'
|
||||
notification.value_changed = 'status'
|
||||
notification.message = 'Test Contact Update'
|
||||
notification.append('recipients', {
|
||||
'receiver_by_document_field': 'email_id,email_ids'
|
||||
})
|
||||
notification.save()
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
frappe.set_user("Administrator")
|
||||
|
|
@ -177,3 +202,65 @@ class TestNotification(unittest.TestCase):
|
|||
frappe.db.sql("""delete from `tabUser` where email='test_jinja@example.com'""")
|
||||
frappe.db.sql("""delete from `tabEmail Queue`""")
|
||||
frappe.db.sql("""delete from `tabEmail Queue Recipient`""")
|
||||
|
||||
def test_notification_to_assignee(self):
|
||||
todo = frappe.new_doc('ToDo')
|
||||
todo.description = 'Test Notification'
|
||||
todo.save()
|
||||
|
||||
assign_to.add({
|
||||
"assign_to": ["test2@example.com"],
|
||||
"doctype": todo.doctype,
|
||||
"name": todo.name,
|
||||
"description": "Close this Todo"
|
||||
})
|
||||
|
||||
assign_to.add({
|
||||
"assign_to": ["test1@example.com"],
|
||||
"doctype": todo.doctype,
|
||||
"name": todo.name,
|
||||
"description": "Close this Todo"
|
||||
})
|
||||
|
||||
#change status of todo
|
||||
todo.status = 'Closed'
|
||||
todo.save()
|
||||
|
||||
email_queue = frappe.get_doc('Email Queue', {'reference_doctype': 'ToDo',
|
||||
'reference_name': todo.name})
|
||||
|
||||
self.assertTrue(email_queue)
|
||||
|
||||
recipients = [d.recipient for d in email_queue.recipients]
|
||||
self.assertTrue('test2@example.com' in recipients)
|
||||
self.assertTrue('test1@example.com' in recipients)
|
||||
|
||||
def test_notification_by_child_table_field(self):
|
||||
contact = frappe.new_doc('Contact')
|
||||
contact.first_name = 'John Doe'
|
||||
contact.status = 'Open'
|
||||
contact.append('email_ids', {
|
||||
'email_id': 'test2@example.com',
|
||||
'is_primary': 1
|
||||
})
|
||||
|
||||
contact.append('email_ids', {
|
||||
'email_id': 'test1@example.com'
|
||||
})
|
||||
|
||||
contact.save()
|
||||
|
||||
#change status of contact
|
||||
contact.status = 'Replied'
|
||||
contact.save()
|
||||
|
||||
email_queue = frappe.get_doc('Email Queue', {'reference_doctype': 'Contact',
|
||||
'reference_name': contact.name})
|
||||
|
||||
self.assertTrue(email_queue)
|
||||
|
||||
recipients = [d.recipient for d in email_queue.recipients]
|
||||
self.assertTrue('test2@example.com' in recipients)
|
||||
self.assertTrue('test1@example.com' in recipients)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -46,9 +46,10 @@
|
|||
"options": "Role"
|
||||
}
|
||||
],
|
||||
"index_web_pages_for_search": 1,
|
||||
"istable": 1,
|
||||
"links": [],
|
||||
"modified": "2020-02-21 11:18:40.125233",
|
||||
"modified": "2020-09-01 17:40:27.289105",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Email",
|
||||
"name": "Notification Recipient",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue