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 ....model.descriptors import EntityFieldDescriptor, EntityDescriptor from ....model.settings import Settings from ..context import ContextData, CallbackCommand, CommandContext from ..navigation import get_navigation_context, pop_navigation_context 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) 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) keyboard_builder.row(InlineKeyboardButton( text = (await Settings.get(Settings.APP_STRINGS_CANCEL_BTN)), callback_data = context.pack())) elif callback_data.context == CommandContext.SETTING_EDIT: 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()))