forked from retoor/devplacepy
90 lines
2.8 KiB
Python
90 lines
2.8 KiB
Python
# retoor <retoor@molodetz.nl>
|
|
|
|
import logging
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse, JSONResponse
|
|
from devplacepy.responses import respond
|
|
from devplacepy.schemas.statistics import StatisticsOut
|
|
from devplacepy.seo import base_seo_context, site_url, website_schema
|
|
from devplacepy.services.statistics.build import build_statistics_tab
|
|
from devplacepy.services.statistics.common import VALID_TABS
|
|
from devplacepy.utils import require_admin
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
TAB_LABELS = (
|
|
("overview", "Overview", "\U0001f4ca"),
|
|
("visitors", "Visitors", "\U0001f441\ufe0f"),
|
|
("members", "Members", "\U0001f465"),
|
|
("content", "Content", "\U0001f4dd"),
|
|
("engagement", "Engagement", "\U0001f525"),
|
|
("social", "Social", "\U0001f91d"),
|
|
("ai", "AI", "\U0001f916"),
|
|
("devii", "Devii", "\u2728"),
|
|
("services", "Services", "\u2699\ufe0f"),
|
|
("containers", "Containers", "\U0001f4e6"),
|
|
("game", "Game", "\U0001f3ae"),
|
|
("awards", "Awards", "\U0001f3c6"),
|
|
("moderation", "Moderation", "\U0001f6e1\ufe0f"),
|
|
("tools", "Tools", "\U0001f527"),
|
|
("storage", "Storage", "\U0001f4be"),
|
|
)
|
|
|
|
|
|
@router.get("/statistics", response_class=HTMLResponse)
|
|
async def admin_statistics(request: Request, tab: str = "overview", hours: int = 168):
|
|
admin = require_admin(request)
|
|
active = tab if tab in VALID_TABS else "overview"
|
|
base = site_url(request)
|
|
seo_ctx = base_seo_context(
|
|
request,
|
|
title="Statistics - Admin",
|
|
description="Platform statistics with trends, visitors, content, engagement, and operations.",
|
|
robots="noindex,nofollow",
|
|
breadcrumbs=[
|
|
{"name": "Home", "url": "/feed"},
|
|
{"name": "Admin", "url": "/admin"},
|
|
{"name": "Statistics", "url": "/admin/statistics"},
|
|
],
|
|
schemas=[website_schema(base)],
|
|
)
|
|
initial = build_statistics_tab(active, hours, compare=True, top_n=10)
|
|
tabs = [
|
|
{"key": key, "label": label, "icon": icon, "active": key == active}
|
|
for key, label, icon in TAB_LABELS
|
|
]
|
|
return respond(
|
|
request,
|
|
"admin_statistics.html",
|
|
{
|
|
**seo_ctx,
|
|
"request": request,
|
|
"user": admin,
|
|
"admin_section": "statistics",
|
|
"tabs": tabs,
|
|
"active_tab": active,
|
|
"window_hours": hours,
|
|
"initial": initial,
|
|
},
|
|
model=StatisticsOut,
|
|
)
|
|
|
|
|
|
@router.get("/statistics/data")
|
|
async def admin_statistics_data(
|
|
request: Request,
|
|
tab: str = "overview",
|
|
hours: int = 168,
|
|
compare: int = 1,
|
|
top_n: int = 10,
|
|
):
|
|
require_admin(request)
|
|
return JSONResponse(
|
|
build_statistics_tab(
|
|
tab,
|
|
hours,
|
|
compare=bool(compare),
|
|
top_n=top_n,
|
|
)
|
|
) |