94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
from typing import Any, Callable, TYPE_CHECKING
|
|
from babel.support import LazyProxy
|
|
from dataclasses import dataclass, field
|
|
|
|
from .role import RoleBase
|
|
from . import EntityPermission
|
|
|
|
if TYPE_CHECKING:
|
|
from .bot_entity import BotEntity
|
|
|
|
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 | LazyProxy | EntityFieldCaptionCallable | None = None
|
|
description: str | LazyProxy | EntityFieldCaptionCallable | None = None
|
|
edit_prompt: str | LazyProxy | EntityFieldCaptionCallable | None = None
|
|
caption_value: EntityFieldCaptionCallable | None = None
|
|
is_visible: bool = True
|
|
localizable: bool = False
|
|
bool_false_value: str | LazyProxy = "no"
|
|
bool_true_value: 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
|
|
type_base: type = None
|
|
is_list: bool = False
|
|
is_optional: bool = False
|
|
entity_descriptor: "EntityDescriptor" = None
|
|
|
|
def __hash__(self):
|
|
return self.name.__hash__()
|
|
|
|
|
|
@dataclass(kw_only = True)
|
|
class _BaseEntityDescriptor:
|
|
|
|
icon: str = "📘"
|
|
caption: str | LazyProxy | EntityCaptionCallable | None = None
|
|
caption_plural: str | LazyProxy | EntityCaptionCallable | None = None
|
|
description: str | LazyProxy | EntityCaptionCallable | None = None
|
|
item_caption: EntityItemCaptionCallable | None = None
|
|
show_in_entities_menu: bool = True
|
|
field_sequence: list[str] = None
|
|
edit_button_visible: bool = True
|
|
edit_buttons: list[list[str | tuple[str, str | LazyProxy | EntityFieldCaptionCallable]]] = 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["BotEntity"]
|
|
fields_descriptors: dict[str, EntityFieldDescriptor]
|