chore: clean desktop icon controller

This commit is contained in:
sokumon 2025-12-18 14:11:33 +05:30
parent c92a23d958
commit 709169a538
3 changed files with 0 additions and 457 deletions

View file

@ -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()

View file

@ -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

View file

@ -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,
)