@@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json | |||||
from .exceptions import * | from .exceptions import * | ||||
from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template | 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" | __title__ = "Frappe Framework" | ||||
local = Local() | local = Local() | ||||
@@ -287,6 +287,12 @@ def set_incoming_outgoing_accounts(doc): | |||||
if not doc.outgoing_email_account: | if not doc.outgoing_email_account: | ||||
doc.outgoing_email_account = frappe.db.get_value("Email Account", | doc.outgoing_email_account = frappe.db.get_value("Email Account", | ||||
{"default_outgoing": 1, "enable_outgoing": 1}, | {"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() | ["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": | if doc.sent_or_received == "Sent": | ||||
@@ -73,14 +73,14 @@ class EMail: | |||||
self.cc = cc or [] | self.cc = cc or [] | ||||
self.html_set = False | 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, | def set_html(self, message, text_content = None, footer=None, print_html=None, | ||||
formatted=None, inline_images=None, header=None): | formatted=None, inline_images=None, header=None): | ||||
"""Attach message in the html portion of multipart/alternative""" | """Attach message in the html portion of multipart/alternative""" | ||||
if not formatted: | if not formatted: | ||||
formatted = get_formatted_html(self.subject, message, footer, print_html, | 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, | # this is the first html part of a multi-part message, | ||||
# convert to text well | # convert to text well | ||||
@@ -231,9 +231,9 @@ class EMail: | |||||
return self.msg_root.as_string() | return self.msg_root.as_string() | ||||
def get_formatted_html(subject, message, footer=None, print_html=None, | 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: | 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({ | rendered_email = frappe.get_template("templates/emails/standard.html").render({ | ||||
"header": get_header(header), | "header": get_header(header), | ||||
@@ -64,7 +64,7 @@ def send(recipients=None, sender=None, subject=None, message=None, text_content= | |||||
if isinstance(send_after, int): | if isinstance(send_after, int): | ||||
send_after = add_days(nowdate(), send_after) | 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": | if not sender or sender == "Administrator": | ||||
sender = email_account.default_sender | sender = email_account.default_sender | ||||
@@ -401,7 +401,7 @@ def send_one(email, smtpserver=None, auto_commit=True, now=False, from_test=Fals | |||||
try: | try: | ||||
if not frappe.flags.in_test: | if not frappe.flags.in_test: | ||||
if not smtpserver: smtpserver = SMTPServer() | 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: | for recipient in recipients_list: | ||||
if recipient.status != "Not Sent": | if recipient.status != "Not Sent": | ||||
@@ -7,8 +7,8 @@ import frappe | |||||
import smtplib | import smtplib | ||||
import email.utils | import email.utils | ||||
import _socket, sys | import _socket, sys | ||||
from frappe.utils import cint | |||||
from frappe import _ | from frappe import _ | ||||
from frappe.utils import cint, parse_addr | |||||
def send(email, append_to=None, retry=1): | def send(email, append_to=None, retry=1): | ||||
"""Deprecated: Send the message or add it to Outbox Email""" | """Deprecated: Send the message or add it to Outbox Email""" | ||||
@@ -35,22 +35,32 @@ def send(email, append_to=None, retry=1): | |||||
_send(retry) | _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 | """Returns outgoing email account based on `append_to` or the default | ||||
outgoing account. If default outgoing account is not found, it will | outgoing account. If default outgoing account is not found, it will | ||||
try getting settings from `site_config.json`.""" | 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): | if not getattr(frappe.local, "outgoing_email_account", None): | ||||
frappe.local.outgoing_email_account = {} | 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 | email_account = None | ||||
if append_to: | if append_to: | ||||
# append_to is only valid when enable_incoming is checked | # 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}) | 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: | 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) | 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')): | 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.password = email_account.get_password(raise_exception=raise_exception) | ||||
email_account.default_sender = email.utils.formataddr((email_account.name, email_account.get("email_id"))) | 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): | def get_default_outgoing_email_account(raise_exception_not_set=True): | ||||
'''conf should be like: | '''conf should be like: | ||||
@@ -136,8 +146,8 @@ class SMTPServer: | |||||
else: | else: | ||||
self.setup_email_account(append_to) | 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: | if self.email_account: | ||||
self.server = self.email_account.smtp_server | self.server = self.email_account.smtp_server | ||||
self.login = getattr(self.email_account, "login_id", None) or self.email_account.email_id | self.login = getattr(self.email_account, "login_id", None) or self.email_account.email_id | ||||
@@ -55,7 +55,7 @@ frappe.ui.form.ControlDateRange = frappe.ui.form.ControlData.extend({ | |||||
if(value1 && value2) { | if(value1 && value2) { | ||||
value1 = frappe.datetime.str_to_user(value1); | value1 = frappe.datetime.str_to_user(value1); | ||||
value2 = frappe.datetime.str_to_user(value2); | value2 = frappe.datetime.str_to_user(value2); | ||||
return __("{0} to {1}").format([value1, value2]); | |||||
return __("{0} to {1}", [value1, value2]); | |||||
} | } | ||||
return ""; | return ""; | ||||
} | } | ||||
@@ -126,7 +126,7 @@ frappe.form.formatters = { | |||||
}, | }, | ||||
DateRange: function(value) { | DateRange: function(value) { | ||||
if($.isArray(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[0]), | ||||
frappe.datetime.str_to_user(value[1]) | frappe.datetime.str_to_user(value[1]) | ||||
]); | ]); | ||||
@@ -133,9 +133,8 @@ frappe.ui.FilterList = Class.extend({ | |||||
for(var i in this.filters) { | for(var i in this.filters) { | ||||
if(this.filters[i].field) { | if(this.filters[i].field) { | ||||
var f = this.filters[i].get_value(); | 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; | flag = true; | ||||
} else if($.isArray(value) && frappe.utils.arrays_equal(value, f[3])) { | } else if($.isArray(value) && frappe.utils.arrays_equal(value, f[3])) { | ||||
flag = true; | flag = true; | ||||
@@ -263,8 +262,7 @@ frappe.ui.Filter = Class.extend({ | |||||
apply: function() { | apply: function() { | ||||
var f = this.get_value(); | var f = this.get_value(); | ||||
this.flist.filters.pop(); | 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(); | this.wrapper.remove(); | ||||
}, | }, | ||||
@@ -26,7 +26,7 @@ frappe.confirm = function(message, ifyes, ifno) { | |||||
var d = new frappe.ui.Dialog({ | var d = new frappe.ui.Dialog({ | ||||
title: __("Confirm"), | title: __("Confirm"), | ||||
fields: [ | fields: [ | ||||
{fieldtype:"HTML", options:"<p class='frappe-confirm-message'>" + message + "</p>"} | |||||
{fieldtype:"HTML", options:`<p class="frappe-confirm-message">${message}</p>`} | |||||
], | ], | ||||
primary_action_label: __("Yes"), | primary_action_label: __("Yes"), | ||||
primary_action: function() { | primary_action: function() { | ||||