add ruff format, ruff check, time_picker, project structure and imports reorganized
This commit is contained in:
@@ -1,67 +1,75 @@
|
||||
from types import NoneType, UnionType
|
||||
from typing import get_args, get_origin
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import InlineKeyboardButton
|
||||
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from decimal import Decimal
|
||||
from datetime import datetime, time
|
||||
|
||||
from ....model.descriptors import EntityFieldDescriptor, EntityDescriptor
|
||||
from ....model.bot_entity import BotEntity
|
||||
from ....model.bot_enum import BotEnum
|
||||
from ....model.descriptors import EntityFieldDescriptor
|
||||
from ....model.settings import Settings
|
||||
from ..context import ContextData, CallbackCommand, CommandContext
|
||||
from ..navigation import get_navigation_context, pop_navigation_context
|
||||
from ....model.user import UserBase
|
||||
from ....utils.main import get_callable_str, get_value_repr
|
||||
from ..context import ContextData, CommandContext
|
||||
from .boolean import bool_editor
|
||||
from .date import date_picker, time_picker
|
||||
from .entity import entity_picker
|
||||
from .string import string_editor
|
||||
|
||||
|
||||
async def wrap_editor(keyboard_builder: InlineKeyboardBuilder,
|
||||
field_descriptor: EntityFieldDescriptor,
|
||||
callback_data: ContextData,
|
||||
state_data: dict):
|
||||
|
||||
if callback_data.context in [CommandContext.ENTITY_CREATE, CommandContext.ENTITY_EDIT, CommandContext.ENTITY_FIELD_EDIT]:
|
||||
|
||||
btns = []
|
||||
entity_descriptor = field_descriptor.entity_descriptor
|
||||
field_index = (entity_descriptor.field_sequence.index(field_descriptor.name)
|
||||
if callback_data.context in [CommandContext.ENTITY_CREATE, CommandContext.ENTITY_EDIT]
|
||||
else 0)
|
||||
|
||||
stack, context = get_navigation_context(state_data = state_data)
|
||||
context = pop_navigation_context(stack)
|
||||
async def show_editor(message: Message | CallbackQuery, **kwargs):
|
||||
field_descriptor: EntityFieldDescriptor = kwargs["field_descriptor"]
|
||||
current_value = kwargs["current_value"]
|
||||
user: UserBase = kwargs["user"]
|
||||
callback_data: ContextData = kwargs.get("callback_data", None)
|
||||
state_data: dict = kwargs["state_data"]
|
||||
|
||||
if field_index > 0:
|
||||
btns.append(InlineKeyboardButton(
|
||||
text = (await Settings.get(Settings.APP_STRINGS_BACK_BTN)),
|
||||
callback_data = ContextData(
|
||||
command = CallbackCommand.FIELD_EDITOR,
|
||||
context = callback_data.context,
|
||||
entity_name = callback_data.entity_name,
|
||||
entity_id = callback_data.entity_id,
|
||||
field_name = entity_descriptor.field_sequence[field_index - 1]).pack()))
|
||||
|
||||
if field_descriptor.is_optional:
|
||||
btns.append(InlineKeyboardButton(
|
||||
text = (await Settings.get(Settings.APP_STRINGS_SKIP_BTN)),
|
||||
callback_data = ContextData(
|
||||
command = CallbackCommand.FIELD_EDITOR_CALLBACK,
|
||||
context = callback_data.context,
|
||||
entity_name = callback_data.entity_name,
|
||||
entity_id = callback_data.entity_id,
|
||||
field_name = callback_data.field_name,
|
||||
data = "skip").pack()))
|
||||
|
||||
keyboard_builder.row(*btns)
|
||||
value_type = field_descriptor.type_base
|
||||
|
||||
|
||||
keyboard_builder.row(InlineKeyboardButton(
|
||||
text = (await Settings.get(Settings.APP_STRINGS_CANCEL_BTN)),
|
||||
callback_data = context.pack()))
|
||||
if field_descriptor.edit_prompt:
|
||||
edit_prompt = get_callable_str(
|
||||
field_descriptor.edit_prompt, field_descriptor, None, current_value
|
||||
)
|
||||
else:
|
||||
if field_descriptor.caption:
|
||||
caption_str = get_callable_str(
|
||||
field_descriptor.caption, field_descriptor, None, current_value
|
||||
)
|
||||
else:
|
||||
caption_str = field_descriptor.name
|
||||
if callback_data.context == CommandContext.ENTITY_EDIT:
|
||||
edit_prompt = (
|
||||
await Settings.get(
|
||||
Settings.APP_STRINGS_FIELD_EDIT_PROMPT_TEMPLATE_P_NAME_VALUE
|
||||
)
|
||||
).format(
|
||||
name=caption_str,
|
||||
value=get_value_repr(current_value, field_descriptor, user.lang),
|
||||
)
|
||||
else:
|
||||
edit_prompt = (
|
||||
await Settings.get(
|
||||
Settings.APP_STRINGS_FIELD_CREATE_PROMPT_TEMPLATE_P_NAME
|
||||
)
|
||||
).format(name=caption_str)
|
||||
|
||||
elif callback_data.context == CommandContext.SETTING_EDIT:
|
||||
kwargs["edit_prompt"] = edit_prompt
|
||||
|
||||
keyboard_builder.row(
|
||||
InlineKeyboardButton(
|
||||
text = (await Settings.get(Settings.APP_STRINGS_CANCEL_BTN)),
|
||||
callback_data = ContextData(
|
||||
command = CallbackCommand.FIELD_EDITOR_CALLBACK,
|
||||
context = callback_data.context,
|
||||
field_name = callback_data.field_name,
|
||||
data = "cancel").pack()))
|
||||
|
||||
if value_type not in [int, float, Decimal, str]:
|
||||
state_data.update({"context_data": callback_data.pack()})
|
||||
|
||||
if value_type is bool:
|
||||
await bool_editor(message=message, **kwargs)
|
||||
|
||||
elif value_type in [int, float, Decimal, str]:
|
||||
await string_editor(message=message, **kwargs)
|
||||
|
||||
elif value_type is datetime:
|
||||
await date_picker(message=message, **kwargs)
|
||||
|
||||
elif value_type is time:
|
||||
await time_picker(message=message, **kwargs)
|
||||
|
||||
elif issubclass(value_type, BotEntity) or issubclass(value_type, BotEnum):
|
||||
await entity_picker(message=message, **kwargs)
|
||||
|
||||
else:
|
||||
raise ValueError(f"Unsupported field type: {value_type}")
|
||||
|
||||
Reference in New Issue
Block a user