Skip to content

Commit 4c8dc22

Browse files
committed
style(exchanges): Перенос подписок в главное меню биржи
1 parent d901b25 commit 4c8dc22

File tree

4 files changed

+154
-83
lines changed

4 files changed

+154
-83
lines changed

tgbot/dialogs/events/common/exchanges/subscriptions.py

Lines changed: 99 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

121121
async 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+
181201
async 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

283325
async 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

447491
def _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

566610
async def on_clear_dates(

tgbot/dialogs/getters/common/exchanges/subscriptions.py

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -195,16 +195,15 @@ async def subscription_create_type_getter(
195195
Словарь с типами обменов
196196
"""
197197
exchange_types = [
198-
("buy", "📈 Покупка часов (я покупаю)"),
199-
("sell", "📉 Продажа часов (я продаю)"),
200-
("both", "🔄 Оба типа"),
198+
("buy", "📈 Хочу купить"),
199+
("sell", "📉 Хочу продать"),
201200
]
202201

203-
sub_type = dialog_manager.dialog_data.get("type")
202+
selected_type = dialog_manager.dialog_data.get("exchange_type")
204203

205204
return {
206205
"exchange_types": exchange_types,
207-
"exchange_type_selected": sub_type is not None,
206+
"exchange_type_selected": selected_type is not None,
208207
}
209208

210209

@@ -219,13 +218,12 @@ async def subscription_create_criteria_getter(
219218
Returns:
220219
Словарь с критериями
221220
"""
222-
# Получаем выбранный тип обменов (автоматический или из виджета)
223-
sub_type = dialog_manager.dialog_data.get("type")
221+
# Получаем выбранный тип обменов
222+
sub_type = dialog_manager.dialog_data.get("exchange_type")
224223

225224
type_names = {
226225
"buy": "📈 Покупка часов",
227226
"sell": "📉 Продажа часов",
228-
"both": "🔄 Оба типа",
229227
}
230228

231229
criteria_options = [
@@ -273,12 +271,11 @@ async def subscription_create_price_getter(
273271
Returns:
274272
Словарь с настройками цены
275273
"""
276-
sub_type = dialog_manager.dialog_data.get("type")
274+
sub_type = dialog_manager.dialog_data.get("exchange_type")
277275

278276
type_names = {
279277
"buy": "📈 Покупка часов",
280278
"sell": "📉 Продажа часов",
281-
"both": "🔄 Оба типа",
282279
}
283280

284281
# Получаем выбранные критерии
@@ -337,12 +334,11 @@ async def subscription_create_time_getter(
337334
Returns:
338335
Словарь с временными диапазонами
339336
"""
340-
sub_type = dialog_manager.dialog_data.get("type")
337+
sub_type = dialog_manager.dialog_data.get("exchange_type")
341338

342339
type_names = {
343340
"buy": "📈 Покупка часов",
344341
"sell": "📉 Продажа часов",
345-
"both": "🔄 Оба типа",
346342
}
347343

348344
# Получаем выбранные критерии для отображения
@@ -433,12 +429,11 @@ async def subscription_create_date_getter(
433429
)
434430

435431
await prepare_calendar_data_for_exchange(stp_repo, user, dialog_manager)
436-
sub_type = dialog_manager.dialog_data.get("type")
432+
sub_type = dialog_manager.dialog_data.get("exchange_type")
437433

438434
type_names = {
439435
"buy": "📈 Покупка часов",
440436
"sell": "📉 Продажа часов",
441-
"both": "🔄 Оба типа",
442437
}
443438

444439
# Получаем выбранные критерии
@@ -564,11 +559,10 @@ async def subscription_create_confirmation_getter(
564559
"subscription_name", "Моя подписка"
565560
)
566561

567-
sub_type = dialog_manager.dialog_data.get("type")
562+
sub_type = dialog_manager.dialog_data.get("exchange_type")
568563
type_names = {
569564
"buy": "📈 Покупка часов",
570565
"sell": "📉 Продажа часов",
571-
"both": "🔄 Оба типа",
572566
}
573567
exchange_type = type_names.get(sub_type, "Не выбрано")
574568

@@ -597,8 +591,8 @@ def _generate_subscription_name(dialog_manager: DialogManager) -> str:
597591
"""
598592
parts = []
599593

600-
sub_type = dialog_manager.dialog_data.get("type")
601-
type_names = {"buy": "Покупка", "sell": "Продажа", "both": "Все обмены"}
594+
sub_type = dialog_manager.dialog_data.get("exchange_type")
595+
type_names = {"buy": "Покупка", "sell": "Продажа"}
602596
parts.append(type_names.get(sub_type, "Обмены"))
603597

604598
# Сотрудник (приоритетно)
@@ -671,8 +665,8 @@ def _get_criteria_summary(dialog_manager: DialogManager) -> str:
671665

672666
def _get_subscription_summary(dialog_manager: DialogManager) -> str:
673667
"""Получить краткое описание подписки для названия."""
674-
sub_type = dialog_manager.dialog_data.get("type")
675-
type_short = {"buy": "покупка", "sell": "продажа", "both": "все обмены"}
668+
sub_type = dialog_manager.dialog_data.get("exchange_type")
669+
type_short = {"buy": "покупка", "sell": "продажа"}
676670

677671
criteria_summary = _get_criteria_summary(dialog_manager)
678672

@@ -759,12 +753,11 @@ async def subscription_create_seller_search_getter(
759753
Returns:
760754
Словарь с данными для поиска сотрудника
761755
"""
762-
sub_type = dialog_manager.dialog_data.get("type")
756+
sub_type = dialog_manager.dialog_data.get("exchange_type")
763757

764758
type_names = {
765759
"buy": "📈 Покупка часов",
766760
"sell": "📉 Продажа часов",
767-
"both": "🔄 Оба типа",
768761
}
769762

770763
# Получаем выбранные критерии для отображения

0 commit comments

Comments
 (0)