Compare commits

...

2 Commits

Author SHA1 Message Date
Lukáš Kucharczyk 32f10e183e
Display total hours played on homepage
continuous-integration/drone/push Build is passing Details
2023-01-05 11:24:07 +01:00
Lukáš Kucharczyk fdb9aa8e84
Add format_duration to common.util.time 2023-01-05 11:17:01 +01:00
4 changed files with 48 additions and 3 deletions

View File

@ -1,4 +1,6 @@
## Unreleased
* Display total hours played on homepage
* Add format_duration to common.util.time
* Allow deleting sessions
* Redirect after adding game/platform/purchase/session
* Fix display of duration_manual

View File

@ -1,7 +1,44 @@
from datetime import datetime
from datetime import datetime, timedelta
from django.conf import settings
from zoneinfo import ZoneInfo
import re
def now():
return datetime.now(ZoneInfo(settings.TIME_ZONE))
def format_duration(
duration: timedelta, format_string: str = "%H hours %m minutes"
) -> str:
"""
Format timedelta into the specified format_string.
If duration is less than 60 seconds, skips formatting, returns "less than a minute".
If duration is 0, skips formatting, returns 0.
Valid format variables:
- %H hours
- %m minutes
- %s seconds
"""
seconds_in_hours = 3600
seconds_in_minute = 60
hours: int
minutes: int
seconds: int
seconds_total: int
remainder: int
seconds_total = duration.total_seconds()
if seconds_total == 0:
return 0
else:
hours = int(seconds_total // seconds_in_hours)
remainder = int(seconds_total % seconds_in_hours)
minutes = int(remainder // seconds_in_minute)
if hours == 0 and minutes == 0:
return "less than a minute"
seconds = int(minutes % seconds_in_minute)
literals = {"%H": str(hours), "%m": str(minutes), "%s": str(seconds)}
formatted_string = format_string
for pattern, replacement in literals.items():
formatted_string = re.sub(pattern, replacement, formatted_string)
return formatted_string

View File

@ -5,7 +5,7 @@
{% block content %}
<div class="text-slate-300 mx-auto max-w-screen-lg text-center">
{% if session_count > 0 %}
You have played a total of {{ session_count }} sessions.
You have played a total of {{ session_count }} sessions for a total of {{ total_duration }}.
{% else %}
Start by clicking the links at the top. To track playtime, you need to have at least 1 owned game.
{% endif %}

View File

@ -5,7 +5,8 @@ from .forms import SessionForm, PurchaseForm, GameForm, PlatformForm
from datetime import datetime
from zoneinfo import ZoneInfo
from django.conf import settings
from common.util.time import now as now_with_tz
from common.util.time import now as now_with_tz, format_duration
from django.db.models import Sum
def model_counts(request):
@ -102,4 +103,9 @@ def add_platform(request):
def index(request):
context = {}
result = Session.objects.all().aggregate(Sum("duration_calculated"))
context["total_duration"] = format_duration(
result["duration_calculated__sum"], "%H hours %m minutes"
)
context["title"] = "Index"
return render(request, "index.html", context)