From 3f93565553f0e64c243671d7a7698d363348be0f Mon Sep 17 00:00:00 2001
From: Faris Ansari
Date: Thu, 27 Jul 2017 17:51:20 +0530
Subject: [PATCH] Email designs (#3786)
* New message email
* Mentioned in a comment
* File backup email
* Feedback email
* Administrator logged in email
* Upcoming events email
* minor
* Add header title and indicator color
---
frappe/core/doctype/communication/comment.py | 15 +++++-----
.../feedback_trigger/feedback_trigger.py | 10 +++++--
frappe/core/doctype/user/user.py | 30 ++++++++-----------
frappe/desk/doctype/event/event.py | 20 +++++++------
frappe/desk/page/backups/backups.py | 11 +++++--
frappe/desk/page/chat/chat.py | 9 ++++--
frappe/public/css/email.css | 3 ++
frappe/public/less/email.less | 4 +++
.../emails/administrator_logged_in.html | 3 ++
.../emails/feedback_request_url.html | 2 +-
frappe/templates/emails/new_message.html | 6 ++--
frappe/templates/emails/upcoming_events.html | 9 ++++++
frappe/utils/jinja.py | 4 +--
13 files changed, 78 insertions(+), 48 deletions(-)
create mode 100644 frappe/templates/emails/administrator_logged_in.html
create mode 100644 frappe/templates/emails/upcoming_events.html
diff --git a/frappe/core/doctype/communication/comment.py b/frappe/core/doctype/communication/comment.py
index 96c3e59d84..b5f0f141bc 100644
--- a/frappe/core/doctype/communication/comment.py
+++ b/frappe/core/doctype/communication/comment.py
@@ -82,12 +82,7 @@ def notify_mentions(doc):
sender_fullname = get_fullname(frappe.session.user)
parent_doc_label = "{0} {1}".format(_(doc.reference_doctype), doc.reference_name)
- subject = _("{0} mentioned you in a comment in {1}").format(sender_fullname, parent_doc_label)
- message = frappe.get_template("templates/emails/mentioned_in_comment.html").render({
- "sender_fullname": sender_fullname,
- "comment": doc,
- "link": get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label)
- })
+ subject = _("{0} mentioned you in a comment").format(sender_fullname)
recipients = [frappe.db.get_value("User", {"enabled": 1, "username": username, "user_type": "System User"})
for username in mentions]
@@ -96,7 +91,13 @@ def notify_mentions(doc):
recipients=recipients,
sender=frappe.session.user,
subject=subject,
- message=message
+ template="mentioned_in_comment",
+ args={
+ "sender_fullname": sender_fullname,
+ "comment": doc,
+ "link": get_link_to_form(doc.reference_doctype, doc.reference_name, label=parent_doc_label)
+ },
+ header=[_('New Mention'), 'orange']
)
def get_comments_from_parent(doc):
diff --git a/frappe/core/doctype/feedback_trigger/feedback_trigger.py b/frappe/core/doctype/feedback_trigger/feedback_trigger.py
index 6b9ca3e46a..e40f668d58 100644
--- a/frappe/core/doctype/feedback_trigger/feedback_trigger.py
+++ b/frappe/core/doctype/feedback_trigger/feedback_trigger.py
@@ -66,12 +66,16 @@ def send_feedback_request(reference_doctype, reference_name, trigger="Manual", d
feedback_request, url = get_feedback_request_url(reference_doctype,
reference_name, details.get("recipients"), trigger)
- feedback_url = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url })
+ feedback_msg = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url })
# appending feedback url to message body
- details.update({ "message": "{message}{feedback_url}".format(
+ message = "{message}{feedback_msg}".format(
message=details.get("message"),
- feedback_url=feedback_url)
+ feedback_msg=feedback_msg
+ )
+ details.update({
+ "message": message,
+ "header": [details.get('subject'), 'blue']
})
if details:
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index da08997456..61324618eb 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -858,25 +858,21 @@ def notify_admin_access_to_system_manager(login_manager=None):
and login_manager.user == "Administrator"
and frappe.local.conf.notify_admin_access_to_system_manager):
- message = """
- {dear_system_manager}
- {access_message}
- {is_it_unauthorized}
-
""".format(
- dear_system_manager=_("Dear System Manager,"),
-
- access_message=_("""Administrator accessed {0} on {1} via IP Address {2}.""").format(
- """{site}""".format(site=frappe.local.request.host_url),
- """{date_and_time}""".format(date_and_time=format_datetime(now_datetime(), format_string="medium")),
- frappe.local.request_ip
- ),
-
- is_it_unauthorized=_("If you think this is unauthorized, please change the Administrator password.")
+ site = '{0}'.format(frappe.local.request.host_url)
+ date_and_time = '{0}'.format(format_datetime(now_datetime(), format_string="medium"))
+ ip_address = frappe.local.request_ip
+
+ access_message = _('Administrator accessed {0} on {1} via IP Address {2}.').format(
+ site, date_and_time, ip_address)
+
+ frappe.sendmail(
+ recipients=get_system_managers(),
+ subject=_("Administrator Logged In"),
+ template="administrator_logged_in",
+ args={'access_message': access_message},
+ header=[subject, 'orange']
)
- frappe.sendmail(recipients=get_system_managers(), subject=_("Administrator Logged In"),
- message=message)
-
def extract_mentions(txt):
"""Find all instances of @username in the string.
The mentions will be separated by non-word characters or may appear at the start of the string"""
diff --git a/frappe/desk/doctype/event/event.py b/frappe/desk/doctype/event/event.py
index 66701c9c5a..b77b708ae6 100644
--- a/frappe/desk/doctype/event/event.py
+++ b/frappe/desk/doctype/event/event.py
@@ -7,7 +7,7 @@ import frappe
import json
from frappe.utils import (getdate, cint, add_months, date_diff, add_days,
- nowdate, get_datetime_str, cstr, get_datetime, now_datetime)
+ nowdate, get_datetime_str, cstr, get_datetime, now_datetime, format_datetime)
from frappe.model.document import Document
from frappe.utils.user import get_enabled_system_users
from frappe.desk.reportview import get_filters_cond
@@ -48,20 +48,22 @@ def send_event_digest():
for user in get_enabled_system_users():
events = get_events(today, today, user.name, for_reminder=True)
if events:
- text = ""
frappe.set_user_lang(user.name, user.language)
- text = "" + frappe._("Events In Today's Calendar") + "
"
for e in events:
+ e.starts_on = format_datetime(e.starts_on, 'hh:mm a')
if e.all_day:
e.starts_on = "All Day"
- text += "%(starts_on)s: %(subject)s
%(description)s
" % e
- text += ''\
- + frappe._("Daily Event Digest is sent for Calendar Events where reminders are set.")+'
'
-
- frappe.sendmail(recipients=user.email, subject=frappe._("Upcoming Events for Today"),
- content = text)
+ frappe.sendmail(
+ recipients=user.email,
+ subject=frappe._("Upcoming Events for Today"),
+ template="upcoming_events",
+ args={
+ 'events': events,
+ },
+ header=[frappe._("Events in Today's Calendar"), 'blue']
+ )
@frappe.whitelist()
def get_events(start, end, user=None, for_reminder=False, filters=None):
diff --git a/frappe/desk/page/backups/backups.py b/frappe/desk/page/backups/backups.py
index f3517c6953..2d493515b7 100644
--- a/frappe/desk/page/backups/backups.py
+++ b/frappe/desk/page/backups/backups.py
@@ -76,9 +76,14 @@ def backup_files_and_notify_user(user_email=None):
backup_files = backup(with_files=True)
get_downloadable_links(backup_files)
- subject = "File backup is ready"
- message = frappe.render_template('frappe/templates/emails/file_backup_notification.html', backup_files, is_path=True)
- frappe.sendmail(recipients=[user_email], subject=subject, message=message)
+ subject = _("File backup is ready")
+ frappe.sendmail(
+ recipients=[user_email],
+ subject=subject,
+ template="file_backup_notification",
+ args=backup_files,
+ header=[subject, 'green']
+ )
def get_downloadable_links(backup_files):
for key in ['backup_path_files', 'backup_path_private_files']:
diff --git a/frappe/desk/page/chat/chat.py b/frappe/desk/page/chat/chat.py
index a0ea8b7393..19f4d4cae4 100644
--- a/frappe/desk/page/chat/chat.py
+++ b/frappe/desk/page/chat/chat.py
@@ -6,6 +6,7 @@ import frappe
from frappe.desk.notifications import delete_notification_count_for
from frappe.core.doctype.user.user import STANDARD_USERS
from frappe.utils import cint
+from frappe import _
@frappe.whitelist()
def get_list(arg=None):
@@ -132,11 +133,13 @@ def _notify(contact, txt, subject=None):
frappe.sendmail(\
recipients=contact,
sender= frappe.db.get_value("User", frappe.session.user, "email"),
- subject=subject or "New Message from " + get_fullname(frappe.session.user),
- message=frappe.get_template("templates/emails/new_message.html").render({
+ subject=subject or _("New Message from {0}").format(get_fullname(frappe.session.user)),
+ template="new_message",
+ args={
"from": get_fullname(frappe.session.user),
"message": txt,
"link": get_url()
- }))
+ },
+ header=[_('New Message'), 'orange'])
except frappe.OutgoingEmailError:
pass
diff --git a/frappe/public/css/email.css b/frappe/public/css/email.css
index 3f2df6d15f..57b2033d49 100644
--- a/frappe/public/css/email.css
+++ b/frappe/public/css/email.css
@@ -121,6 +121,9 @@ hr {
.text-small {
font-size: 10px;
}
+.text-bold {
+ font-weight: bold;
+}
.indicator {
width: 8px;
height: 8px;
diff --git a/frappe/public/less/email.less b/frappe/public/less/email.less
index d4d48482ea..640c300daa 100644
--- a/frappe/public/less/email.less
+++ b/frappe/public/less/email.less
@@ -152,6 +152,10 @@ hr {
font-size: @text-small;
}
+.text-bold {
+ font-weight: bold;
+}
+
.indicator {
width: 8px;
height: 8px;
diff --git a/frappe/templates/emails/administrator_logged_in.html b/frappe/templates/emails/administrator_logged_in.html
new file mode 100644
index 0000000000..d16034bfd1
--- /dev/null
+++ b/frappe/templates/emails/administrator_logged_in.html
@@ -0,0 +1,3 @@
+{{ _("Dear System Manager,") }}
+{{ access_message }}
+{{ _("If you think this is unauthorized, please change the Administrator password.") }}
\ No newline at end of file
diff --git a/frappe/templates/emails/feedback_request_url.html b/frappe/templates/emails/feedback_request_url.html
index b6d4de7f32..e9cec87b4d 100644
--- a/frappe/templates/emails/feedback_request_url.html
+++ b/frappe/templates/emails/feedback_request_url.html
@@ -5,5 +5,5 @@
★
★
★
- {{ _("1 star being lowest & 5 stars being highest rating") }}
+ {{ _("1 star being lowest & 5 stars being highest rating") }}
diff --git a/frappe/templates/emails/new_message.html b/frappe/templates/emails/new_message.html
index a4a2ea933d..90f402f51d 100644
--- a/frappe/templates/emails/new_message.html
+++ b/frappe/templates/emails/new_message.html
@@ -1,5 +1,5 @@
-New Message
You have a new message from: {{ from }}
{{ message }}
-
-Login and view in Browser
+
diff --git a/frappe/templates/emails/upcoming_events.html b/frappe/templates/emails/upcoming_events.html
new file mode 100644
index 0000000000..8f9482b98d
--- /dev/null
+++ b/frappe/templates/emails/upcoming_events.html
@@ -0,0 +1,9 @@
+{% for e in events %}
+
+ {{ e.starts_on }}: {{ e.subject }}
+
{{ e.description or '' }}
+
+{% endfor %}
+
+ {{ _("Daily Event Digest is sent for Calendar Events where reminders are set.") }}
+
\ No newline at end of file
diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py
index 1fd9a0d85c..749a28479f 100644
--- a/frappe/utils/jinja.py
+++ b/frappe/utils/jinja.py
@@ -28,8 +28,8 @@ def get_email_from_template(name, args):
args = args or {}
try:
message = get_template('templates/emails/' + name + '.html').render(args)
- except TemplateNotFound:
- message = None
+ except TemplateNotFound as e:
+ raise e
try:
text_content = get_template('templates/emails/' + name + '.txt').render(args)