From b2fea7854d134728a8ac44caddb4e2fd625ce3b7 Mon Sep 17 00:00:00 2001 From: berkio_admin_gitea Date: Thu, 9 Jul 2026 19:54:57 +0000 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B4=D0=BC=D0=B8=D0=BD=D0=BA=D0=B0:=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=20=C2=AB=D0=A0=D0=B5=D0=B3?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=C2=BB=20(=D0=B0=D0=BA=D0=BA=D0=B0=D1=83=D0=BD=D1=82,=20?= =?UTF-8?q?=D0=B8=D0=BC=D1=8F,=20=D1=81=D0=BF=D0=BE=D1=81=D0=BE=D0=B1,=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=87=D1=82=D0=B0,=20=D0=B4=D0=B0=D1=82=D0=B0,=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Источник — WEB_ACCOUNTS (created_at, способ = префикс account_id) + обогащение именем/почтой из последней сессии WEB_SESSIONS. Co-Authored-By: Claude Opus 4.8 --- app/main.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/app/main.py b/app/main.py index ae92ec2..9e00344 100644 --- a/app/main.py +++ b/app/main.py @@ -3161,6 +3161,12 @@ _ADMIN_HTML = """ +
+

Регистрации пользователей

+
+
ПользовательИмяСпособПочтаДатаПодписка
+
+

Активные подписки

@@ -3215,6 +3221,14 @@ _ADMIN_HTML = """ return ''; }).join('') : ''; + // Регистрации пользователей + var regs = (d.registrations && d.registrations.list) || []; + document.getElementById('reg-count').textContent = d.registrations ? '· всего ' + d.registrations.count : ''; + document.getElementById('t-regs').innerHTML = regs.length ? regs.map(function(u){ + return ''; + }).join('') : ''; + // Активность по дням — три малых кратных (заходы / документы сайт+бот / страницы) var dl = d.daily || []; // 14 дней, старые слева function dd(x){ return x.day.slice(8)+'.'+x.day.slice(5,7); } @@ -3517,6 +3531,31 @@ def _admin_collect_stats() -> dict: "SELECT account_id, sub_until FROM WEB_ACCOUNTS WHERE sub_until > ? ORDER BY sub_until DESC", (now,))] out["subs"] = {"active_count": len(subs), "list": subs[:300]} + # Регистрации пользователей (аккаунты сайта): способ = префикс account_id, + # имя/почту берём из последней сессии (WEB_SESSIONS), для email-входа — из самого id. + reg_rows = con.execute( + "SELECT a.account_id, a.created_at, a.sub_until, a.pm_email, " + "(SELECT s.name FROM WEB_SESSIONS s WHERE s.account_id=a.account_id ORDER BY s.created_at DESC LIMIT 1) AS s_name, " + "(SELECT s.email FROM WEB_SESSIONS s WHERE s.account_id=a.account_id ORDER BY s.created_at DESC LIMIT 1) AS s_email, " + "(SELECT s.provider FROM WEB_SESSIONS s WHERE s.account_id=a.account_id ORDER BY s.created_at DESC LIMIT 1) AS s_prov " + "FROM WEB_ACCOUNTS a ORDER BY a.created_at DESC LIMIT 300").fetchall() + _meth = {"tg": "Telegram", "telegram": "Telegram", "yandex": "Яндекс", + "vk": "VK", "email": "Почта"} + regs = [] + for r in reg_rows: + aid = r["account_id"] or "" + prov, _sep, ident = aid.partition(":") + email = ident if prov == "email" else (r["s_email"] or r["pm_email"] or "") + regs.append({ + "account_id": aid, + "name": r["s_name"] or "", + "method": _meth.get((r["s_prov"] or prov or "").lower(), prov or "—"), + "email": email, + "created_at": r["created_at"], + "sub_active": bool(r["sub_until"] and r["sub_until"] > now), + }) + reg_total = con.execute("SELECT COUNT(*) c FROM WEB_ACCOUNTS").fetchone()["c"] + out["registrations"] = {"count": reg_total, "list": regs} # Платежи pays = [dict(r) for r in con.execute( "SELECT payment_id, amount, currency, status, purpose, email, created_at, paid_at "
АккаунтАктивна доОсталось
'+esc(s.account_id)+''+dOnly(s.sub_until)+''+daysLeft(s.sub_until)+'
Нет активных подписок
'+esc(u.account_id)+''+esc(u.name||'—')+''+esc(u.method)+ + ''+esc(u.email||'—')+''+dts(u.created_at)+''+(u.sub_active?'✓':'—')+'
Пока нет регистраций