from __future__ import annotations from typing import Any MENU_FIELDS = ( "parentId", "name", "type", "path", "componentKey", "permissionCode", "icon", "sortOrder", "isVisible", "isActive", ) def _clean_optional(value: Any) -> Any: if isinstance(value, str): return value.strip() or None return value def normalize_menu_values(values: dict[str, Any], *, partial: bool = False) -> dict[str, Any]: """Normalize menu form values and enforce type-specific fields.""" normalized = dict(values) for field in ("parentId", "name", "path", "componentKey", "permissionCode", "icon"): if field in normalized: normalized[field] = _clean_optional(normalized[field]) if "name" in normalized and not normalized["name"]: raise ValueError("菜单名称不能为空") if partial or "type" not in normalized: return normalized menu_type = normalized["type"] if menu_type == "button": if not normalized.get("permissionCode"): raise ValueError("按钮菜单必须填写权限标识") if normalized.get("path") or normalized.get("componentKey"): raise ValueError("按钮菜单不能填写路由地址或组件路径") normalized["icon"] = None else: if not normalized.get("path"): raise ValueError("目录或页面必须填写路由地址") if menu_type == "page" and not normalized.get("componentKey"): raise ValueError("页面菜单必须填写组件路径") if menu_type == "directory": normalized["permissionCode"] = None return normalized