diff --git a/CLAUDE.md b/CLAUDE.md index 1ea80e5..e9bafd0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -72,7 +72,9 @@ Key for every link = `link_type::link_to` (Type ∈ DocType/Report/Page). produce hide/block sets cached on `frappe.local`; `_raw_workspaces()` + `added_links()`/`order_map()`/`apply_order()` are the structural (always-on) overlay. `is_enforcing()`: production → always; design machine → `not is_editing()` - (Redis key `jey_layout_editing`). Tolerates missing refs. + (Redis key `jey_layout_editing`). `is_design_mode()` defaults to ON exactly when + the `jey_layout` app is installed (test machines); `jey_design_mode` in + site_config overrides (0/1). Tolerates missing refs. - `desk_overrides.py` — wraps `get_workspace_sidebar_items`/`get_desktop_page` via `override_whitelisted_methods`. `get_desktop_page` does inject → reorder (always) → hide/block filter (only when enforcing). `_build_link_item` shapes an injected diff --git a/jey_theme/desk_layout.py b/jey_theme/desk_layout.py index cced9d1..4fc82c9 100644 --- a/jey_theme/desk_layout.py +++ b/jey_theme/desk_layout.py @@ -58,7 +58,22 @@ def link_key(link_type: str, link_to: str) -> str: # Mode helpers # --------------------------------------------------------------------------- def is_design_mode() -> bool: - return bool(frappe.conf.get("jey_design_mode")) + """Design machines run the editor; production just enforces the snapshot. + + Default: ON exactly when the `jey_layout` editor app is installed (it's only + installed on test/design machines). An explicit `jey_design_mode` in + site_config overrides this either way (set 0 to force off, 1 to force on).""" + override = frappe.conf.get("jey_design_mode") + if override is not None: + return bool(override) + cached = getattr(frappe.local, "_jey_design_mode", None) + if cached is None: + try: + cached = "jey_layout" in frappe.get_installed_apps() + except Exception: + cached = False + frappe.local._jey_design_mode = cached + return cached def is_editing() -> bool: