Вопрос по работе с двумя календарями aiogram 3

Только недавно погрузился в python + aiogram, начал делать своего бота .. многое непонятно ... но вроде как постепенно решаются возникающие вопросы. Сейчас возникла проблема, прошу помощи как ее решить. В общем бот на aiogram 3, в котором есть 2 inline кнопки по выводу заказов и продаж на определенную дату. По описания работы календря для aiogram 3 https://github.com/noXplode/aiogram_calendar понятно и работает корректно то, если это вопрос с одним календарем ... а мне фактически надо 2. В описании https://github.com/noXplode/aiogram_calendar при нажатии на кнопку календаря сначала срабатывает

@dp.message(F.text.lower() == 'navigation calendar')

после чего срабатывает

@dp.callback_query(SimpleCalendarCallback.filter())

... у меня же фактически 2 вариации

@dp.message(F.text.lower() == 'navigation calendar')

т.е. условно

@dp.message(F.text.lower() == 'navigation calendar for sales')

и

@dp.message(F.text.lower() == 'navigation calendar for orders')

... но по описанию следующий шаг

@dp.callback_query(SimpleCalendarCallback.filter())

срабатывает на выбор даты в календаре ... любом календаре .. Не могу понять как сделать так, чтобы при выборе кнопки

@dp.message(F.text.lower() == 'navigation calendar for sales')

он перебрасывал на

@dp.callback_query(SimpleCalendarCallback.filter())

для 'navigation calendar for sales', а при выборе

@dp.message(F.text.lower() == 'navigation calendar for orders')

он бы перебрасывал на

@dp.callback_query(SimpleCalendarCallback.filter())

для 'navigation calendar for orders' Надеюсь понятно объяснил.


Ответы (1 шт):

Автор решения: DoK 2412

Я решил данную проблему с помощью состояний (State).

Создаем под каждый календарь отдельное состояние:

class Form(StatesGroup):
    calendar_1 = State()
    calendar_2 = State()

Запускаем состояния:

Первый календарь:

@dp.callback_query(F.data == "Подать заявку")
async def apply(callback: types.CallbackQuery, state: FSMContext):
    """запись заявки"""
    await state.set_state(Form.calendar_1)
    ...

Второй календарь:

@dp.callback_query(F.data == "Перенос заявки")
async def transfer(callback: types.CallbackQuery, state: FSMContext):
    """Перенос заявки"""
    await state.set_state(Form.calendar_2)

Далее ловим состояние:

Первый календарь:

@dp.callback_query(Form.calendar_1, SimpleCalendarCallback.filter())
async def process_simple_calendar(callback, callback_data, state: FSMContext):
...

Второй календарь:

@dp.callback_query(Form.calendar_2, SimpleCalendarCallback.filter())
async def process_simple_calendar(callback, callback_data, state: FSMContext):
...

Не забываем закрывать состояния.


PS

Не закрывайте состояние до момента полного окончания выбора даты.

Если закрыть состояние слишком рано будут траблы с выбором дня если листать месяцы вперед/назад, просто повиснет запрос.

Закрывать не раньше чем параметры selected и date (это стандартные из доки) выдадут результат True:

if selected and date:
    await state.clear()
→ Ссылка