from typing import Any, Callable from babel.support import LazyProxy from dataclasses import dataclass, field from .role import RoleBase from . import EntityPermission EntityCaptionCallable = Callable[["EntityDescriptor"], str] EntityItemCaptionCallable = Callable[["EntityDescriptor", Any], str] EntityFieldCaptionCallable = Callable[["EntityFieldDescriptor", Any, Any], str] @dataclass(kw_only = True) class _BaseEntityFieldDescriptor(): icon: str = None caption_str: str | LazyProxy | EntityFieldCaptionCallable | None = None caption_btn: str | LazyProxy | EntityFieldCaptionCallable | None = None description: str | LazyProxy | EntityFieldCaptionCallable | None = None edit_prompt: str | LazyProxy | EntityFieldCaptionCallable | None = None caption_value_str: str | LazyProxy | EntityFieldCaptionCallable | None = None caption_value_btn: str | LazyProxy | EntityFieldCaptionCallable | None = None is_visible: bool = True localizable: bool = False bool_false_value: str | LazyProxy = "no" bool_false_value_btn: str | LazyProxy = "no" bool_true_value: str | LazyProxy = "yes" bool_true_value_btn: str | LazyProxy = "yes" default: Any = None @dataclass(kw_only = True) class EntityField(_BaseEntityFieldDescriptor): name: str | None = None sm_descriptor: Any = None @dataclass(kw_only = True) class Setting(_BaseEntityFieldDescriptor): name: str | None = None @dataclass(kw_only = True) class EntityFieldDescriptor(_BaseEntityFieldDescriptor): name: str field_name: str type_: type entity_descriptor: "EntityDescriptor" = None def __hash__(self): return self.name.__hash__() @dataclass(kw_only = True) class _BaseEntityDescriptor: icon: str = "📘" caption_msg: str | LazyProxy | EntityCaptionCallable | None = None caption_btn: str | LazyProxy | EntityCaptionCallable | None = None description: str | LazyProxy | EntityCaptionCallable | None = None item_caption_msg: EntityItemCaptionCallable | None = None item_caption_btn: EntityItemCaptionCallable | None = None show_in_entities_menu: bool = True field_sequence: list[str] = None edit_buttons: list[list[str]] = None permissions: dict[EntityPermission, list[RoleBase]] = field(default_factory = lambda: { EntityPermission.LIST: [RoleBase.DEFAULT_USER, RoleBase.SUPER_USER], EntityPermission.READ: [RoleBase.DEFAULT_USER, RoleBase.SUPER_USER], EntityPermission.CREATE: [RoleBase.DEFAULT_USER, RoleBase.SUPER_USER], EntityPermission.UPDATE: [RoleBase.DEFAULT_USER, RoleBase.SUPER_USER], EntityPermission.DELETE: [RoleBase.DEFAULT_USER, RoleBase.SUPER_USER], EntityPermission.LIST_ALL: [RoleBase.SUPER_USER], EntityPermission.READ_ALL: [RoleBase.SUPER_USER], EntityPermission.CREATE_ALL: [RoleBase.SUPER_USER], EntityPermission.UPDATE_ALL: [RoleBase.SUPER_USER], EntityPermission.DELETE_ALL: [RoleBase.SUPER_USER] }) @dataclass(kw_only = True) class Entity(_BaseEntityDescriptor): name: str | None = None @dataclass class EntityDescriptor(_BaseEntityDescriptor): name: str class_name: str type_: type fields_descriptors: dict[str, EntityFieldDescriptor]