From 377b061ac934ac423dedff86c9b7c1d452a36dfe Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 11 Mar 2026 18:51:57 +0000 Subject: [PATCH] =?UTF-8?q?v1.24=20=D0=A3=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ”” Π£Π’Π•Π”ΠžΠœΠ›Π•ΠΠ˜Π―: β€’ Π‘Π΅ΠΉΠ΄ΠΆ Π² мСню: ВСрификация (N) β€’ Π‘Π»ΠΎΠΊ Π² ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΡ…: ΠžΠΆΠΈΠ΄Π°ΡŽΡ‚ (N) β€’ Быстрая вСрификация: [βœ…] [❌] β€’ Telegram ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π°Π΄ΠΌΠΈΠ½Ρƒ βœ… БЫБВРАЯ Π’Π•Π Π˜Π€Π˜ΠšΠΠ¦Π˜Π―: β€’ ΠŸΡ€ΡΠΌΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ β€’ Кнопки: Π’Π΅Ρ€ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ / ΠžΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ β€’ ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° страницы πŸ“ ЀАЙЛЫ: β€’ web/app.py: pending_count β€’ web/templates/users.html: Π±Π»ΠΎΠΊ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ β€’ web/templates/dashboard.html: Π±Π΅ΠΉΠ΄ΠΆ β€’ handlers/verification.py: ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² Telegram Co-authored-by: Qwen-Coder --- web/app.py | 31 ++++++++++++++- web/templates/dashboard.html | 7 +++- web/templates/users.html | 77 ++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 3 deletions(-) diff --git a/web/app.py b/web/app.py index 56895b0..c63526b 100644 --- a/web/app.py +++ b/web/app.py @@ -59,6 +59,12 @@ async def dashboard(request: Request, username: str = Depends(get_current_admin) select(func.count(Poll.poll_id)).where(Poll.is_active == True))).scalar() upcoming_events = (await session.execute( select(func.count(Event.id)).where(Event.is_active == True))).scalar() + + # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ количСство ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ + from database.models import VerificationRequest + pending_count = (await session.execute( + select(func.count(VerificationRequest.id)).where(VerificationRequest.status == 'pending') + )).scalar() return templates.TemplateResponse("dashboard.html", { "request": request, "username": username, @@ -66,7 +72,8 @@ async def dashboard(request: Request, username: str = Depends(get_current_admin) "users": users_count, "verified": verified_count, "messages": messages_count, "ads": active_ads, "polls": active_polls, "events": upcoming_events - } + }, + "pending_count": pending_count }) @@ -113,6 +120,24 @@ async def users_page(request: Request, search: str = "", filter: str = "", usern ig_stmt = select(InitiativeGroup.user_id).where(InitiativeGroup.is_active == True) ig_result = await session.execute(ig_stmt) ig_user_ids = set(row[0] for row in ig_result.all()) + + # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ заявки Π½Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ + from database.models import VerificationRequest + pending_stmt = select(VerificationRequest).where( + VerificationRequest.status == 'pending' + ).order_by(VerificationRequest.created_at.desc()) + pending_result = await session.execute(pending_stmt) + pending_requests = [ + { + 'id': req.id, + 'user_id': req.user_id, + 'user_name': req.user.full_name if req.user else None, + 'username': req.user.username if req.user else None, + 'apartment': req.apartment, + 'created_at': req.created_at + } + for req in pending_result.scalars().all() + ] # Бтатистика total_count = (await session.execute(select(func.count(User.user_id)))).scalar() @@ -126,7 +151,9 @@ async def users_page(request: Request, search: str = "", filter: str = "", usern return templates.TemplateResponse("users.html", {"request": request, "username": username, "users": users, "search": search, "current_filter": filter, "stats": {"total": total_count, "verified": verified_count, "unverified": unverified_count, "active_unverified": active_unverified, "ig": ig_count}, - "ig_user_ids": ig_user_ids}) + "ig_user_ids": ig_user_ids, + "pending_requests": pending_requests, + "pending_count": len(pending_requests)}) @app.post("/api/users/auto_verify") diff --git a/web/templates/dashboard.html b/web/templates/dashboard.html index 5c9b895..d6a8abc 100644 --- a/web/templates/dashboard.html +++ b/web/templates/dashboard.html @@ -96,7 +96,12 @@