from dataclasses import dataclass from typing import Optional from app import route_prefix @dataclass class PageMeta: module_name: str _id: Optional[str] = None _name: Optional[str] = None _path: Optional[str] = None @property def id_(self) -> str: if not self._id: # Split the module name and get the last part parts = self.module_name.split(".") if len(parts) < 2: raise ValueError(f"Invalid module name: {self.module_name}") self._id = parts[1] return self._id @property def name(self) -> str: if not self._name: self._name = self.id_.replace("_", " ").capitalize() return self._name @property def path(self) -> str: if not self._path: self._path = route_prefix + self.id_ return self._path @classmethod def from_module(cls, module_name: str = __name__) -> 'PageMeta': return cls(module_name=module_name) class BasePage: @staticmethod def create(module_name: str, layout): # Create PageMeta for the page page_meta = PageMeta.from_module(module_name) # Create and return the page (e.g., as a Flask Blueprint) page = { "meta": page_meta, "layout": layout, } return page