diff --git a/frappe/defaults.py b/frappe/defaults.py index fcfef0b2fc..edbf784200 100644 --- a/frappe/defaults.py +++ b/frappe/defaults.py @@ -25,9 +25,12 @@ def get_user_default(key, user=None): if d and isinstance(d, (list, tuple)) and len(d) == 1: # Use User Permission value when only when it has a single value d = d[0] - else: d = user_defaults.get(frappe.scrub(key), None) + user_permission_default = get_user_permission_default(key, user_defaults) + if not d: + # If no default value is found, use the User Permission value + d = user_permission_default value = isinstance(d, (list, tuple)) and d[0] or d if not_in_user_permission(key, value, user): @@ -36,6 +39,24 @@ def get_user_default(key, user=None): return value +def get_user_permission_default(key, defaults): + permissions = get_user_permissions() + user_default = "" + if permissions.get(key): + # global default in user permission + for item in permissions.get(key): + doc = item.get("doc") + if defaults.get(key) == doc: + user_default = doc + + for item in permissions.get(key): + if item.get("is_default"): + user_default = item.get("doc") + break + + return user_default + + def get_user_default_as_list(key, user=None): user_defaults = get_defaults(user or frappe.session.user) d = user_defaults.get(key, None) diff --git a/frappe/public/js/frappe/defaults.js b/frappe/public/js/frappe/defaults.js index 03258f4691..a96f6c3167 100644 --- a/frappe/public/js/frappe/defaults.js +++ b/frappe/public/js/frappe/defaults.js @@ -3,10 +3,14 @@ frappe.defaults = { get_user_default: function (key) { - var defaults = frappe.boot.user.defaults; - var d = defaults[key]; - if (!d && frappe.defaults.is_a_user_permission_key(key)) + let defaults = frappe.boot.user.defaults; + let d = defaults[key]; + if (!d && frappe.defaults.is_a_user_permission_key(key)) { d = defaults[frappe.model.scrub(key)]; + // Check for default user permission values + user_default = this.get_user_permission_default(key, defaults); + if (user_default) d = user_default; + } if ($.isArray(d)) d = d[0]; if (!frappe.defaults.in_user_permission(key, d)) { @@ -15,6 +19,27 @@ frappe.defaults = { return d; }, + + get_user_permission_default: function (key, defaults) { + let permissions = this.get_user_permissions(); + let user_default = null; + if (permissions[key]) { + permissions[key].forEach((item) => { + if (defaults[key] == item.doc) { + user_default = item.doc; + } + }); + + permissions[key].forEach((item) => { + if (item.is_default) { + user_default = item.doc; + } + }); + } + + return user_default; + }, + get_user_defaults: function (key) { var defaults = frappe.boot.user.defaults; var d = defaults[key]; diff --git a/frappe/tests/test_defaults.py b/frappe/tests/test_defaults.py index 3c04f16ec8..a8c8ed2697 100644 --- a/frappe/tests/test_defaults.py +++ b/frappe/tests/test_defaults.py @@ -1,7 +1,10 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE import frappe +from frappe.core.doctype.user_permission.test_user_permission import create_user from frappe.defaults import * +from frappe.query_builder.utils import db_type_is +from frappe.tests.test_query_builder import run_only_if from frappe.tests.utils import FrappeTestCase @@ -71,3 +74,39 @@ class TestDefaults(FrappeTestCase): frappe.delete_doc("User Permission", perm_doc.name) frappe.set_user(old_user) + + @run_only_if(db_type_is.MARIADB) + def test_user_permission_defaults(self): + # Create user permission + create_user("user_default_test@example.com", "Blogger") + frappe.set_user("user_default_test@example.com") + set_global_default("Country", "") + clear_user_default("Country") + + perm_doc = frappe.get_doc( + dict( + doctype="User Permission", + user=frappe.session.user, + allow="Country", + for_value="India", + ) + ).insert(ignore_permissions=True) + + frappe.db.set_value("User Permission", perm_doc.name, "is_default", 1) + set_global_default("Country", "United States") + self.assertEqual(get_user_default("Country"), "India") + + frappe.db.set_value("User Permission", perm_doc.name, "is_default", 0) + clear_user_default("Country") + self.assertEqual(get_user_default("Country"), None) + + perm_doc = frappe.get_doc( + dict( + doctype="User Permission", + user=frappe.session.user, + allow="Country", + for_value="United States", + ) + ).insert(ignore_permissions=True) + + self.assertEqual(get_user_default("Country"), "United States")