from types import UnionType from aiogram import Router from aiogram.fsm.context import FSMContext from aiogram.types import Message, CallbackQuery, InlineKeyboardButton, CopyTextButton from aiogram.utils.keyboard import InlineKeyboardBuilder from logging import getLogger from typing import Any, get_args, get_origin from ....model.descriptors import EntityFieldDescriptor, EntityDescriptor from ....model.language import LanguageBase from ....model.settings import Settings from ....utils import serialize from ..context import ContextData, CallbackCommand from ..common import get_send_message, get_local_text from .common import wrap_editor logger = getLogger(__name__) router = Router() async def string_editor(message: Message | CallbackQuery, field_descriptor: EntityFieldDescriptor, callback_data: ContextData, current_value: Any, edit_prompt: str, state: FSMContext, locale_index: int = 0, **kwargs): keyboard_builder = InlineKeyboardBuilder() state_data: dict = kwargs["state_data"] _edit_prompt = edit_prompt # type_ = field_descriptor.type_ # type_origin = get_origin(type_) # if type_origin == UnionType: # type_ = get_args(type_)[0] if field_descriptor.type_base == str and field_descriptor.localizable: current_locale = list(LanguageBase.all_members.values())[locale_index] context_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, save_state = True) _edit_prompt = f"{edit_prompt}\n{(await Settings.get( Settings.APP_STRINGS_STRING_EDITOR_LOCALE_TEMPLATE_P_NAME)).format(name = current_locale)}" _current_value = get_local_text(current_value, current_locale) if current_value else None state_data.update({ "context_data": context_data.pack(), "edit_prompt": edit_prompt, "locale_index": str(locale_index), "current_value": current_value}) else: context_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, save_state = True) _current_value = serialize(current_value, field_descriptor) state_data.update({ "context_data": context_data.pack()}) if _current_value: _current_value_caption = f"{_current_value[:30]}..." if len(_current_value) > 30 else _current_value keyboard_builder.row(InlineKeyboardButton(text = _current_value_caption, copy_text = CopyTextButton(text = _current_value))) state_data = kwargs["state_data"] await wrap_editor(keyboard_builder = keyboard_builder, field_descriptor = field_descriptor, callback_data = callback_data, state_data = state_data) await state.set_data(state_data) send_message = get_send_message(message) await send_message(text = _edit_prompt, reply_markup = keyboard_builder.as_markup()) # async def context_command_fiter(*args, **kwargs): # print(args, kwargs) # return True