From 709169a538011217d9bdc25251ce1cd5f43afaf5 Mon Sep 17 00:00:00 2001 From: sokumon Date: Thu, 18 Dec 2025 14:11:33 +0530 Subject: [PATCH] chore: clean desktop icon controller --- .../desk/doctype/desktop_icon/desktop_icon.py | 455 ------------------ frappe/model/sync.py | 1 - frappe/tests/test_domainification.py | 1 - 3 files changed, 457 deletions(-) diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index 5bdb4660da..16ecff4f45 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -114,13 +114,6 @@ class DesktopIcon(Document): clear_desktop_icons_cache() -def after_doctype_insert(): - pass - - -# frappe.db.add_unique("Desktop Icon", ("owner", "standard")) - - def get_workspace_names(workspaces): workspace_list = [] for w in workspaces["pages"]: @@ -246,442 +239,11 @@ def get_desktop_icons(user=None, bootinfo=None): return user_icons -@frappe.whitelist() -def add_user_icon(_doctype, _report=None, label=None, link=None, type="link", standard=0): - """Add a new user desktop icon to the desktop""" - - if not label: - label = _doctype or _report - if not link: - link = f"List/{_doctype}" - - # find if a standard icon exists - icon_name = frappe.db.exists( - "Desktop Icon", {"standard": standard, "link": link, "owner": frappe.session.user} - ) - - if icon_name: - if frappe.db.get_value("Desktop Icon", icon_name, "hidden"): - # if it is hidden, unhide it - frappe.db.set_value("Desktop Icon", icon_name, "hidden", 0) - clear_desktop_icons_cache() - - else: - idx = ( - frappe.db.sql("select max(idx) from `tabDesktop Icon` where owner=%s", frappe.session.user)[0][0] - or frappe.db.sql("select count(*) from `tabDesktop Icon` where standard=1")[0][0] - ) - - if not frappe.db.get_value("Report", _report): - _report = None - userdefined_icon = frappe.db.get_value( - "DocType", _doctype, ["icon", "color", "module"], as_dict=True - ) - else: - userdefined_icon = frappe.db.get_value( - "Report", _report, ["icon", "color", "module"], as_dict=True - ) - - module_icon = frappe.get_value( - "Desktop Icon", - {"standard": 1, "module_name": userdefined_icon.module}, - ["name", "icon", "color", "reverse"], - as_dict=True, - ) - - if not module_icon: - module_icon = frappe._dict() - opts = random.choice(palette) - module_icon.color = opts[0] - module_icon.reverse = 0 if (len(opts) > 1) else 1 - - try: - new_icon = frappe.get_doc( - { - "doctype": "Desktop Icon", - "label": label, - "module_name": label, - "link": link, - "type": type, - "_doctype": _doctype, - "_report": _report, - "icon": userdefined_icon.icon or module_icon.icon, - "color": userdefined_icon.color or module_icon.color, - "reverse": module_icon.reverse, - "idx": idx + 1, - "custom": 1, - "standard": standard, - } - ).insert(ignore_permissions=True) - clear_desktop_icons_cache() - - icon_name = new_icon.name - - except frappe.UniqueValidationError: - frappe.throw(_("Desktop Icon already exists")) - except Exception as e: - raise e - - return icon_name - - -@frappe.whitelist() -def set_order(new_order, user=None): - """set new order by duplicating user icons (if user is set) or set global order""" - if isinstance(new_order, str): - new_order = json.loads(new_order) - for i, module_name in enumerate(new_order): - if module_name not in ("Explore",): - if user: - icon = get_user_copy(module_name, user) - else: - name = frappe.db.get_value("Desktop Icon", {"standard": 1, "module_name": module_name}) - if name: - icon = frappe.get_doc("Desktop Icon", name) - else: - # standard icon missing, create one for DocType - name = add_user_icon(module_name, standard=1) - icon = frappe.get_doc("Desktop Icon", name) - - icon.db_set("idx", i) - - clear_desktop_icons_cache() - - -def set_desktop_icons(visible_list, ignore_duplicate=True): - """Resets all lists and makes only the given one standard, - if the desktop icon does not exist and the name is a DocType, then will create - an icon for the doctype""" - - # clear all custom only if setup is not complete - if not frappe.is_setup_complete(): - frappe.db.delete("Desktop Icon", {"standard": 0}) - - # set standard as blocked and hidden if setting first active domain - if not frappe.flags.keep_desktop_icons: - frappe.db.sql("update `tabDesktop Icon` set blocked=0, hidden=1 where standard=1") - - # set as visible if present, or add icon - for module_name in list(visible_list): - name = frappe.db.get_value("Desktop Icon", {"module_name": module_name}) - if name: - frappe.db.set_value("Desktop Icon", name, "hidden", 0) - else: - if frappe.db.exists("DocType", module_name): - try: - add_user_icon(module_name, standard=1) - except frappe.UniqueValidationError as e: - if not ignore_duplicate: - raise e - else: - visible_list.remove(module_name) - frappe.clear_last_message() - - # set the order - set_order(visible_list) - - clear_desktop_icons_cache() - - -def set_hidden_list(hidden_list, user=None): - """Sets property `hidden`=1 in **Desktop Icon** for given user. - If user is None then it will set global values. - It will also set the rest of the icons as shown (`hidden` = 0)""" - if isinstance(hidden_list, str): - hidden_list = json.loads(hidden_list) - - # set as hidden - for module_name in hidden_list: - set_hidden(module_name, user, 1) - - # set as seen - for module_name in list(set(get_all_icons()) - set(hidden_list)): - set_hidden(module_name, user, 0) - - if user: - clear_desktop_icons_cache() - else: - frappe.clear_cache() - - -def set_hidden(module_name, user=None, hidden=1): - """Set module hidden property for given user. If user is not specified, - hide/unhide it globally""" - if user: - icon = get_user_copy(module_name, user) - - if hidden and icon.custom: - frappe.delete_doc(icon.doctype, icon.name, ignore_permissions=True) - return - - # hidden by user - icon.db_set("hidden", hidden) - else: - icon = frappe.get_doc("Desktop Icon", {"standard": 1, "module_name": module_name}) - - # blocked is globally hidden - icon.db_set("blocked", hidden) - - -def get_all_icons(): - return [ - d.module_name for d in frappe.get_all("Desktop Icon", filters={"standard": 1}, fields=["module_name"]) - ] - - def clear_desktop_icons_cache(user=None): frappe.cache.hdel("desktop_icons", user or frappe.session.user) frappe.cache.hdel("bootinfo", user or frappe.session.user) -def get_user_copy(module_name, user=None): - """Return user copy (Desktop Icon) of the given module_name. If user copy does not exist, create one. - - :param module_name: Name of the module - :param user: User for which the copy is required (optional) - """ - if not user: - user = frappe.session.user - - desktop_icon_name = frappe.db.get_value( - "Desktop Icon", {"module_name": module_name, "owner": user, "standard": 0} - ) - - if desktop_icon_name: - return frappe.get_doc("Desktop Icon", desktop_icon_name) - else: - return make_user_copy(module_name, user) - - -def make_user_copy(module_name, user): - """Insert and return the user copy of a standard Desktop Icon""" - standard_name = frappe.db.get_value("Desktop Icon", {"module_name": module_name, "standard": 1}) - - if not standard_name: - frappe.throw(_("{0} not found").format(module_name), frappe.DoesNotExistError) - - original = frappe.get_doc("Desktop Icon", standard_name) - - desktop_icon = frappe.get_doc( - {"doctype": "Desktop Icon", "standard": 0, "owner": user, "module_name": module_name} - ) - - for key in ( - "app", - "label", - "route", - "type", - "_doctype", - "idx", - "reverse", - "force_show", - "link", - "icon", - "color", - ): - if original.get(key): - desktop_icon.set(key, original.get(key)) - - desktop_icon.insert(ignore_permissions=True) - - return desktop_icon - - -def sync_desktop_icons(): - """Sync desktop icons from all apps""" - for app in frappe.get_installed_apps(): - sync_icons(app) - # sync_from_app(app) - - -def sync_icons(app_name): - icon_directory = get_app_level_directory_path("desktop_icon", app_name) - if os.path.exists(icon_directory): - icon_files = [os.path.join(icon_directory, filename) for filename in os.listdir(icon_directory)] - for doc_path in icon_files: - imported = import_file_by_path(doc_path) - if imported: - frappe.db.commit(chain=True) - # print(icon_directory) - - -def sync_from_app(app): - """Sync desktop icons from app. To be called during install""" - try: - modules = frappe.get_attr(app + ".config.desktop.get_data")() or {} - except ImportError: - return [] - - if isinstance(modules, dict): - modules_list = [] - for m, desktop_icon in modules.items(): - desktop_icon["module_name"] = m - modules_list.append(desktop_icon) - else: - modules_list = modules - - for i, m in enumerate(modules_list): - desktop_icon_name = frappe.db.get_value( - "Desktop Icon", {"module_name": m["module_name"], "app": app, "standard": 1} - ) - if desktop_icon_name: - desktop_icon = frappe.get_doc("Desktop Icon", desktop_icon_name) - else: - # new icon - desktop_icon = frappe.get_doc( - {"doctype": "Desktop Icon", "idx": i, "standard": 1, "app": app, "owner": "Administrator"} - ) - - if "doctype" in m: - m["_doctype"] = m.pop("doctype") - - desktop_icon.update(m) - try: - desktop_icon.save() - except frappe.exceptions.UniqueValidationError: - pass - - return modules_list - - -@frappe.whitelist() -def update_icons(hidden_list, user=None): - """update modules""" - if not user: - frappe.only_for("System Manager") - - set_hidden_list(hidden_list, user) - frappe.msgprint(frappe._("Updated"), indicator="green", title=_("Success"), alert=True) - - -def get_context(context): - context.icons = get_user_icons(frappe.session.user) - context.user = frappe.session.user - - if "System Manager" in frappe.get_roles(): - context.users = frappe.get_all( - "User", - filters={"user_type": "System User", "enabled": 1}, - fields=["name", "first_name", "last_name"], - ) - - -@frappe.whitelist() -def get_module_icons(user=None): - if user != frappe.session.user: - frappe.only_for("System Manager") - - if not user: - icons = frappe.get_all("Desktop Icon", fields="*", filters={"standard": 1}, order_by="idx") - else: - frappe.cache.hdel("desktop_icons", user) - icons = get_user_icons(user) - - for icon in icons: - icon.value = frappe.db.escape(_(icon.label or icon.module_name)) - - return {"icons": icons, "user": user} - - -def get_user_icons(user): - """Get user icons for module setup page""" - from frappe.utils.user import UserPermissions - - user_perms = UserPermissions(user) - user_perms.build_permissions() - - from frappe.boot import get_allowed_pages - - allowed_pages = get_allowed_pages() - - icons = [] - for icon in get_desktop_icons(user): - add = True - if icon.hidden_in_standard: - add = False - - if not icon.custom: - if icon.module_name == ["Help", "Settings"]: - pass - - elif icon.link_type == "page" and icon.link not in allowed_pages: - add = False - - elif icon.link_type == "module" and icon.module_name not in user_perms.allow_modules: - add = False - - if add: - icons.append(icon) - - return icons - - -palette = ( - ("#FFC4C4",), - ("#FFE8CD",), - ("#FFD2C2",), - ("#FF8989",), - ("#FFD19C",), - ("#FFA685",), - ("#FF4D4D", 1), - ("#FFB868",), - ("#FF7846", 1), - ("#A83333", 1), - ("#A87945", 1), - ("#A84F2E", 1), - ("#D2D2FF",), - ("#F8D4F8",), - ("#DAC7FF",), - ("#A3A3FF",), - ("#F3AAF0",), - ("#B592FF",), - ("#7575FF", 1), - ("#EC7DEA", 1), - ("#8E58FF", 1), - ("#4D4DA8", 1), - ("#934F92", 1), - ("#5E3AA8", 1), - ("#EBF8CC",), - ("#FFD7D7",), - ("#D2F8ED",), - ("#D9F399",), - ("#FFB1B1",), - ("#A4F3DD",), - ("#C5EC63",), - ("#FF8989", 1), - ("#77ECCA",), - ("#7B933D", 1), - ("#A85B5B", 1), - ("#49937E", 1), - ("#FFFACD",), - ("#D2F1FF",), - ("#CEF6D1",), - ("#FFF69C",), - ("#A6E4FF",), - ("#9DECA2",), - ("#FFF168",), - ("#78D6FF",), - ("#6BE273",), - ("#A89F45", 1), - ("#4F8EA8", 1), - ("#428B46", 1), -) - - -@frappe.whitelist() -def hide(name, user=None): - if not user: - user = frappe.session.user - - try: - set_hidden(name, user, hidden=1) - clear_desktop_icons_cache() - except Exception: - return False - - return True - - def create_desktop_icons_from_workspace(): workspaces = frappe.get_all( "Workspace", @@ -729,11 +291,6 @@ def create_desktop_icons_from_workspace(): frappe.error_log(title="Creation of Desktop Icon Failed", message=e) -def generate_color(): - colors = ["orange", "pink", "blue", "green", "dark", "red", "yellow", "purple", "gray"] - return random.choice(colors) - - def create_desktop_icons_from_installed_apps(): apps = frappe.get_installed_apps() index = 0 @@ -756,18 +313,6 @@ def create_desktop_icons_from_installed_apps(): index += 1 -@frappe.whitelist() -def set_sequence(desktop_icons): - cnt = 1 - for item in json.loads(desktop_icons): - frappe.db.set_value("Workspace", item.get("name"), "sequence_id", cnt) - frappe.db.set_value("Workspace", item.get("name"), "parent_page", item.get("parent") or "") - cnt += 1 - - frappe.clear_cache() - frappe.toast(frappe._("Updated")) - - def create_desktop_icons(): create_desktop_icons_from_installed_apps() create_desktop_icons_from_workspace() diff --git a/frappe/model/sync.py b/frappe/model/sync.py index 61c4d0f0f3..19568ca8e4 100644 --- a/frappe/model/sync.py +++ b/frappe/model/sync.py @@ -10,7 +10,6 @@ import re import frappe from frappe.cache_manager import clear_controller_cache -from frappe.desk.doctype.desktop_icon.desktop_icon import sync_desktop_icons from frappe.model.base_document import get_controller from frappe.modules.import_file import import_file_by_path from frappe.modules.patch_handler import _patch_mode diff --git a/frappe/tests/test_domainification.py b/frappe/tests/test_domainification.py index 35add448ec..04e3dc1c15 100644 --- a/frappe/tests/test_domainification.py +++ b/frappe/tests/test_domainification.py @@ -4,7 +4,6 @@ import frappe from frappe.core.doctype.domain_settings.domain_settings import get_active_modules from frappe.core.page.permission_manager.permission_manager import get_roles_and_doctypes from frappe.desk.doctype.desktop_icon.desktop_icon import ( - add_user_icon, clear_desktop_icons_cache, get_desktop_icons, )