From 249972c7fd12204c4be59b1576facfcea2fa24ed Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 9 Apr 2022 19:38:08 +0200 Subject: [PATCH] webhost: stats improvements --- WebHostLib/stats.py | 36 +++++++++++++++++++-------------- WebHostLib/templates/stats.html | 2 +- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/WebHostLib/stats.py b/WebHostLib/stats.py index 62c5dea2..76f3b430 100644 --- a/WebHostLib/stats.py +++ b/WebHostLib/stats.py @@ -1,7 +1,7 @@ from collections import Counter, defaultdict from itertools import cycle from datetime import datetime, timedelta, date -from math import pi +from math import tau from bokeh.embed import components from bokeh.palettes import Dark2_8 as palette @@ -13,7 +13,17 @@ from pony.orm import select from . import app, cache from .models import Room -pi2 = 2 * pi + +def get_db_data(): + games_played = defaultdict(Counter) + total_games = Counter() + cutoff = date.today()-timedelta(days=30000) + room: Room + for room in select(room for room in Room if room.creation_time >= cutoff): + for slot in room.seed.slots: + total_games[slot.game] += 1 + games_played[room.creation_time.date()][slot.game] += 1 + return total_games, games_played @app.route('/stats') @@ -21,24 +31,19 @@ pi2 = 2 * pi def stats(): plot = figure(title="Games played per day", x_axis_type='datetime', x_axis_label="Date", y_axis_label="Played", sizing_mode="scale_both") - games_played = defaultdict(Counter) - total_games = Counter() - room: Room - games = set() - cutoff = date.today()-timedelta(days=30000) - for room in select(room for room in Room if room.creation_time >= cutoff): - for slot in room.seed.slots: - total_games[slot.game] += 1 - games.add(slot.game) - games_played[room.creation_time.date()][slot.game] += 1 + + total_games, games_played = get_db_data() days = sorted(games_played) + cyc_palette = cycle(palette) - for game in sorted(games): + + for game in sorted(total_games): occurences = [] for day in days: occurences.append(games_played[day][game]) plot.line([datetime.combine(day, datetime.min.time()) for day in days], occurences, legend_label=game, line_width=2, color=next(cyc_palette)) + total = sum(total_games.values()) pie = figure(plot_height=350, title=f"Games played in the last 30 days. (Total: {total})", toolbar_location=None, tools="hover", tooltips=[("Game:", "@games"), ("Played:", "@count")], @@ -56,11 +61,12 @@ def stats(): data["games"].append(game) data["count"].append(count) data["start_angles"].append(current_angle) - angle = count / total * pi2 + angle = count / total * tau current_angle += angle data["end_angles"].append(current_angle) - data["colors"] = [element[1] for element in sorted((game, color) for game, color in zip(data["games"], cycle(palette)))] + data["colors"] = [element[1] for element in sorted((game, color) for game, color in + zip(data["games"], cycle(palette)))] pie.wedge(x=0.5, y=0.5, radius=0.5, start_angle="start_angles", end_angle="end_angles", fill_color="colors", source=ColumnDataSource(data=data), legend_field="games") diff --git a/WebHostLib/templates/stats.html b/WebHostLib/templates/stats.html index 39594076..1278a5e5 100644 --- a/WebHostLib/templates/stats.html +++ b/WebHostLib/templates/stats.html @@ -1,7 +1,7 @@ {% extends 'pageWrapper.html' %} {% block head %} - Site Map + Statistics {{ css_resources|indent(4)|safe }} {{ js_resources|indent(4)|safe }}