timetracker/games/templates/stats.html

280 lines
14 KiB
HTML
Raw Permalink Normal View History

2023-11-01 19:18:39 +00:00
{% extends "base.html" %}
2023-11-17 20:06:57 +00:00
{% block title %}
{{ title }}
{% endblock title %}
2023-11-01 19:18:39 +00:00
{% load static %}
{% partialdef purchase-name %}
2024-08-08 12:47:51 +00:00
{% if purchase.type != 'game' %}
<c-gamelink :game_id=purchase.edition.game.id>
2024-08-08 12:47:51 +00:00
{{ purchase.name }} ({{ purchase.edition.name }} {{ purchase.get_type_display }})
</c-gamelink>
2024-08-08 12:47:51 +00:00
{% else %}
2024-09-07 21:20:17 +00:00
<c-gamelink :game_id=purchase.edition.game.id :name=purchase.edition.name />
2024-08-08 12:47:51 +00:00
{% endif %}
{% endpartialdef %}
2023-11-01 19:18:39 +00:00
{% block content %}
<div class="dark:text-white max-w-sm sm:max-w-xl lg:max-w-3xl mx-auto">
2023-11-02 08:20:09 +00:00
<div class="flex justify-center items-center">
<form method="get" class="text-center">
<label class="text-5xl text-center inline-block mb-10" for="yearSelect">Stats for:</label>
2023-11-17 20:06:57 +00:00
<select name="year"
2024-04-04 09:27:33 +00:00
id="yearSelect"
onchange="this.form.submit();"
class="mx-2">
2023-11-02 14:27:19 +00:00
{% for year_item in stats_dropdown_year_range %}
2023-11-17 20:06:57 +00:00
<option value="{{ year_item }}" {% if year == year_item %}selected{% endif %}>{{ year_item }}</option>
2023-11-02 14:27:19 +00:00
{% endfor %}
2023-11-02 08:20:09 +00:00
</select>
</form>
</div>
2023-11-21 17:19:25 +00:00
<h1 class="text-5xl text-center my-6">Playtime</h1>
<table class="responsive-table">
<tbody>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Hours</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ total_hours }}</td>
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Sessions</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ total_sessions }}</td>
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Days</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ unique_days }} ({{ unique_days_percent }}%)</td>
</tr>
2024-08-04 20:40:37 +00:00
{% if total_games %}
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Games</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ total_games }}</td>
</tr>
{% endif %}
2023-11-21 17:19:25 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Games ({{ year }})</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ total_2023_games }}</td>
</tr>
2024-08-04 20:40:37 +00:00
{% if all_finished_this_year_count %}
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Finished</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ all_finished_this_year_count }}</td>
</tr>
{% endif %}
2023-11-21 17:19:25 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Finished ({{ year }})</td>
2024-01-03 20:35:47 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ this_year_finished_this_year_count }}</td>
2023-11-21 17:19:25 +00:00
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Longest session</td>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
{{ longest_session_time }} (<c-gamelink :game_id=longest_session_game.id :name=longest_session_game.name />)
2024-08-08 12:47:51 +00:00
</td>
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Most sessions</td>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
{{ highest_session_count }} (<c-gamelink :game_id=highest_session_count_game.id :name=highest_session_count_game.name />)
2024-08-08 12:47:51 +00:00
</td>
</tr>
2023-11-21 20:57:17 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Highest session average</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
{{ highest_session_average }} (<c-gamelink :game_id=highest_session_average_game.id :name=highest_session_average_game.name />)
2023-11-21 20:57:17 +00:00
</td>
</tr>
2024-01-01 17:42:14 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">First play</td>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
<c-gamelink :game_id=first_play_game.id :name=first_play_game.name /> ({{ first_play_date }})
2024-08-08 12:47:51 +00:00
</td>
2024-01-01 17:42:14 +00:00
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Last play</td>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
<c-gamelink :game_id=last_play_game.id :name=last_play_game.name /> ({{ last_play_date }})
2024-08-08 12:47:51 +00:00
</td>
2024-01-01 17:42:14 +00:00
</tr>
2023-11-21 17:19:25 +00:00
</tbody>
</table>
2024-08-04 20:40:37 +00:00
{% if month_playtime %}
<h1 class="text-5xl text-center my-6">Playtime per month</h1>
<table class="responsive-table">
<tbody>
{% for month in month_playtimes %}
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">{{ month.month | date:"F" }}</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ month.playtime }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
2023-11-21 17:19:25 +00:00
<h1 class="text-5xl text-center my-6">Purchases</h1>
<table class="responsive-table">
<tbody>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Total</td>
2024-01-03 20:35:47 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ all_purchased_this_year_count }}</td>
2023-11-21 17:19:25 +00:00
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Refunded</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
2024-01-03 20:35:47 +00:00
{{ all_purchased_refunded_this_year_count }} ({{ refunded_percent }}%)
2023-11-21 17:19:25 +00:00
</td>
</tr>
2024-03-10 21:48:46 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Dropped</td>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ dropped_count }} ({{ dropped_percentage }}%)</td>
2024-03-10 21:48:46 +00:00
</tr>
2023-11-21 17:19:25 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Unfinished</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
2024-01-03 20:35:47 +00:00
{{ purchased_unfinished_count }} ({{ unfinished_purchases_percent }}%)
2023-11-21 17:19:25 +00:00
</td>
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Backlog Decrease</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ backlog_decrease_count }}</td>
</tr>
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2">Spendings ({{ total_spent_currency }})</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ total_spent }} ({{ spent_per_game }}/game)</td>
</tr>
</tbody>
</table>
2023-11-01 19:18:39 +00:00
<h1 class="text-5xl text-center my-6">Top games by playtime</h1>
<table class="responsive-table">
<thead>
<tr>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Name</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Playtime (hours)</th>
</tr>
</thead>
<tbody>
2023-11-02 14:08:11 +00:00
{% for game in top_10_games_by_playtime %}
2023-11-17 20:06:57 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">
<c-gamelink :game_id=game.id :name=game.name />
</td>
2023-11-17 20:06:57 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ game.formatted_playtime }}</td>
</tr>
2023-11-01 19:18:39 +00:00
{% endfor %}
</tbody>
</table>
<h1 class="text-5xl text-center my-6">Platforms by playtime</h1>
<table class="responsive-table">
<thead>
<tr>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Platform</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Playtime (hours)</th>
</tr>
</thead>
<tbody>
{% for item in total_playtime_per_platform %}
2023-11-17 20:06:57 +00:00
<tr>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ item.platform_name }}</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ item.formatted_playtime }}</td>
</tr>
2023-11-01 19:18:39 +00:00
{% endfor %}
</tbody>
</table>
2024-08-04 20:40:37 +00:00
{% if all_finished_this_year %}
<h1 class="text-5xl text-center my-6">Finished</h1>
<table class="responsive-table">
<thead>
2023-11-17 20:06:57 +00:00
<tr>
2024-08-04 20:40:37 +00:00
<th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th>
2023-11-17 20:06:57 +00:00
</tr>
2024-08-04 20:40:37 +00:00
</thead>
<tbody>
{% for purchase in all_finished_this_year %}
<tr>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{% partial purchase-name %}</td>
2024-08-04 20:40:37 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_finished | date:"d/m/Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if this_year_finished_this_year %}
<h1 class="text-5xl text-center my-6">Finished ({{ year }} games)</h1>
<table class="responsive-table">
<thead>
2023-11-17 20:06:57 +00:00
<tr>
2024-08-04 20:40:37 +00:00
<th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th>
2023-11-17 20:06:57 +00:00
</tr>
2024-08-04 20:40:37 +00:00
</thead>
<tbody>
{% for purchase in this_year_finished_this_year %}
<tr>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{% partial purchase-name %}</td>
2024-08-04 20:40:37 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_finished | date:"d/m/Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if purchased_this_year_finished_this_year %}
<h1 class="text-5xl text-center my-6">Bought and Finished ({{ year }})</h1>
<table class="responsive-table">
<thead>
2023-11-17 20:06:57 +00:00
<tr>
2024-08-04 20:40:37 +00:00
<th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th>
2023-11-17 20:06:57 +00:00
</tr>
2024-08-04 20:40:37 +00:00
</thead>
<tbody>
{% for purchase in purchased_this_year_finished_this_year %}
<tr>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{% partial purchase-name %}</td>
2024-08-04 20:40:37 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_finished | date:"d/m/Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if purchased_unfinished %}
<h1 class="text-5xl text-center my-6">Unfinished Purchases</h1>
<table class="responsive-table">
<thead>
<tr>
2024-08-04 20:40:37 +00:00
<th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Price ({{ total_spent_currency }})</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th>
</tr>
2024-08-04 20:40:37 +00:00
</thead>
<tbody>
{% for purchase in purchased_unfinished %}
<tr>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{% partial purchase-name %}</td>
2024-08-04 20:40:37 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.price }}</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_purchased | date:"d/m/Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if all_purchased_this_year %}
<h1 class="text-5xl text-center my-6">All Purchases</h1>
<table class="responsive-table">
<thead>
2023-11-17 20:06:57 +00:00
<tr>
2024-08-04 20:40:37 +00:00
<th class="px-2 sm:px-4 md:px-6 md:py-2 purchase-name truncate max-w-20char">Name</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Price ({{ total_spent_currency }})</th>
<th class="px-2 sm:px-4 md:px-6 md:py-2">Date</th>
2023-11-17 20:06:57 +00:00
</tr>
2024-08-04 20:40:37 +00:00
</thead>
<tbody>
{% for purchase in all_purchased_this_year %}
<tr>
2024-08-08 12:47:51 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{% partial purchase-name %}</td>
2024-08-04 20:40:37 +00:00
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.price }}</td>
<td class="px-2 sm:px-4 md:px-6 md:py-2 font-mono">{{ purchase.date_purchased | date:"d/m/Y" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
2023-11-01 19:18:39 +00:00
</div>
{% endblock content %}