Ver a proveniência

Merge pull request #11398 from deepeshgarg007/notification_enhance

feat: Enhancement in notifications
version-14
mergify[bot] há 4 anos
committed by GitHub
ascendente
cometimento
1ce1019466
Não foi encontrada uma chave conhecida para esta assinatura, na base de dados ID da chave GPG: 4AEE18F83AFDEB23
5 ficheiros alterados com 147 adições e 15 eliminações
  1. +20
    -5
      frappe/email/doctype/notification/notification.js
  2. +11
    -2
      frappe/email/doctype/notification/notification.json
  3. +26
    -6
      frappe/email/doctype/notification/notification.py
  4. +88
    -1
      frappe/email/doctype/notification/test_notification.py
  5. +2
    -1
      frappe/email/doctype/notification_recipient/notification_recipient.json

+ 20
- 5
frappe/email/doctype/notification/notification.js Ver ficheiro

@@ -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) {


+ 11
- 2
frappe/email/doctype/notification/notification.json Ver ficheiro

@@ -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",


+ 26
- 6
frappe/email/doctype/notification/notification.py Ver ficheiro

@@ -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

+ 88
- 1
frappe/email/doctype/notification/test_notification.py Ver ficheiro

@@ -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)



+ 2
- 1
frappe/email/doctype/notification_recipient/notification_recipient.json Ver ficheiro

@@ -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",


Carregando…
Cancelar
Guardar