pybragerone.models.menu

Menu models with validation and automatic prefix cleanup.

This module provides Pydantic models for BragerOne menu structure with automatic cleanup of prefixes (A.*, e.*, a.*) and normalization of parameters.

Classes

MenuMeta(**data)

Menu route metadata with automatic cleanup.

MenuParameter(**data)

Single parameter in a menu route with automatic cleanup.

MenuParameters(**data)

Collection of parameters organized by type (read/write/status/special).

MenuResult(**data)

Complete menu result with validation and statistics.

MenuRoute(**data)

Single menu route with automatic cleanup and validation.

class pybragerone.models.menu.MenuMeta(**data: Any)[source]

Bases: BaseModel

Menu route metadata with automatic cleanup.

Parameters:
classmethod clean_icon(v: Any)[source]

Remove build prefix from icons (commonly ‘a.’).

Return type:

str | None

Parameters:

v (Any)

display_dropdown: str | None
display_name: str
icon: str | None
is_visible_on_side_menu: bool | None
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

classmethod normalize_fields(data: Any)[source]

Normalize permission and icon fields.

Return type:

Any

Parameters:

data (Any)

parameters: MenuParameters
permission: Permission | None
raw_icon: str | None
raw_permission: str | None
store_raw_values()[source]

Store raw values for reference.

Return type:

MenuMeta

class pybragerone.models.menu.MenuParameter(**data: Any)[source]

Bases: BaseModel

Single parameter in a menu route with automatic cleanup.

Automatically extracts token from parameter expressions like: - e(E.WRITE,”PARAM_123”) → “PARAM_123” - E(A.READ,”TEMP_SENSOR”) → “TEMP_SENSOR”

And normalizes permissions by removing detected prefixes: - A.DISPLAY_PARAMETER_LEVEL_1 → DISPLAY_PARAMETER_LEVEL_1 - e.HeaterManagement → HeaterManagement - a.DISPLAY_MENU_DHW → DISPLAY_MENU_DHW

Parameters:
PARAM_REGEX: ClassVar[Pattern[str]] = re.compile('\\b[A-Za-z_$][\\w$]*\\([^,]*?,\\s*[\'\\"]([^\'\\"]+)[\'\\"]\\)')
PREFIX_RE: ClassVar[Pattern[str]] = re.compile('^(?P<prefix>[A-Za-z]{1,3})\\.(?P<rest>.+)$')
classmethod extract_fields(data: Any)[source]

Extract token from parameter and normalize permission.

Return type:

Any

Parameters:

data (Any)

model_config: ClassVar[ConfigDict] = {'extra': 'allow'}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

classmethod normalize_permission(v: Any)[source]

Normalize permission by removing common prefixes.

Return type:

Permission | None

Parameters:

v (Any)

permission: Permission | None
raw_parameter: str
raw_permission: str | None
token: str
validate_token_extracted()[source]

Ensure token was successfully extracted.

Return type:

MenuParameter

class pybragerone.models.menu.MenuParameters(**data: Any)[source]

Bases: BaseModel

Collection of parameters organized by type (read/write/status/special).

Parameters:
all_permissions()[source]

Get all unique permissions from all parameters.

Return type:

set[Permission]

all_tokens()[source]

Get all unique tokens from all parameter sections.

Return type:

set[str]

model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

read: list[MenuParameter]
special: list[MenuParameter]
status: list[MenuParameter]
write: list[MenuParameter]
class pybragerone.models.menu.MenuResult(**data: Any)[source]

Bases: BaseModel

Complete menu result with validation and statistics.

Parameters:
all_permissions()[source]

Get all unique permissions from all routes.

Return type:

set[Permission]

all_tokens()[source]

Get all unique tokens from all routes.

Return type:

set[str]

asset_url: str | None
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

route_count()[source]

Get total number of routes (including nested).

Return type:

int

routes: list[MenuRoute]
routes_by_path()[source]

Get flat mapping of path -> route for easy lookup.

Return type:

dict[str, MenuRoute]

token_count()[source]

Get total number of unique tokens.

Return type:

int

class pybragerone.models.menu.MenuRoute(**data: Any)[source]

Bases: BaseModel

Single menu route with automatic cleanup and validation.

Parameters:
all_permissions()[source]

Get all permissions from this route and its children recursively.

Return type:

set[Permission]

all_tokens()[source]

Get all tokens from this route and its children recursively.

Return type:

set[str]

children: list[MenuRoute]
component: str | None
meta: MenuMeta | None
model_config: ClassVar[ConfigDict] = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

name: str
parameters: MenuParameters
path: str