diff --git a/frappe/exceptions.py b/frappe/exceptions.py index 805d68315b..fbd3fc03be 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -44,3 +44,4 @@ class DocstatusTransitionError(ValidationError): pass class TimestampMismatchError(ValidationError): pass class EmptyTableError(ValidationError): pass class LinkExistsError(ValidationError): pass +class InvalidEmailAddressError(ValidationError): pass diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index fd3d66e001..1095edf4bb 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -292,7 +292,7 @@ class BaseDocument(object): return for df in self.meta.get_select_fields(): - if not (self.get(df.fieldname) and df.options): + if df.fieldname=="naming_series" or not (self.get(df.fieldname) and df.options): continue options = (df.options or "").split("\n") diff --git a/frappe/model/mapper.py b/frappe/model/mapper.py index cdf65cad0a..485a0c0c23 100644 --- a/frappe/model/mapper.py +++ b/frappe/model/mapper.py @@ -22,7 +22,7 @@ def get_mapped_doc(from_doctype, from_docname, table_maps, target_doc=None, elif isinstance(target_doc, basestring): target_doc = frappe.get_doc(json.loads(target_doc)) - if not target_doc.has_permission("create"): + if not ignore_permissions and not target_doc.has_permission("create"): target_doc.raise_no_permission_to("create") map_doc(source_doc, target_doc, table_maps[source_doc.doctype]) diff --git a/frappe/modules/__init__.py b/frappe/modules/__init__.py index 2cc97ee963..3735d5f2ec 100644 --- a/frappe/modules/__init__.py +++ b/frappe/modules/__init__.py @@ -44,19 +44,26 @@ def export_doc(doctype, name, module=None): def get_doctype_module(doctype): return frappe.db.get_value('DocType', doctype, 'module') or "core" -doctype_modules = {} +doctype_python_modules = {} def load_doctype_module(doctype, module=None, prefix=""): - key = (prefix or "") + doctype + if not module: + module = get_doctype_module(doctype) - if not key in doctype_modules: - if not module: - module = get_doctype_module(doctype) - doctype_modules[key] = frappe.get_module(get_module_name(doctype, module, prefix)) + app = get_module_app(module) - return doctype_modules[key] + key = (app, doctype, prefix) -def get_module_name(doctype, module, prefix=""): - from frappe.modules import scrub + if key not in doctype_python_modules: + doctype_python_modules[key] = frappe.get_module(get_module_name(doctype, module, prefix)) + + return doctype_python_modules[key] + +def get_module_name(doctype, module, prefix="", app=None): return '{app}.{module}.doctype.{doctype}.{prefix}{doctype}'.format(\ - app = scrub(frappe.local.module_app[scrub(module)]), - module = scrub(module), doctype = scrub(doctype), prefix=prefix) + app = scrub(app or get_module_app(module)), + module = scrub(module), + doctype = scrub(doctype), + prefix=prefix) + +def get_module_app(module): + return frappe.local.module_app[scrub(module)] diff --git a/frappe/patches.txt b/frappe/patches.txt index 5c54e972e3..14a584c4e6 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -44,4 +44,4 @@ frappe.patches.v4_0.remove_user_owner_custom_field execute:frappe.delete_doc("DocType", "Website Template") execute:frappe.reload_doc('website', 'doctype', 'website_route') #2014-06-17 execute:frappe.db.sql("""update `tabProperty Setter` set property_type='Text' where property in ('options', 'default')""") #2014-06-20 -frappe.patches.v4_1.set_outgoing_email_footer + diff --git a/frappe/patches/v4_1/__init__.py b/frappe/patches/v4_1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/frappe/patches/v4_1/set_outgoing_email_footer.py b/frappe/patches/v4_1/set_outgoing_email_footer.py deleted file mode 100644 index 6d9bcbc1a5..0000000000 --- a/frappe/patches/v4_1/set_outgoing_email_footer.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - -from __future__ import unicode_literals -import frappe -from erpnext.setup.install import default_mail_footer - -def execute(): - mail_footer = frappe.db.get_default('mail_footer') or '' - mail_footer += default_mail_footer - frappe.db.set_value("Outgoing Email Settings", "Outgoing Email Settings", "footer", mail_footer) diff --git a/frappe/public/js/legacy/datatype.js b/frappe/public/js/legacy/datatype.js index 8bd282bd4f..ad3383a696 100644 --- a/frappe/public/js/legacy/datatype.js +++ b/frappe/public/js/legacy/datatype.js @@ -6,6 +6,8 @@ frappe.utils.full_name = function(fn, ln) { } function fmt_money(v, format){ + // deprecated! + // for backward compatibility return format_number(v, format); } diff --git a/frappe/templates/base.html b/frappe/templates/base.html index 6af5cae355..5853a6965d 100644 --- a/frappe/templates/base.html +++ b/frappe/templates/base.html @@ -14,12 +14,9 @@ Built on Frappe.io. Free and Open Source Framework for the Web. https://frappe.i {%- block head_include %}{% endblock -%} {%- block head -%} - - {%- if metatags -%} - {%- for name in metatags %} - - {%- endfor -%} - {%- endif -%} + {% if meta_block is defined %} + {{ meta_block }} + {% endif %} {%- for link in web_include_css %} @@ -50,15 +47,15 @@ Built on Frappe.io. Free and Open Source Framework for the Web. https://frappe.i