stats: Add stats page

* add stats_table_data() function on the backend
* add stats HTML page and route

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2023-09-09 22:59:38 -07:00
parent 3760d5a941
commit cc9c5b5f43
2 changed files with 45 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ from .db import get_db, search_db
# 2023-07-24 - eating stirfry tonight. It's pretty bad. # 2023-07-24 - eating stirfry tonight. It's pretty bad.
# 2023-07-31 - In a meeting. Hope I don't get caught # 2023-07-31 - In a meeting. Hope I don't get caught
# 2023-09-09 - watching slime's stream
def route_url(url: str, args: Optional[Mapping[str, Any]] = None): def route_url(url: str, args: Optional[Mapping[str, Any]] = None):
@@ -34,6 +35,12 @@ def static_url(resource: str):
return f"{config.STATIC_ROOT}/{resource}" return f"{config.STATIC_ROOT}/{resource}"
def stats_table_data():
with get_db() as db:
curs = db.execute("SELECT board, count(*) as bans FROM bans GROUP BY board")
return sorted(list(curs.fetchall()), key=lambda row: -row["bans"])
_env = Environment( _env = Environment(
loader=PackageLoader("chanbans"), loader=PackageLoader("chanbans"),
autoescape=select_autoescape(), autoescape=select_autoescape(),
@@ -42,6 +49,7 @@ _env.globals.update(
{ {
"route_url": route_url, "route_url": route_url,
"static_url": static_url, "static_url": static_url,
"stats_table_data": stats_table_data,
} }
) )
@@ -183,6 +191,7 @@ app.add_routes(
web.get(config.HTTP_ROOT, IndexView), web.get(config.HTTP_ROOT, IndexView),
web.get(f"{config.HTTP_ROOT}/faq", template_view_factory("faq.html")), web.get(f"{config.HTTP_ROOT}/faq", template_view_factory("faq.html")),
web.get(f"{config.HTTP_ROOT}/news", template_view_factory("news.html")), web.get(f"{config.HTTP_ROOT}/news", template_view_factory("news.html")),
web.get(f"{config.HTTP_ROOT}/stats", template_view_factory("stats.html")),
] ]
) )

View File

@@ -0,0 +1,36 @@
{% extends "base.html" %}
{% block title %}Stats{% endblock title %}
{% block main %}
<h2>Statistics</h2>
<div class="infobox">
<h4>Histogram</h4>
<p>
<img src="{{static_url("histogram.svg")}}" width="33%" />
</p>
<p>
<a target="_blank" href="{{static_url("histogram.svg")}}">Click here to see the full histogram view</a>
</p>
<hr/>
<h4>Table</h4>
<p>
<table>
<thead>
<tr>
<th>Board</th>
<th>Bans</th>
</tr>
</thead>
<tbody>
{% for row in stats_table_data() %}
<tr>
<td>{{row['board']}}</td>
<td>{{row["bans"]}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</p>
</div>
{% endblock main %}