refactoring

This commit is contained in:
Alexander Kalinovsky
2025-01-09 13:11:10 +01:00
parent 7793a0cb77
commit 3898a333fa
29 changed files with 1065 additions and 381 deletions

View File

@@ -4,23 +4,25 @@ from aiogram.types import Message, CallbackQuery
from .context import ContextData, CallbackCommand
async def save_navigation_context(callback_data: ContextData, state: FSMContext) -> list[ContextData]:
data = await state.get_data()
stack = [ContextData.unpack(item) for item in data.get("navigation_stack", [])]
data_nc = data.get("navigation_context")
def save_navigation_context(callback_data: ContextData, state_data: dict) -> list[ContextData]:
stack = [ContextData.unpack(item) for item in state_data.get("navigation_stack", [])]
data_nc = state_data.get("navigation_context")
navigation_context = ContextData.unpack(data_nc) if data_nc else None
if callback_data.back:
callback_data.back = False
if stack:
stack.pop()
else:
if stack and navigation_context and navigation_context.command == callback_data.command:
if (stack and navigation_context and
navigation_context.command == callback_data.command and
navigation_context.command != CallbackCommand.USER_COMMAND):
navigation_context = callback_data
elif navigation_context:
stack.append(navigation_context)
await state.update_data({"navigation_stack": [item.pack() for item in stack],
"navigation_context": callback_data.pack()})
state_data["navigation_stack"] = [item.pack() for item in stack]
state_data["navigation_context"] = callback_data.pack()
return stack
@@ -31,36 +33,33 @@ def pop_navigation_context(stack: list[ContextData]) -> ContextData | None:
return data
async def get_navigation_context(state: FSMContext) -> tuple[list[ContextData], ContextData | None]:
data = await state.get_data()
data_nc = data.get("navigation_context")
def get_navigation_context(state_data: dict) -> tuple[list[ContextData], ContextData | None]:
data_nc = state_data.get("navigation_context")
context = ContextData.unpack(data_nc) if data_nc else None
return ([ContextData.unpack(item) for item in data.get("navigation_stack", [])],
return ([ContextData.unpack(item) for item in state_data.get("navigation_stack", [])],
context)
async def clear_state(state: FSMContext, clear_nav: bool = False):
def clear_state(state_data: dict, clear_nav: bool = False):
if clear_nav:
await state.clear()
state_data.clear()
else:
state_data = await state.get_data()
stack = state_data.get("navigation_stack")
context = state_data.get("navigation_context")
update_data = {}
state_data.clear()
if stack:
update_data["navigation_stack"] = stack
state_data["navigation_stack"] = stack
if context:
update_data["navigation_context"] = context
await state.clear()
await state.update_data(update_data)
state_data["navigation_context"] = context
async def route_callback(message: Message | CallbackQuery, back: bool = True, **kwargs):
stack, context = await get_navigation_context(kwargs["state"])
state_data = kwargs["state_data"]
stack, context = get_navigation_context(state_data)
if back:
context = pop_navigation_context(stack)
stack = await save_navigation_context(callback_data = context, state = kwargs["state"])
stack = save_navigation_context(callback_data = context, state_data = state_data)
kwargs.update({"callback_data": context, "navigation_stack": stack})
if context:
if context.command == CallbackCommand.MENU_ENTRY_MAIN:
@@ -77,6 +76,8 @@ async def route_callback(message: Message | CallbackQuery, back: bool = True, **
await entity_list(message, **kwargs)
elif context.command == CallbackCommand.ENTITY_ITEM:
await entity_item(message, **kwargs)
elif context.command == CallbackCommand.FIELD_EDITOR:
await field_editor(message, **kwargs)
else:
raise ValueError(f"Unknown command {context.command}")
@@ -90,4 +91,5 @@ from .menu.parameters import parameters_menu
from .menu.language import language_menu
from .menu.entities import entities_menu
from .forms.entity_list import entity_list
from .forms.entity_form import entity_item
from .forms.entity_form import entity_item
from .editors import field_editor