fsm bugfixes
All checks were successful
Build Docs / changes (push) Successful in 16s
Build Docs / build-docs (push) Has been skipped
Build Docs / deploy-docs (push) Has been skipped

This commit is contained in:
Alexander Kalinovsky
2025-05-16 16:35:28 +07:00
parent eb57a4ff78
commit 33abe15562
9 changed files with 69 additions and 61 deletions

View File

@@ -1,4 +1,5 @@
from aiogram.types import Message, CallbackQuery
from aiogram.fsm.context import FSMContext
from typing import TYPE_CHECKING
if TYPE_CHECKING:
@@ -25,11 +26,13 @@ async def route_callback(message: Message | CallbackQuery, back: bool = True, **
import quickbot.bot.handlers.user_handlers.main as user_handler
state_data = kwargs["state_data"]
state: FSMContext = kwargs["state"]
stack, context = get_navigation_context(state_data)
if back:
context = pop_navigation_context(stack)
stack = save_navigation_context(callback_data=context, state_data=state_data)
kwargs.update({"callback_data": context, "navigation_stack": stack})
await state.set_data(state_data)
if context:
if context.command == CallbackCommand.MENU_ENTRY_MAIN:
await menu_main.main_menu(message, **kwargs)

View File

@@ -121,9 +121,7 @@ async def render_entity_picker(
enum_items = (await field_descriptor.options(entity, context)) or []
else:
enum_items = field_descriptor.options(entity, context) or []
enum_items = enum_items[
page_size * (page - 1) : page_size * page
]
enum_items = enum_items[page_size * (page - 1) : page_size * page]
else:
enum_items = list(type_.all_members.values())[
page_size * (page - 1) : page_size * page

View File

@@ -55,7 +55,7 @@ async def field_editor(message: Message | CallbackQuery, **kwargs):
db_session: AsyncSession = kwargs["db_session"]
user: UserBase = kwargs["user"]
app: "QBotApp" = kwargs["app"]
# state: FSMContext = kwargs["state"]
state: FSMContext = kwargs["state"]
state_data: dict = kwargs["state_data"]
entity_data = state_data.get("entity_data")
@@ -173,6 +173,7 @@ async def field_editor(message: Message | CallbackQuery, **kwargs):
stack, context_data = get_navigation_context(state_data=state_data)
kwargs.update({"callback_data": context_data})
await state.set_data(state_data)
return await entity_item(
query=message, navigation_stack=stack, **kwargs

View File

@@ -187,6 +187,8 @@ async def process_field_edit_callback(message: Message | CallbackQuery, **kwargs
text=(await Settings.get(Settings.APP_STRINGS_FORBIDDEN))
)
clear_state(state_data=state_data)
return await route_callback(message=message, back=True, **kwargs)
elif callback_data.context in [
@@ -359,14 +361,14 @@ async def process_field_edit_callback(message: Message | CallbackQuery, **kwargs
can_create = True
if entity_descriptor.before_update_save:
if iscoroutinefunction(entity_descriptor.before_update_save):
can_create = await entity_descriptor.before_update_save(
if entity_descriptor.before_create_save:
if iscoroutinefunction(entity_descriptor.before_create_save):
can_create = await entity_descriptor.before_create_save(
new_entity,
context,
)
else:
can_create = entity_descriptor.before_update_save(
can_create = entity_descriptor.before_create_save(
new_entity,
context,
)

View File

@@ -76,7 +76,10 @@ async def wrap_editor(
)
)
if field_descriptor.is_optional and field_descriptor.show_skip_in_editor == "Auto":
if (
field_descriptor.is_optional
and field_descriptor.show_skip_in_editor == "Auto"
):
btns.append(
InlineKeyboardButton(
text=(await Settings.get(Settings.APP_STRINGS_SKIP_BTN)),

View File

@@ -51,6 +51,7 @@ async def entity_item_callback(query: CallbackQuery, **kwargs):
clear_state(state_data=state_data)
stack = save_navigation_context(callback_data=callback_data, state_data=state_data)
await state.set_data(state_data)
await entity_item(query=query, navigation_stack=stack, **kwargs)
@@ -72,9 +73,9 @@ async def entity_item(
entity_item = await entity_type.get(session=db_session, id=callback_data.entity_id)
state: FSMContext = kwargs["state"]
# state: FSMContext = kwargs["state"]
state_data = kwargs["state_data"]
await state.set_data(state_data)
# await state.set_data(state_data)
if not entity_item and query:
return await query.answer(
@@ -104,7 +105,7 @@ async def entity_item(
app_state=kwargs["app_state"],
user=user,
message=query,
default_handler=item_repr
default_handler=item_repr,
)
if form.before_open:
@@ -306,24 +307,24 @@ async def item_repr(entity_item: BotEntity, context: BotContext[UserBase]):
entity_descriptor = entity_item.bot_entity_descriptor
user = context.user
entity_caption = (
await get_callable_str(
callable_str=entity_descriptor.full_name,
context=context,
descriptor=entity_descriptor,
)
if entity_descriptor.full_name
else entity_descriptor.name
await get_callable_str(
callable_str=entity_descriptor.full_name,
context=context,
descriptor=entity_descriptor,
)
if entity_descriptor.full_name
else entity_descriptor.name
)
entity_item_repr = (
await get_callable_str(
callable_str=entity_descriptor.item_repr,
context=context,
entity=entity_item,
)
if entity_descriptor.item_repr
else str(entity_item.id)
await get_callable_str(
callable_str=entity_descriptor.item_repr,
context=context,
entity=entity_item,
)
if entity_descriptor.item_repr
else str(entity_item.id)
)
item_text = f"<b><u><i>{entity_caption or entity_descriptor.name}:</i></u></b> <b>{entity_item_repr}</b>"
@@ -331,20 +332,20 @@ async def item_repr(entity_item: BotEntity, context: BotContext[UserBase]):
for field_descriptor in entity_descriptor.fields_descriptors.values():
if (
isinstance(field_descriptor.is_visible, bool)
and not field_descriptor.is_visible
):
isinstance(field_descriptor.is_visible, bool)
and not field_descriptor.is_visible
):
continue
if callable(field_descriptor.is_visible):
if iscoroutinefunction(field_descriptor.is_visible):
field_visible = await field_descriptor.is_visible(
field_descriptor, entity_item, context
)
field_descriptor, entity_item, context
)
else:
field_visible = field_descriptor.is_visible(
field_descriptor, entity_item, context
)
field_descriptor, entity_item, context
)
if not field_visible:
continue
@@ -352,11 +353,10 @@ async def item_repr(entity_item: BotEntity, context: BotContext[UserBase]):
for own_field in entity_descriptor.ownership_fields.items():
if (
own_field[1].rstrip("_id")
== field_descriptor.field_name.rstrip("_id")
and own_field[0] in user.roles
and EntityPermission.READ_ALL not in user_permissions
):
own_field[1].rstrip("_id") == field_descriptor.field_name.rstrip("_id")
and own_field[0] in user.roles
and EntityPermission.READ_ALL not in user_permissions
):
skip = True
break
@@ -365,28 +365,28 @@ async def item_repr(entity_item: BotEntity, context: BotContext[UserBase]):
if field_descriptor.caption_value:
item_text += f"\n{
await get_callable_str(
callable_str=field_descriptor.caption_value,
context=context,
descriptor=field_descriptor,
entity=entity_item,
)
}"
await get_callable_str(
callable_str=field_descriptor.caption_value,
context=context,
descriptor=field_descriptor,
entity=entity_item,
)
}"
else:
field_caption = (
await get_callable_str(
callable_str=field_descriptor.caption,
context=context,
descriptor=field_descriptor,
)
if field_descriptor.caption
else field_descriptor.field_name
)
value = await get_value_repr(
value=getattr(entity_item, field_descriptor.field_name),
field_descriptor=field_descriptor,
await get_callable_str(
callable_str=field_descriptor.caption,
context=context,
locale=user.lang,
descriptor=field_descriptor,
)
if field_descriptor.caption
else field_descriptor.field_name
)
value = await get_value_repr(
value=getattr(entity_item, field_descriptor.field_name),
field_descriptor=field_descriptor,
context=context,
locale=user.lang,
)
item_text += f"\n{field_caption or field_descriptor.name}:{f' <b>{value}</b>' if value else ''}"
return item_text

View File

@@ -51,6 +51,7 @@ async def entity_list_callback(query: CallbackQuery, **kwargs):
clear_state(state_data=state_data)
stack = save_navigation_context(callback_data=callback_data, state_data=state_data)
await state.set_data(state_data)
await entity_list(message=query, navigation_stack=stack, **kwargs)
@@ -273,9 +274,9 @@ async def entity_list(
)
}"
state: FSMContext = kwargs["state"]
state_data = kwargs["state_data"]
await state.set_data(state_data)
# state: FSMContext = kwargs["state"]
# state_data = kwargs["state_data"]
# await state.set_data(state_data)
send_message = get_send_message(message)

View File

@@ -39,7 +39,6 @@ async def default_start_handler[UserType: UserBase](
state: FSMContext,
**kwargs,
) -> tuple[UserType, bool]:
User = app.user_class
user = await User.get(session=db_session, id=message.from_user.id)

View File

@@ -215,6 +215,7 @@ class QBotApp(Generic[UserType, ConfigType], FastAPI):
stack = save_navigation_context(
callback_data=callback_data, state_data=state_data
)
await state.set_data(state_data)
if not db_session:
db_session = await get_db()