This commit is contained in:
2026-01-16 13:13:11 +01:00
parent 3801949fdb
commit d19afdb024
+48 -4
View File
@@ -1,4 +1,5 @@
import logging import logging
from datetime import datetime
from typing import Any, Callable, TypedDict from typing import Any, Callable, TypedDict
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
@@ -11,9 +12,9 @@ from django.template.loader import render_to_string
from django.urls import reverse from django.urls import reverse
from common.components import A, Button, Icon from common.components import A, Button, Icon
from common.time import dateformat, local_strftime from common.time import dateformat, format_duration, local_strftime
from games.forms import PlayEventForm from games.forms import PlayEventForm
from games.models import Game, PlayEvent from games.models import Game, PlayEvent, Session
logger = logging.getLogger("games") logger = logging.getLogger("games")
@@ -83,6 +84,39 @@ def create_playevent_tabledata(
} }
def _get_formatted_playtime_for_game_sessions_in_range(
game: Game,
start_timestamp: datetime | None = None,
end_timestamp: datetime | None = None,
) -> str:
"""
Calculates and formats the total playtime for a game's sessions
between specified start and end timestamps. If timestamps are not provided,
it uses the earliest and latest session start times for the game.
Returns "0h 00m" if no sessions exist for the game or if the range is invalid.
"""
sessions_queryset = game.sessions.all()
if not sessions_queryset.exists():
return "0h 00m"
actual_start_ts = (
start_timestamp
if start_timestamp is not None
else sessions_queryset.earliest("timestamp_start").timestamp_start
)
actual_end_ts = (
end_timestamp
if end_timestamp is not None
else sessions_queryset.latest("timestamp_start").timestamp_start
)
sessions_in_range = sessions_queryset.filter(
timestamp_start__gte=actual_start_ts, timestamp_start__lte=actual_end_ts
)
return format_duration(sessions_in_range.total_duration_unformatted(), "%Hh %mm")
@login_required @login_required
def list_playevents(request: HttpRequest) -> HttpResponse: def list_playevents(request: HttpRequest) -> HttpResponse:
page_number = request.GET.get("page", 1) page_number = request.GET.get("page", 1)
@@ -115,8 +149,18 @@ def add_playevent(request: HttpRequest, game_id: int = 0) -> HttpResponse:
# coming from add_playevent_for_game url path # coming from add_playevent_for_game url path
game = get_object_or_404(Game, id=game_id) game = get_object_or_404(Game, id=game_id)
initial["game"] = game initial["game"] = game
initial["started"] = game.sessions.earliest().timestamp_start try:
initial["ended"] = game.sessions.latest().timestamp_start started_ts = game.sessions.earliest("timestamp_start").timestamp_start
ended_ts = game.sessions.latest("timestamp_start").timestamp_start
initial["started"] = started_ts
initial["ended"] = ended_ts
initial["note"] = _get_formatted_playtime_for_game_sessions_in_range(
game, started_ts, ended_ts
)
except Session.DoesNotExist:
initial["started"] = None
initial["ended"] = None
initial["note"] = "0h 00m"
form = PlayEventForm(request.POST or None, initial=initial) form = PlayEventForm(request.POST or None, initial=initial)
if form.is_valid(): if form.is_valid():
form.save() form.save()