diff --git a/jey_theme/desk_overrides.py b/jey_theme/desk_overrides.py index 2ab40d2..ef41bd4 100644 --- a/jey_theme/desk_overrides.py +++ b/jey_theme/desk_overrides.py @@ -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: