@@ -114,8 +114,8 @@ async def on_create_subscription(
114114 # Очищаем данные диалога для новой подписки
115115 dialog_manager .dialog_data .clear ()
116116
117- dialog_manager . dialog_data [ "type" ] = dialog_manager . start_data [ "type" ]
118- await dialog_manager .switch_to (ExchangesSub .create_criteria )
117+ # Переходим к выбору типа обменов
118+ await dialog_manager .switch_to (ExchangesSub .create_type )
119119
120120
121121async def on_delete_subscription (
@@ -178,24 +178,47 @@ async def on_criteria_next(
178178 await _navigate_forward (current_state , dialog_manager )
179179
180180
181+ def _get_selected_criteria (dialog_manager : DialogManager ) -> list :
182+ """Получить выбранные критерии из виджета."""
183+ criteria_widget : ManagedToggle = dialog_manager .find ("criteria_toggles" )
184+ return criteria_widget .get_checked () if criteria_widget else []
185+
186+
187+ def _get_next_step_after_criteria (selected_criteria : list ) -> str :
188+ """Определить следующий шаг на основе выбранных критериев."""
189+ if "price" in selected_criteria :
190+ return ExchangesSub .create_price
191+ elif "time" in selected_criteria :
192+ return ExchangesSub .create_time
193+ elif "days" in selected_criteria :
194+ return ExchangesSub .create_date
195+ elif "seller" in selected_criteria :
196+ return ExchangesSub .create_seller
197+ else :
198+ return ExchangesSub .create_confirmation
199+
200+
181201async def _navigate_forward (current_state , dialog_manager : DialogManager ) -> None :
182202 """Навигация вперед по шагам создания подписки."""
183- # Получаем выбранные критерии
184- criteria_widget : ManagedToggle = dialog_manager .find ("criteria_toggles" )
185- selected_criteria = criteria_widget .get_checked () if criteria_widget else []
203+ if current_state == ExchangesSub .create_type :
204+ # Сохраняем выбранный тип обмена
205+ exchange_type_widget : ManagedRadio = dialog_manager .find ("exchange_type" )
206+ selected_type = (
207+ exchange_type_widget .get_checked () if exchange_type_widget else None
208+ )
209+ if selected_type :
210+ dialog_manager .dialog_data ["exchange_type" ] = selected_type
211+ await dialog_manager .switch_to (ExchangesSub .create_criteria )
212+
213+ elif current_state == ExchangesSub .create_criteria :
214+ # Получаем выбранные критерии и переходим к следующему шагу
215+ selected_criteria = _get_selected_criteria (dialog_manager )
216+ next_step = _get_next_step_after_criteria (selected_criteria )
217+ await dialog_manager .switch_to (next_step )
186218
187- if current_state == ExchangesSub .create_criteria :
188- if "price" in selected_criteria :
189- await dialog_manager .switch_to (ExchangesSub .create_price )
190- elif "time" in selected_criteria :
191- await dialog_manager .switch_to (ExchangesSub .create_time )
192- elif "days" in selected_criteria :
193- await dialog_manager .switch_to (ExchangesSub .create_date )
194- elif "seller" in selected_criteria :
195- await dialog_manager .switch_to (ExchangesSub .create_seller )
196- else :
197- await dialog_manager .switch_to (ExchangesSub .create_confirmation )
198219 elif current_state == ExchangesSub .create_price :
220+ # После настройки цены переходим к следующему критерию
221+ selected_criteria = _get_selected_criteria (dialog_manager )
199222 if "time" in selected_criteria :
200223 await dialog_manager .switch_to (ExchangesSub .create_time )
201224 elif "days" in selected_criteria :
@@ -204,25 +227,35 @@ async def _navigate_forward(current_state, dialog_manager: DialogManager) -> Non
204227 await dialog_manager .switch_to (ExchangesSub .create_seller )
205228 else :
206229 await dialog_manager .switch_to (ExchangesSub .create_confirmation )
230+
207231 elif current_state == ExchangesSub .create_time :
232+ # После настройки времени переходим к следующему критерию
233+ selected_criteria = _get_selected_criteria (dialog_manager )
208234 if "days" in selected_criteria :
209235 await dialog_manager .switch_to (ExchangesSub .create_date )
210236 elif "seller" in selected_criteria :
211237 await dialog_manager .switch_to (ExchangesSub .create_seller )
212238 else :
213239 await dialog_manager .switch_to (ExchangesSub .create_confirmation )
240+
214241 elif current_state == ExchangesSub .create_date :
242+ # После настройки дат переходим к следующему критерию
243+ selected_criteria = _get_selected_criteria (dialog_manager )
215244 if "seller" in selected_criteria :
216245 await dialog_manager .switch_to (ExchangesSub .create_seller )
217246 else :
218247 await dialog_manager .switch_to (ExchangesSub .create_confirmation )
219- elif (
220- current_state == ExchangesSub .create_seller
221- or current_state == ExchangesSub .create_seller_results
222- ):
248+
249+ elif current_state in [
250+ ExchangesSub .create_seller ,
251+ ExchangesSub .create_seller_results ,
252+ ]:
253+ # После выбора продавца всегда переходим к подтверждению
223254 await dialog_manager .switch_to (ExchangesSub .create_confirmation )
255+
224256 elif current_state == ExchangesSub .create_confirmation :
225- # Возврат из подтверждения к последнему шагу настройки
257+ # Из подтверждения возвращаемся к последнему шагу настройки
258+ selected_criteria = _get_selected_criteria (dialog_manager )
226259 if "seller" in selected_criteria :
227260 await dialog_manager .switch_to (ExchangesSub .create_seller )
228261 elif "days" in selected_criteria :
@@ -235,49 +268,58 @@ async def _navigate_forward(current_state, dialog_manager: DialogManager) -> Non
235268 await dialog_manager .switch_to (ExchangesSub .create_criteria )
236269
237270
238- async def _navigate_back (current_state , dialog_manager : DialogManager ) -> None :
239- """Навигация назад по шагам создания подписки."""
240- # Получаем выбранные критерии
241- criteria_widget : ManagedToggle = dialog_manager .find ("criteria_toggles" )
242- selected_criteria = criteria_widget .get_checked () if criteria_widget else []
243-
244- if current_state == ExchangesSub .create_price :
245- await dialog_manager .switch_to (ExchangesSub .create_criteria )
271+ def _get_previous_step (current_state , selected_criteria : list ):
272+ """Определить предыдущий шаг на основе текущего состояния и критериев."""
273+ if current_state == ExchangesSub .create_criteria :
274+ return ExchangesSub .create_type
275+ elif current_state == ExchangesSub .create_price :
276+ return ExchangesSub .create_criteria
246277 elif current_state == ExchangesSub .create_time :
247278 if "price" in selected_criteria :
248- await dialog_manager . switch_to ( ExchangesSub .create_price )
279+ return ExchangesSub .create_price
249280 else :
250- await dialog_manager . switch_to ( ExchangesSub .create_criteria )
281+ return ExchangesSub .create_criteria
251282 elif current_state == ExchangesSub .create_date :
252283 if "time" in selected_criteria :
253- await dialog_manager . switch_to ( ExchangesSub .create_time )
284+ return ExchangesSub .create_time
254285 elif "price" in selected_criteria :
255- await dialog_manager . switch_to ( ExchangesSub .create_price )
286+ return ExchangesSub .create_price
256287 else :
257- await dialog_manager . switch_to ( ExchangesSub .create_criteria )
258- elif (
259- current_state == ExchangesSub .create_seller
260- or current_state == ExchangesSub .create_seller_results
261- ) :
288+ return ExchangesSub .create_criteria
289+ elif current_state in [
290+ ExchangesSub .create_seller ,
291+ ExchangesSub .create_seller_results ,
292+ ] :
262293 if "days" in selected_criteria :
263- await dialog_manager . switch_to ( ExchangesSub .create_date )
294+ return ExchangesSub .create_date
264295 elif "time" in selected_criteria :
265- await dialog_manager . switch_to ( ExchangesSub .create_time )
296+ return ExchangesSub .create_time
266297 elif "price" in selected_criteria :
267- await dialog_manager . switch_to ( ExchangesSub .create_price )
298+ return ExchangesSub .create_price
268299 else :
269- await dialog_manager . switch_to ( ExchangesSub .create_criteria )
300+ return ExchangesSub .create_criteria
270301 elif current_state == ExchangesSub .create_confirmation :
302+ # Для подтверждения ищем последний настроенный критерий
271303 if "seller" in selected_criteria :
272- await dialog_manager . switch_to ( ExchangesSub .create_seller )
304+ return ExchangesSub .create_seller
273305 elif "days" in selected_criteria :
274- await dialog_manager . switch_to ( ExchangesSub .create_date )
306+ return ExchangesSub .create_date
275307 elif "time" in selected_criteria :
276- await dialog_manager . switch_to ( ExchangesSub .create_time )
308+ return ExchangesSub .create_time
277309 elif "price" in selected_criteria :
278- await dialog_manager . switch_to ( ExchangesSub .create_price )
310+ return ExchangesSub .create_price
279311 else :
280- await dialog_manager .switch_to (ExchangesSub .create_criteria )
312+ return ExchangesSub .create_criteria
313+ else :
314+ # Fallback для неизвестных состояний
315+ return ExchangesSub .create_criteria
316+
317+
318+ async def _navigate_back (current_state , dialog_manager : DialogManager ) -> None :
319+ """Навигация назад по шагам создания подписки."""
320+ selected_criteria = _get_selected_criteria (dialog_manager )
321+ previous_step = _get_previous_step (current_state , selected_criteria )
322+ await dialog_manager .switch_to (previous_step )
281323
282324
283325async def on_price_input (
@@ -433,15 +475,17 @@ async def on_confirm_subscription(
433475 subscription_id = subscription .id if subscription else None
434476
435477 if subscription_id and subscription :
436- await event .answer ("✅ Подписка создана успешно!" , show_alert = True )
478+ await event .answer (
479+ "👌 Подписка успешно создана" ,
480+ )
437481 dialog_manager .dialog_data .clear ()
438482 await dialog_manager .switch_to (ExchangesSub .menu )
439483 else :
440- await event .answer ("❌ Ошибка создания подписки" , show_alert = True )
484+ await event .answer ("🚨 Ошибка создания подписки" )
441485
442486 except Exception as e :
443487 logger .error (f"Ошибка создания подписки для пользователя { user .user_id } : { e } " )
444- await event .answer ("❌ Ошибка создания подписки" , show_alert = True )
488+ await event .answer ("🚨 Ошибка создания подписки" )
445489
446490
447491def _collect_subscription_data (dialog_manager : DialogManager , user : Employee ) -> dict :
@@ -454,7 +498,7 @@ def _collect_subscription_data(dialog_manager: DialogManager, user: Employee) ->
454498 Returns:
455499 Словарь с данными подписки
456500 """
457- exchange_type : ManagedRadio = dialog_manager .dialog_data .get ("type " )
501+ exchange_type = dialog_manager .dialog_data .get ("exchange_type " )
458502
459503 criteria_widget : ManagedToggle = dialog_manager .find ("criteria_toggles" )
460504 selected_criteria = criteria_widget .get_checked () if criteria_widget else []
@@ -533,7 +577,7 @@ async def on_date_selected(
533577 # Проверяем, не является ли выбранная дата прошедшей
534578 current_date = datetime .now ().date ()
535579 if isinstance (selected_date , date ) and selected_date < current_date :
536- await event .answer ("❌ Нельзя выбрать прошедшую дату" , show_alert = True )
580+ await event .answer ("🚨 Нельзя выбрать прошедшую дату" , show_alert = True )
537581 return
538582
539583 # Конвертируем дату в строку ISO формата
@@ -548,19 +592,19 @@ async def on_date_selected(
548592 # Если дата уже выбрана, убираем её, иначе добавляем
549593 if date_str in selected_dates :
550594 selected_dates .remove (date_str )
551- await event .answer (f"❌ Убрана дата { selected_date .strftime ('%d.%m.%Y' )} " )
595+ await event .answer (f"Убрана дата { selected_date .strftime ('%d.%m.%Y' )} " )
552596 else :
553597 selected_dates .append (date_str )
554598 await event .answer (
555- f"✅ Добавлена дата { selected_date .strftime ('%d.%m.%Y' )} "
599+ f"👌 Добавлена дата { selected_date .strftime ('%d.%m.%Y' )} "
556600 )
557601
558602 # Сохраняем обновленный список
559603 dialog_manager .dialog_data ["selected_dates" ] = selected_dates
560604
561605 except Exception as e :
562606 logger .error (f"Ошибка при выборе даты для подписки: { e } " )
563- await event .answer ("❌ Ошибка выбора даты" )
607+ await event .answer ("🚨 Ошибка выбора даты" )
564608
565609
566610async def on_clear_dates (
0 commit comments