diff --git a/frappe/__init__.py b/frappe/__init__.py index 5ee4517b6d..61ae764694 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '9.0.0' +__version__ = '9.0.1' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/core/doctype/communication/email.py b/frappe/core/doctype/communication/email.py index b8a8b4ec30..04bc906161 100755 --- a/frappe/core/doctype/communication/email.py +++ b/frappe/core/doctype/communication/email.py @@ -287,6 +287,12 @@ def set_incoming_outgoing_accounts(doc): if not doc.outgoing_email_account: doc.outgoing_email_account = frappe.db.get_value("Email Account", {"default_outgoing": 1, "enable_outgoing": 1}, + ["email_id", "always_use_account_email_id_as_sender", "name", "send_unsubscribe_message"],as_dict=True) or frappe._dict() + + if not doc.outgoing_email_account: + # if from address is not the default email account + doc.outgoing_email_account = frappe.db.get_value("Email Account", + {"email_id": doc.sender, "enable_outgoing": 1}, ["email_id", "always_use_account_email_id_as_sender", "name", "send_unsubscribe_message"], as_dict=True) or frappe._dict() if doc.sent_or_received == "Sent": diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index cf36aac68e..638905c391 100755 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -73,14 +73,14 @@ class EMail: self.cc = cc or [] self.html_set = False - self.email_account = email_account or get_outgoing_email_account() + self.email_account = email_account or get_outgoing_email_account(sender=sender) def set_html(self, message, text_content = None, footer=None, print_html=None, formatted=None, inline_images=None, header=None): """Attach message in the html portion of multipart/alternative""" if not formatted: formatted = get_formatted_html(self.subject, message, footer, print_html, - email_account=self.email_account, header=header) + email_account=self.email_account, header=header, sender=self.sender) # this is the first html part of a multi-part message, # convert to text well @@ -231,9 +231,9 @@ class EMail: return self.msg_root.as_string() def get_formatted_html(subject, message, footer=None, print_html=None, - email_account=None, header=None, unsubscribe_link=None): + email_account=None, header=None, unsubscribe_link=None, sender=None): if not email_account: - email_account = get_outgoing_email_account(False) + email_account = get_outgoing_email_account(False, sender=sender) rendered_email = frappe.get_template("templates/emails/standard.html").render({ "header": get_header(header), diff --git a/frappe/email/queue.py b/frappe/email/queue.py index b0d903e770..d34592f055 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -64,7 +64,7 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content= if isinstance(send_after, int): send_after = add_days(nowdate(), send_after) - email_account = get_outgoing_email_account(True, append_to=reference_doctype) + email_account = get_outgoing_email_account(True, append_to=reference_doctype, sender=sender) if not sender or sender == "Administrator": sender = email_account.default_sender @@ -401,7 +401,7 @@ def send_one(email, smtpserver=None, auto_commit=True, now=False, from_test=Fals try: if not frappe.flags.in_test: if not smtpserver: smtpserver = SMTPServer() - smtpserver.setup_email_account(email.reference_doctype) + smtpserver.setup_email_account(email.reference_doctype, sender=email.sender) for recipient in recipients_list: if recipient.status != "Not Sent": diff --git a/frappe/email/smtp.py b/frappe/email/smtp.py index db82d937ee..1c6b2d89df 100644 --- a/frappe/email/smtp.py +++ b/frappe/email/smtp.py @@ -7,8 +7,8 @@ import frappe import smtplib import email.utils import _socket, sys -from frappe.utils import cint from frappe import _ +from frappe.utils import cint, parse_addr def send(email, append_to=None, retry=1): """Deprecated: Send the message or add it to Outbox Email""" @@ -35,22 +35,32 @@ def send(email, append_to=None, retry=1): _send(retry) -def get_outgoing_email_account(raise_exception_not_set=True, append_to=None): +def get_outgoing_email_account(raise_exception_not_set=True, append_to=None, sender=None): """Returns outgoing email account based on `append_to` or the default outgoing account. If default outgoing account is not found, it will try getting settings from `site_config.json`.""" + sender_email_id = None + if sender: + sender_email_id = parse_addr(sender)[1] + if not getattr(frappe.local, "outgoing_email_account", None): frappe.local.outgoing_email_account = {} - if not frappe.local.outgoing_email_account.get(append_to or "default"): + if not frappe.local.outgoing_email_account.get(append_to or sender_email_id or "default"): email_account = None if append_to: # append_to is only valid when enable_incoming is checked email_account = _get_email_account({"enable_outgoing": 1, "enable_incoming": 1, "append_to": append_to}) + if not email_account and sender_email_id: + # check if the sender has email account with enable_outgoing + email_account = _get_email_account({"enable_outgoing": 1, "email_id": sender_email_id}) + if not email_account: + # sender don't have the outging email account + sender_email_id = None email_account = get_default_outgoing_email_account(raise_exception_not_set=raise_exception_not_set) if not email_account and raise_exception_not_set and cint(frappe.db.get_single_value('System Settings', 'setup_complete')): @@ -65,9 +75,9 @@ def get_outgoing_email_account(raise_exception_not_set=True, append_to=None): email_account.password = email_account.get_password(raise_exception=raise_exception) email_account.default_sender = email.utils.formataddr((email_account.name, email_account.get("email_id"))) - frappe.local.outgoing_email_account[append_to or "default"] = email_account + frappe.local.outgoing_email_account[append_to or sender_email_id or "default"] = email_account - return frappe.local.outgoing_email_account[append_to or "default"] + return frappe.local.outgoing_email_account[append_to or sender_email_id or "default"] def get_default_outgoing_email_account(raise_exception_not_set=True): '''conf should be like: @@ -136,8 +146,8 @@ class SMTPServer: else: self.setup_email_account(append_to) - def setup_email_account(self, append_to=None): - self.email_account = get_outgoing_email_account(raise_exception_not_set=False, append_to=append_to) + def setup_email_account(self, append_to=None, sender=None): + self.email_account = get_outgoing_email_account(raise_exception_not_set=False, append_to=append_to, sender=sender) if self.email_account: self.server = self.email_account.smtp_server self.login = getattr(self.email_account, "login_id", None) or self.email_account.email_id diff --git a/frappe/public/js/frappe/form/controls/date_range.js b/frappe/public/js/frappe/form/controls/date_range.js index 0b9fe6e4c9..6acc7b5748 100644 --- a/frappe/public/js/frappe/form/controls/date_range.js +++ b/frappe/public/js/frappe/form/controls/date_range.js @@ -55,7 +55,7 @@ frappe.ui.form.ControlDateRange = frappe.ui.form.ControlData.extend({ if(value1 && value2) { value1 = frappe.datetime.str_to_user(value1); value2 = frappe.datetime.str_to_user(value2); - return __("{0} to {1}").format([value1, value2]); + return __("{0} to {1}", [value1, value2]); } return ""; } diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index ca8866891f..64147dfc03 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -126,7 +126,7 @@ frappe.form.formatters = { }, DateRange: function(value) { if($.isArray(value)) { - return __("{0} to {1}").format([ + return __("{0} to {1}", [ frappe.datetime.str_to_user(value[0]), frappe.datetime.str_to_user(value[1]) ]); diff --git a/frappe/public/js/frappe/ui/filters/filters.js b/frappe/public/js/frappe/ui/filters/filters.js index 865ad13b0e..64b4cd1ed1 100644 --- a/frappe/public/js/frappe/ui/filters/filters.js +++ b/frappe/public/js/frappe/ui/filters/filters.js @@ -133,9 +133,8 @@ frappe.ui.FilterList = Class.extend({ for(var i in this.filters) { if(this.filters[i].field) { var f = this.filters[i].get_value(); - var val = this.get_formatted_value(this.filters[i].field, f[3]); - if(f[0]==doctype && f[1]==fieldname && f[2]==condition && val==value) { + if(f[0]==doctype && f[1]==fieldname && f[2]==condition && f[3]==value) { flag = true; } else if($.isArray(value) && frappe.utils.arrays_equal(value, f[3])) { flag = true; @@ -263,8 +262,7 @@ frappe.ui.Filter = Class.extend({ apply: function() { var f = this.get_value(); this.flist.filters.pop(); - var val = this.flist.get_formatted_value(this.field, f[3]); - this.flist.push_new_filter(f[0], f[1], f[2], val); + this.flist.push_new_filter(f[0], f[1], f[2], f[3]); this.wrapper.remove(); }, diff --git a/frappe/public/js/frappe/ui/messages.js b/frappe/public/js/frappe/ui/messages.js index b4d4244bbf..df64bc77f4 100644 --- a/frappe/public/js/frappe/ui/messages.js +++ b/frappe/public/js/frappe/ui/messages.js @@ -26,7 +26,7 @@ frappe.confirm = function(message, ifyes, ifno) { var d = new frappe.ui.Dialog({ title: __("Confirm"), fields: [ - {fieldtype:"HTML", options:"

" + message + "

"} + {fieldtype:"HTML", options:`

${message}

`} ], primary_action_label: __("Yes"), primary_action: function() {