diff --git a/frappe/__init__.py b/frappe/__init__.py index 3251161a92..380a2b9b77 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template -__version__ = '7.2.27' +__version__ = '7.2.28' __title__ = "Frappe Framework" local = Local() @@ -48,7 +48,8 @@ def _(msg, lang=None): # msg should always be unicode msg = as_unicode(msg).strip() - return get_full_dict(local.lang).get(msg) or msg + # return lang_full_dict according to lang passed parameter + return get_full_dict(lang).get(msg) or msg def as_unicode(text, encoding='utf-8'): '''Convert to unicode if required''' diff --git a/frappe/email/receive.py b/frappe/email/receive.py index 7bceaab1be..10212c52c2 100644 --- a/frappe/email/receive.py +++ b/frappe/email/receive.py @@ -292,16 +292,28 @@ class Email: def set_from(self): # gmail mailing-list compatibility # use X-Original-Sender if available, as gmail sometimes modifies the 'From' - _from_email = self.mail.get("X-Original-From") or self.mail["From"] - _from_email, encoding = decode_header(_from_email)[0] + _from_email = self.decode_email(self.mail.get("X-Original-From") or self.mail["From"]) + _reply_to = self.decode_email(self.mail.get("Reply-To")) - if encoding: - _from_email = _from_email.decode(encoding) + if _reply_to and not frappe.db.get_value('Email Account', {"email_id":_reply_to}, 'email_id'): + self.from_email = extract_email_id(_reply_to) else: - _from_email = _from_email.decode('utf-8') + self.from_email = extract_email_id(_from_email) - self.from_email = extract_email_id(_from_email) - self.from_real_name = email.utils.parseaddr(_from_email)[0] + if self.from_email: + self.from_email = self.from_email.lower() + + self.from_real_name = email.utils.parseaddr(_from_email)[0] if "@" in _from_email else _from_email + + def decode_email(self, email): + if not email: return + decoded = "" + for part, encoding in decode_header(email): + if encoding: + decoded += part.decode(encoding) + else: + decoded += part.decode('utf-8') + return decoded def set_content_and_type(self): self.content, self.content_type = '[Blank Email]', 'text/plain' diff --git a/frappe/patches/v6_4/reduce_varchar_length.py b/frappe/patches/v6_4/reduce_varchar_length.py index bb02451d9b..a6e9e32a3f 100644 --- a/frappe/patches/v6_4/reduce_varchar_length.py +++ b/frappe/patches/v6_4/reduce_varchar_length.py @@ -4,6 +4,8 @@ import frappe def execute(): for doctype in frappe.get_all("DocType", filters={"issingle": 0}): doctype = doctype.name + if not frappe.db.table_exists(doctype): + continue for column in frappe.db.sql("desc `tab{doctype}`".format(doctype=doctype), as_dict=True): fieldname = column["Field"] diff --git a/frappe/translate.py b/frappe/translate.py index 80bafac7c8..c143e46f18 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -179,7 +179,7 @@ def get_full_dict(lang): return {} # found in local, return! - if getattr(frappe.local, 'lang_full_dict', None) is not None: + if getattr(frappe.local, 'lang_full_dict', None) and frappe.local.lang_full_dict.get(lang, None): return frappe.local.lang_full_dict frappe.local.lang_full_dict = load_lang(lang)