fix: resolve desk originals defensively (Frappe version compat)

get_workspace_sidebar_items doesn't exist in every Frappe version (e.g. v14); the
hard 'from frappe.desk.desktop import ...' raised ImportError and broke the whole
desk_overrides module, taking the get_desktop_page override down with it
('Failed to get method ... cannot import name get_workspace_sidebar_items').
Resolve both originals via getattr(None) and guard the wrappers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ali 2026-06-19 09:02:29 +00:00
parent d7af667d6e
commit acb1010324
1 changed files with 13 additions and 4 deletions

View File

@ -7,6 +7,11 @@ browser, so there is no flash of soon-to-be-hidden items.
Importing the originals by module path bypasses the override map and always
yields Frappe's real implementation.
NOTE: resolve the originals defensively with getattr `get_workspace_sidebar_items`
does not exist in every Frappe version (e.g. v14). A hard `from ... import` would
raise ImportError and break the WHOLE module, taking the get_desktop_page override
down with it.
"""
import json
@ -14,13 +19,13 @@ import json
import frappe
from frappe import _
from frappe.desk.desktop import (
get_desktop_page as _orig_get_desktop_page,
get_workspace_sidebar_items as _orig_get_workspace_sidebar_items,
)
from frappe.desk import desktop as _desktop
from jey_theme import desk_layout
_orig_get_desktop_page = getattr(_desktop, "get_desktop_page", None)
_orig_get_workspace_sidebar_items = getattr(_desktop, "get_workspace_sidebar_items", None)
def _log(message):
try:
@ -31,6 +36,8 @@ def _log(message):
@frappe.whitelist()
def get_workspace_sidebar_items():
if _orig_get_workspace_sidebar_items is None:
return {"pages": []} # method absent on this Frappe version; dead path
result = _orig_get_workspace_sidebar_items()
# Filtering must never break the desk: on any error, return the original.
try:
@ -157,6 +164,8 @@ def _filter_hide_block(ws_name, items) -> list:
@frappe.whitelist()
def get_desktop_page(page):
if _orig_get_desktop_page is None:
return {} # method absent on this Frappe version; dead path
result = _orig_get_desktop_page(page)
# Transforms must never break the desk: on any error, return the original.
try: