From 895ca9a30b996ec3546525db3690714cc126dff8 Mon Sep 17 00:00:00 2001 From: Akhil Narang Date: Thu, 19 Sep 2024 17:48:30 +0530 Subject: [PATCH] refactor: make desk settings user specific Signed-off-by: Akhil Narang --- frappe/boot.py | 11 +-- .../v13_set_default_desk_properties.py | 2 +- frappe/core/doctype/role/role.json | 78 +------------------ frappe/core/doctype/role/role.py | 23 ------ frappe/core/doctype/user/user.json | 76 +++++++++++++++++- frappe/core/doctype/user/user.py | 27 ++++++- 6 files changed, 106 insertions(+), 111 deletions(-) diff --git a/frappe/boot.py b/frappe/boot.py index 0910516220..da4d83d798 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -437,16 +437,9 @@ def add_layouts(bootinfo): def get_desk_settings(): - role_list = frappe.get_all("Role", fields=["*"], filters=dict(name=["in", frappe.get_roles()])) - desk_settings = {} + from frappe.core.doctype.user.user import desk_properties - from frappe.core.doctype.role.role import desk_properties - - for role in role_list: - for key in desk_properties: - desk_settings[key] = desk_settings.get(key) or role.get(key) - - return desk_settings + return frappe.get_value("User", frappe.session.user, desk_properties, as_dict=True) def get_notification_settings(): diff --git a/frappe/core/doctype/role/patches/v13_set_default_desk_properties.py b/frappe/core/doctype/role/patches/v13_set_default_desk_properties.py index 22854fa5f8..62dc148023 100644 --- a/frappe/core/doctype/role/patches/v13_set_default_desk_properties.py +++ b/frappe/core/doctype/role/patches/v13_set_default_desk_properties.py @@ -1,6 +1,6 @@ import frappe -from ..role import desk_properties +from ...user.user import desk_properties def execute(): diff --git a/frappe/core/doctype/role/role.json b/frappe/core/doctype/role/role.json index c5fde3e5e0..02c904bfb0 100644 --- a/frappe/core/doctype/role/role.json +++ b/frappe/core/doctype/role/role.json @@ -14,18 +14,7 @@ "disabled", "is_custom", "desk_access", - "two_factor_auth", - "navigation_settings_section", - "search_bar", - "notifications", - "list_settings_section", - "list_sidebar", - "bulk_actions", - "view_switcher", - "form_settings_section", - "form_sidebar", - "timeline", - "dashboard" + "two_factor_auth" ], "fields": [ { @@ -73,69 +62,6 @@ "fieldname": "column_break_4", "fieldtype": "Column Break" }, - { - "fieldname": "navigation_settings_section", - "fieldtype": "Section Break", - "label": "Navigation Settings" - }, - { - "default": "1", - "fieldname": "search_bar", - "fieldtype": "Check", - "label": "Search Bar" - }, - { - "fieldname": "list_settings_section", - "fieldtype": "Section Break", - "label": "List Settings" - }, - { - "default": "1", - "fieldname": "list_sidebar", - "fieldtype": "Check", - "label": "Sidebar" - }, - { - "default": "1", - "fieldname": "bulk_actions", - "fieldtype": "Check", - "label": "Bulk Actions" - }, - { - "fieldname": "form_settings_section", - "fieldtype": "Section Break", - "label": "Form Settings" - }, - { - "default": "1", - "fieldname": "form_sidebar", - "fieldtype": "Check", - "label": "Sidebar" - }, - { - "default": "1", - "fieldname": "timeline", - "fieldtype": "Check", - "label": "Timeline" - }, - { - "default": "1", - "fieldname": "dashboard", - "fieldtype": "Check", - "label": "Dashboard" - }, - { - "default": "1", - "fieldname": "view_switcher", - "fieldtype": "Check", - "label": "View Switcher" - }, - { - "default": "1", - "fieldname": "notifications", - "fieldtype": "Check", - "label": "Notifications" - }, { "default": "0", "fieldname": "is_custom", @@ -148,7 +74,7 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2024-03-23 16:03:36.854123", + "modified": "2024-09-19 17:07:08.672124", "modified_by": "Administrator", "module": "Core", "name": "Role", diff --git a/frappe/core/doctype/role/role.py b/frappe/core/doctype/role/role.py index 4539093fc9..d4c4435769 100644 --- a/frappe/core/doctype/role/role.py +++ b/frappe/core/doctype/role/role.py @@ -4,17 +4,6 @@ import frappe from frappe.model.document import Document from frappe.website.path_resolver import validate_path - -desk_properties = ( - "search_bar", - "notifications", - "list_sidebar", - "bulk_actions", - "view_switcher", - "form_sidebar", - "timeline", - "dashboard", -) from frappe.website.router import clear_routing_cache STANDARD_ROLES = ("Administrator", "System Manager", "Script Manager", "All", "Guest") @@ -29,21 +18,13 @@ class Role(Document): if TYPE_CHECKING: from frappe.types import DF - bulk_actions: DF.Check - dashboard: DF.Check desk_access: DF.Check disabled: DF.Check - form_sidebar: DF.Check home_page: DF.Data | None is_custom: DF.Check - list_sidebar: DF.Check - notifications: DF.Check restrict_to_domain: DF.Link | None role_name: DF.Data - search_bar: DF.Check - timeline: DF.Check two_factor_auth: DF.Check - view_switcher: DF.Check # end: auto-generated types def before_rename(self, old, new, merge=False): @@ -78,10 +59,6 @@ class Role(Document): if self.name == "Guest": self.desk_access = 0 - if not self.desk_access: - for key in desk_properties: - self.set(key, 0) - def remove_roles(self): frappe.db.delete("Has Role", {"role": self.name}) frappe.clear_cache() diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index fb0ce9c96d..49887a23e2 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -50,6 +50,17 @@ "desk_theme", "code_editor_type", "banner_image", + "navigation_settings_section", + "search_bar", + "notifications", + "list_settings_section", + "list_sidebar", + "bulk_actions", + "view_switcher", + "form_settings_section", + "form_sidebar", + "timeline", + "dashboard", "change_password", "new_password", "logout_all_sessions", @@ -748,6 +759,69 @@ "fieldname": "default_app", "fieldtype": "Select", "label": "Default App" + }, + { + "fieldname": "navigation_settings_section", + "fieldtype": "Section Break", + "label": "Navigation Settings" + }, + { + "default": "1", + "fieldname": "search_bar", + "fieldtype": "Check", + "label": "Search Bar" + }, + { + "default": "1", + "fieldname": "notifications", + "fieldtype": "Check", + "label": "Notifications" + }, + { + "fieldname": "list_settings_section", + "fieldtype": "Section Break", + "label": "List Settings" + }, + { + "default": "1", + "fieldname": "list_sidebar", + "fieldtype": "Check", + "label": "Sidebar" + }, + { + "default": "1", + "fieldname": "bulk_actions", + "fieldtype": "Check", + "label": "Bulk Actions" + }, + { + "default": "1", + "fieldname": "view_switcher", + "fieldtype": "Check", + "label": "View Switcher" + }, + { + "fieldname": "form_settings_section", + "fieldtype": "Section Break", + "label": "Form Settings" + }, + { + "default": "1", + "fieldname": "form_sidebar", + "fieldtype": "Check", + "label": "Sidebar" + }, + { + "default": "1", + "fieldname": "timeline", + "fieldtype": "Check", + "label": "Timeline" + }, + { + "default": "1", + "fieldname": "dashboard", + "fieldtype": "Check", + "label": "Dashboard" } ], "icon": "fa fa-user", @@ -810,7 +884,7 @@ "link_fieldname": "user" } ], - "modified": "2024-08-13 14:48:15.168516", + "modified": "2024-09-19 17:06:42.161178", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index a1f0b05ed2..71f4a2f661 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -1,7 +1,6 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE -import json from collections.abc import Iterable from datetime import timedelta @@ -39,6 +38,17 @@ from frappe.utils.password import update_password as _update_password from frappe.utils.user import get_system_managers from frappe.website.utils import get_home_page, is_signup_disabled +desk_properties = ( + "search_bar", + "notifications", + "list_sidebar", + "bulk_actions", + "view_switcher", + "form_sidebar", + "timeline", + "dashboard", +) + class User(Document): # begin: auto-generated types @@ -62,8 +72,10 @@ class User(Document): bio: DF.SmallText | None birth_date: DF.Date | None block_modules: DF.Table[BlockModule] + bulk_actions: DF.Check bypass_restrict_ip_check_if_2fa_enabled: DF.Check code_editor_type: DF.Literal["vscode", "vim", "emacs"] + dashboard: DF.Check default_app: DF.Literal[None] default_workspace: DF.Link | None defaults: DF.Table[DefaultValue] @@ -79,6 +91,7 @@ class User(Document): follow_created_documents: DF.Check follow_liked_documents: DF.Check follow_shared_documents: DF.Check + form_sidebar: DF.Check full_name: DF.Data | None gender: DF.Link | None home_settings: DF.Code | None @@ -91,6 +104,7 @@ class User(Document): last_name: DF.Data | None last_password_reset_date: DF.Date | None last_reset_password_key_generated_on: DF.Datetime | None + list_sidebar: DF.Check location: DF.Data | None login_after: DF.Int login_before: DF.Int @@ -100,6 +114,7 @@ class User(Document): module_profile: DF.Link | None mute_sounds: DF.Check new_password: DF.Password | None + notifications: DF.Check onboarding_status: DF.SmallText | None phone: DF.Data | None redirect_url: DF.SmallText | None @@ -108,17 +123,20 @@ class User(Document): role_profile_name: DF.Link | None role_profiles: DF.TableMultiSelect[UserRoleProfile] roles: DF.Table[HasRole] + search_bar: DF.Check send_me_a_copy: DF.Check send_welcome_email: DF.Check simultaneous_sessions: DF.Int social_logins: DF.Table[UserSocialLogin] thread_notify: DF.Check time_zone: DF.Autocomplete | None + timeline: DF.Check unsubscribed: DF.Check user_emails: DF.Table[UserEmail] user_image: DF.AttachImage | None user_type: DF.Link | None username: DF.Data | None + view_switcher: DF.Check # end: auto-generated types __new_password = None @@ -178,6 +196,8 @@ class User(Document): self.validate_allowed_modules() self.validate_user_image() self.set_time_zone() + self.set_desk_properties() + if self.language == "Loading...": self.language = None @@ -793,6 +813,11 @@ class User(Document): }, ) + def set_desk_properties(self): + if self.user_type == "Website User": + for key in desk_properties: + self.set(key, 0) + @frappe.whitelist() def get_timezones():