@@ -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__ = '10.0.7' | |||||
__version__ = '10.0.8' | |||||
__title__ = "Frappe Framework" | __title__ = "Frappe Framework" | ||||
local = Local() | local = Local() | ||||
@@ -168,7 +168,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False, | |||||
# added file to attachments list | # added file to attachments list | ||||
attachments.append(d[fieldname]) | attachments.append(d[fieldname]) | ||||
elif fieldtype in ("Link", "Dynamic Link") and d[fieldname]: | |||||
elif fieldtype in ("Link", "Dynamic Link", "Data") and d[fieldname]: | |||||
# as fields can be saved in the number format(long type) in data import template | # as fields can be saved in the number format(long type) in data import template | ||||
d[fieldname] = cstr(d[fieldname]) | d[fieldname] = cstr(d[fieldname]) | ||||
@@ -155,9 +155,7 @@ frappe.PermissionEngine = Class.extend({ | |||||
role: me.get_role() | role: me.get_role() | ||||
}, | }, | ||||
callback: function(r) { | callback: function(r) { | ||||
frappe.model.with_doc('DocType', me.get_doctype(), () => { | |||||
me.render(r.message); | |||||
}); | |||||
me.render(r.message); | |||||
} | } | ||||
}); | }); | ||||
}, | }, | ||||
@@ -211,10 +209,8 @@ frappe.PermissionEngine = Class.extend({ | |||||
var perm_cell = me.add_cell(row, d, "permissions").css("padding-top", 0); | var perm_cell = me.add_cell(row, d, "permissions").css("padding-top", 0); | ||||
var perm_container = $("<div class='row'></div>").appendTo(perm_cell); | var perm_container = $("<div class='row'></div>").appendTo(perm_cell); | ||||
const { is_submittable } = frappe.model.get_doc('DocType', me.get_doctype()); | |||||
me.rights.forEach(r => { | me.rights.forEach(r => { | ||||
if (!is_submittable && ['submit', 'cancel', 'amend'].includes(r)) return; | |||||
if (!d.is_submittable && ['submit', 'cancel', 'amend'].includes(r)) return; | |||||
me.add_check(perm_container, d, r); | me.add_check(perm_container, d, r); | ||||
}); | }); | ||||
@@ -62,6 +62,9 @@ def get_permissions(doctype=None, role=None): | |||||
if not d.parent in linked_doctypes: | if not d.parent in linked_doctypes: | ||||
linked_doctypes[d.parent] = get_linked_doctypes(d.parent) | linked_doctypes[d.parent] = get_linked_doctypes(d.parent) | ||||
d.linked_doctypes = linked_doctypes[d.parent] | d.linked_doctypes = linked_doctypes[d.parent] | ||||
meta = frappe.get_meta(d.parent) | |||||
if meta: | |||||
d.is_submittable = meta.is_submittable | |||||
return out | return out | ||||
@@ -12,7 +12,7 @@ frappe.ui.form.ControlDynamicLink = frappe.ui.form.ControlLink.extend({ | |||||
let input = null; | let input = null; | ||||
if (cur_list) { | if (cur_list) { | ||||
// for list page | // for list page | ||||
input = cur_list.wrapper.find(selector); | |||||
input = cur_list.filter_area.standard_filters_wrapper.find(selector); | |||||
} | } | ||||
if (cur_page) { | if (cur_page) { | ||||
input = $(cur_page.page).find(selector); | input = $(cur_page.page).find(selector); | ||||
@@ -184,11 +184,7 @@ frappe.views.TreeView = Class.extend({ | |||||
condition: function(node) { | condition: function(node) { | ||||
let allow_rename = true; | let allow_rename = true; | ||||
if (me.doctype && frappe.get_meta(me.doctype)) { | if (me.doctype && frappe.get_meta(me.doctype)) { | ||||
let autoname = frappe.get_meta(me.doctype).autoname; | |||||
// only allow renaming if doctye is set and | |||||
// autoname property is "prompt" | |||||
allow_rename = autoname && autoname.toLowerCase()==='prompt'; | |||||
if(!frappe.get_meta(me.doctype).allow_rename) allow_rename = false; | |||||
} | } | ||||
return !node.is_root && me.can_write && allow_rename; | return !node.is_root && me.can_write && allow_rename; | ||||
}, | }, | ||||
@@ -10,6 +10,13 @@ | |||||
{{ render_image(df, doc) }} | {{ render_image(df, doc) }} | ||||
{%- elif df.fieldtype=="Geolocation" -%} | {%- elif df.fieldtype=="Geolocation" -%} | ||||
{{ render_geolocation(df, doc) }} | {{ render_geolocation(df, doc) }} | ||||
{%- elif df.fieldtype=="Currency" -%} | |||||
{%- if doc.print_templates and | |||||
doc.print_templates.get(df.fieldname) -%} | |||||
{% include doc.print_templates[df.fieldname] %} | |||||
{%- else -%} | |||||
{{ render_field_with_label(df, doc) }} | |||||
{%- endif -%} | |||||
{%- else -%} | {%- else -%} | ||||
{{ render_field_with_label(df, doc) }} | {{ render_field_with_label(df, doc) }} | ||||
{%- endif -%} | {%- endif -%} | ||||
@@ -185,12 +185,12 @@ class NestedSet(Document): | |||||
update_nsm(self) | update_nsm(self) | ||||
self.validate_ledger() | self.validate_ledger() | ||||
def on_trash(self): | |||||
def on_trash(self, allow_root_deletion=False): | |||||
if not getattr(self, 'nsm_parent_field', None): | if not getattr(self, 'nsm_parent_field', None): | ||||
self.nsm_parent_field = frappe.scrub(self.doctype) + "_parent" | self.nsm_parent_field = frappe.scrub(self.doctype) + "_parent" | ||||
parent = self.get(self.nsm_parent_field) | parent = self.get(self.nsm_parent_field) | ||||
if not parent: | |||||
if not parent and not allow_root_deletion: | |||||
frappe.throw(_("Root {0} cannot be deleted").format(_(self.doctype))) | frappe.throw(_("Root {0} cannot be deleted").format(_(self.doctype))) | ||||
# cannot delete non-empty group | # cannot delete non-empty group | ||||