diff --git a/frappe/__init__.py b/frappe/__init__.py
index 0ec4b4bed6..4815a2de6b 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.2.15'
+__version__ = '9.2.16'
__title__ = "Frappe Framework"
local = Local()
diff --git a/frappe/core/page/modules_setup/includes/module_icons.html b/frappe/core/page/modules_setup/includes/module_icons.html
index 12a23feecc..f388bbc97d 100644
--- a/frappe/core/page/modules_setup/includes/module_icons.html
+++ b/frappe/core/page/modules_setup/includes/module_icons.html
@@ -5,7 +5,7 @@
diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py
index 8d6587b1bc..4428760a32 100644
--- a/frappe/model/delete_doc.py
+++ b/frappe/model/delete_doc.py
@@ -197,9 +197,11 @@ def check_if_doc_is_linked(doc, method="Delete"):
# raise exception only if
# linked to an non-cancelled doc when deleting
# or linked to a submitted doc when cancelling
- frappe.throw(_('Cannot delete or cancel because {0} {1} is linked with {2} {3}')
- .format(doc.doctype, doc.name, linked_doctype,
- item.parent or item.name), frappe.LinkExistsError)
+ reference_docname = item.parent or item.name
+ raise_link_exists_exception(doc, linked_doctype, reference_docname)
+ else:
+ if frappe.db.get_value(link_dt, None, link_field) == doc.name:
+ raise_link_exists_exception(doc, link_dt, link_dt)
def check_if_doc_is_dynamically_linked(doc, method="Delete"):
'''Raise `frappe.LinkExistsError` if the document is dynamically linked'''
@@ -220,8 +222,7 @@ def check_if_doc_is_dynamically_linked(doc, method="Delete"):
# raise exception only if
# linked to an non-cancelled doc when deleting
# or linked to a submitted doc when cancelling
- frappe.throw(_('Cannot delete or cancel because {0} {1} is linked with {2} {3}').format(doc.doctype,
- doc.name, df.parent, ""), frappe.LinkExistsError)
+ raise_link_exists_exception(doc, df.parent, df.parent)
else:
# dynamic link in table
df["table"] = ", parent, parenttype, idx" if meta.istable else ""
@@ -232,9 +233,23 @@ def check_if_doc_is_dynamically_linked(doc, method="Delete"):
# raise exception only if
# linked to an non-cancelled doc when deleting
# or linked to a submitted doc when cancelling
- frappe.throw(_('Cannot delete or cancel because {0} {1} is linked with {2} {3} {4}')\
- .format(doc.doctype, doc.name, refdoc.parenttype if meta.istable else df.parent,
- refdoc.parent if meta.istable else refdoc.name,"Row: {0}".format(refdoc.idx) if meta.istable else ""), frappe.LinkExistsError)
+
+ reference_doctype = refdoc.parenttype if meta.istable else df.parent
+ reference_docname = refdoc.parent if meta.istable else refdoc.name
+ at_position = "at Row: {0}".format(refdoc.idx) if meta.istable else ""
+
+ raise_link_exists_exception(doc, reference_doctype, reference_docname, at_position)
+
+def raise_link_exists_exception(doc, reference_doctype, reference_docname, row=''):
+ doc_link = '{1}'.format(doc.doctype, doc.name)
+ reference_link = '{1}'.format(reference_doctype, reference_docname)
+
+ #hack to display Single doctype only once in message
+ if reference_doctype == reference_docname:
+ reference_doctype = ''
+
+ frappe.throw(_('Cannot delete or cancel because {0} {1} is linked with {2} {3} {4}')
+ .format(doc.doctype, doc_link, reference_doctype, reference_link, row), frappe.LinkExistsError)
def delete_dynamic_links(doctype, name):
delete_doc("ToDo", frappe.db.sql_list("""select name from `tabToDo`
diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js
index 4e11f915c7..7d5ade67a9 100644
--- a/frappe/public/js/frappe/form/grid_row.js
+++ b/frappe/public/js/frappe/form/grid_row.js
@@ -308,7 +308,7 @@ frappe.ui.form.GridRow = Class.extend({
} else {
this.row.toggleClass('editable-row', false);
this.columns_list.forEach(function(column) {
- if (column.df.hidden == false) {
+ if (!column.df.hidden) {
column.static_area.toggle(true);
}
diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py
index b9fb9867ce..ce35a43788 100644
--- a/frappe/utils/jinja.py
+++ b/frappe/utils/jinja.py
@@ -153,6 +153,7 @@ def get_allowed_functions_for_jenv():
out['frappe']["db"] = {
"get_value": frappe.db.get_value,
"get_default": frappe.db.get_default,
+ "escape": frappe.db.escape,
}
return out
diff --git a/frappe/website/doctype/help_article/help_article.py b/frappe/website/doctype/help_article/help_article.py
index 9d302c89e0..6220d0aff5 100644
--- a/frappe/website/doctype/help_article/help_article.py
+++ b/frappe/website/doctype/help_article/help_article.py
@@ -41,7 +41,7 @@ class HelpArticle(WebsiteGenerator):
context.parents = self.get_parents(context)
def get_parents(self, context):
- return [{"title": context.category.category_name, "name":context.category.route}]
+ return [{"title": context.category.category_name, "route":context.category.route}]
def get_list_context(context=None):
filters = dict(published=1)