From 9c339145b213db5ab3b7e8ad758affc54a4b39ea Mon Sep 17 00:00:00 2001 From: Makarand Bauskar Date: Fri, 29 Sep 2017 15:02:51 +0530 Subject: [PATCH] [Enhance] Custom notification messages for subscription documents (#10970) * [minor] configurable subscription email message and subject for notification * [minor] added description for subject field --- .../doctype/subscription/subscription.json | 99 ++++++++++++++++++- .../doctype/subscription/subscription.py | 27 +++-- 2 files changed, 118 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/subscription/subscription.json b/erpnext/accounts/doctype/subscription/subscription.json index 85779533ea..902b06290e 100644 --- a/erpnext/accounts/doctype/subscription/subscription.json +++ b/erpnext/accounts/doctype/subscription/subscription.json @@ -439,7 +439,7 @@ "allow_bulk_edit": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, "columns": 0, "fieldname": "notification", "fieldtype": "Section Break", @@ -495,6 +495,38 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.notify_by_email", + "description": "To add dynamic subject, use jinja tags like\n\n
New {{ doc.doctype }} #{{ doc.name }}
", + "fieldname": "subject", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Subject", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -593,6 +625,69 @@ "bold": 0, "collapsible": 1, "columns": 0, + "depends_on": "eval:doc.notify_by_email", + "fieldname": "section_break_20", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Message", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Please find attached {{ doc.doctype }} #{{ doc.name }}", + "fieldname": "message", + "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Message", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "depends_on": "eval: !doc.__islocal", "fieldname": "section_break_16", "fieldtype": "Section Break", "hidden": 0, @@ -690,7 +785,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-14 12:09:38.471458", + "modified": "2017-09-28 18:27:48.522098", "modified_by": "Administrator", "module": "Accounts", "name": "Subscription", diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py index c9df7d461e..b7ea96f0ce 100644 --- a/erpnext/accounts/doctype/subscription/subscription.py +++ b/erpnext/accounts/doctype/subscription/subscription.py @@ -7,6 +7,7 @@ import frappe import calendar from frappe import _ from frappe.desk.form import assign_to +from frappe.utils.jinja import validate_template from dateutil.relativedelta import relativedelta from frappe.utils.user import get_system_managers from frappe.utils import cstr, getdate, split_emails, add_days, today @@ -20,6 +21,9 @@ class Subscription(Document): self.validate_next_schedule_date() self.validate_email_id() + validate_template(self.subject or "") + validate_template(self.message or "") + def before_submit(self): self.set_next_schedule_date() @@ -114,7 +118,7 @@ def create_documents(data, schedule_date): doc = make_new_document(data, schedule_date) if data.notify_by_email and data.recipients: print_format = data.print_format or "Standard" - send_notification(doc, print_format, data.recipients) + send_notification(doc, data, print_format=print_format) frappe.db.commit() except Exception: @@ -174,14 +178,25 @@ def get_next_date(dt, mcount, day=None): return dt -def send_notification(new_rv, print_format='Standard', recipients=None): +def send_notification(new_rv, subscription_doc, print_format='Standard'): """Notify concerned persons about recurring document generation""" print_format = print_format - frappe.sendmail(recipients, - subject= _("New {0}: #{1}").format(new_rv.doctype, new_rv.name), - message = _("Please find attached {0} #{1}").format(new_rv.doctype, new_rv.name), - attachments = [frappe.attach_print(new_rv.doctype, new_rv.name, file_name=new_rv.name, print_format=print_format)]) + if not subscription_doc.subject: + subject = _("New {0}: #{1}").format(new_rv.doctype, new_rv.name) + elif "{" in subscription_doc.subject: + subject = frappe.render_template(subscription_doc.subject, {'doc': new_rv}) + + if not subscription_doc.message: + message = _("Please find attached {0} #{1}").format(new_rv.doctype, new_rv.name) + elif "{" in subscription_doc.message: + message = frappe.render_template(subscription_doc.message, {'doc': new_rv}) + + attachments = [frappe.attach_print(new_rv.doctype, new_rv.name, + file_name=new_rv.name, print_format=print_format)] + + frappe.sendmail(subscription_doc.recipients, + subject=subject, message=message, attachments=attachments) def notify_errors(doc, doctype, party, owner, name): recipients = get_system_managers(only_name=True)