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 Importing the originals by module path bypasses the override map and always
yields Frappe's real implementation. 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 import json
@ -14,13 +19,13 @@ import json
import frappe import frappe
from frappe import _ from frappe import _
from frappe.desk.desktop import ( from frappe.desk import desktop as _desktop
get_desktop_page as _orig_get_desktop_page,
get_workspace_sidebar_items as _orig_get_workspace_sidebar_items,
)
from jey_theme import desk_layout 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): def _log(message):
try: try:
@ -31,6 +36,8 @@ def _log(message):
@frappe.whitelist() @frappe.whitelist()
def get_workspace_sidebar_items(): 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() result = _orig_get_workspace_sidebar_items()
# Filtering must never break the desk: on any error, return the original. # Filtering must never break the desk: on any error, return the original.
try: try:
@ -157,6 +164,8 @@ def _filter_hide_block(ws_name, items) -> list:
@frappe.whitelist() @frappe.whitelist()
def get_desktop_page(page): 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) result = _orig_get_desktop_page(page)
# Transforms must never break the desk: on any error, return the original. # Transforms must never break the desk: on any error, return the original.
try: try: