55from aiogram import Router
66from aiogram .types import CallbackQuery
77from aiogram_dialog import Dialog , DialogManager , Window
8- from aiogram_dialog .widgets .kbd import Button , ScrollingGroup , Select , Start
8+ from aiogram_dialog .widgets .kbd import Button , Row , ScrollingGroup , Select
99from aiogram_dialog .widgets .text import Const , Format
1010
1111from db .models .participation import Participation
12+ from utils .enums import Mode
1213from utils .redirect import redirect
1314
1415from . import states
2223# === Гетеры ===
2324async def get_campaigns_data (dialog_manager : DialogManager , ** kwargs ):
2425 user : User = dialog_manager .middleware_data ["user" ]
25- campaigns = await Participation .filter (user = user ).prefetch_related ("campaign" ).all ()
26- return {"campaigns" : campaigns , "is_admin" : user .admin , "has_campaigns" : len (campaigns ) > 0 }
26+ if "current_mode" not in dialog_manager .dialog_data :
27+ value = Mode .Base
28+ if user .admin :
29+ value = Mode .Academy
30+ dialog_manager .dialog_data ["current_mode" ] = value
31+
32+ campaigns = (
33+ await Participation .filter (user = user )
34+ .prefetch_related ("campaign" )
35+ .filter (campaign__verified = dialog_manager .dialog_data ["current_mode" ] == Mode .Academy )
36+ .all ()
37+ )
38+ return {
39+ "campaigns" : campaigns ,
40+ "is_admin" : user .admin ,
41+ "has_campaigns" : len (campaigns ) > 0 ,
42+ "view_mode" : f"(режим { dialog_manager .dialog_data ['current_mode' ]} )" if user .admin else "" ,
43+ }
2744
2845
2946# === Кнопки ===
@@ -43,9 +60,20 @@ async def on_campaign_selected(
4360 )
4461
4562
63+ async def on_crete_campaign (msg : CallbackQuery , wdg : Button , mng : DialogManager ):
64+ await mng .start (
65+ state = states .CreateCampaign .select_title , data = {"verified" : mng .dialog_data .get ("mode" ) == Mode .Academy }
66+ )
67+
68+
69+ async def on_change_mode (msg : CallbackQuery , wdg : Button , mng : DialogManager ):
70+ mng .dialog_data ["current_mode" ] = Mode .Academy if mng .dialog_data .get ("current_mode" ) == Mode .Base else Mode .Base
71+ await mng .show ()
72+
73+
4674# === Окна ===
4775campaign_list_window = Window (
48- Const ("🏰 Ваши кампании\n \n " ),
76+ Format ("🏰 Ваши кампании {view_mode} \n \n " ),
4977 Const (
5078 "У вас пока нет доступных кампаний" ,
5179 when = lambda data , widget , dialog_manager : not data .get ("has_campaigns" , False ),
@@ -64,16 +92,18 @@ async def on_campaign_selected(
6492 height = 5 ,
6593 id = "campaigns" ,
6694 ),
67- Start (
68- Const ("➕ Создать новую" ),
69- id = "create_campaign" ,
70- state = states .CreateCampaign .select_title ,
71- ),
72- Button (
73- Const ("➕ Создать новую (Для академии)" ),
74- id = "create_verified_campaign" ,
75- on_click = lambda c , b , d : d .start (states .CreateCampaign .select_title , data = {"verified" : True }),
76- when = "is_admin" ,
95+ Row (
96+ Button (
97+ Const ("➕ Создать новую" ),
98+ id = "create_verified_campaign" ,
99+ on_click = on_crete_campaign ,
100+ ),
101+ Button (
102+ Const ("🔀 Сменить режим" ),
103+ id = "change_mode" ,
104+ on_click = on_change_mode ,
105+ when = "is_admin" ,
106+ ),
77107 ),
78108 state = states .CampaignList .main ,
79109 getter = get_campaigns_data ,
0 commit comments