Enhance profile view to display game subscriptions with inheritance details for improved clarity.

This commit is contained in:
Joakim Hellsén 2025-09-02 03:35:00 +02:00
commit f879dc76ca
2 changed files with 44 additions and 5 deletions

View file

@ -11,7 +11,7 @@ from django.views.generic import CreateView
from accounts.forms import CustomUserCreationForm from accounts.forms import CustomUserCreationForm
from accounts.models import User from accounts.models import User
from twitch.models import NotificationSubscription from twitch.models import Game, NotificationSubscription
if TYPE_CHECKING: if TYPE_CHECKING:
from django.forms import BaseModelForm from django.forms import BaseModelForm
@ -86,14 +86,50 @@ def profile_view(request: HttpRequest) -> HttpResponse:
HttpResponse: Rendered profile template. HttpResponse: Rendered profile template.
""" """
subscriptions = NotificationSubscription.objects.filter(user=request.user) # type: ignore[misc] subscriptions = NotificationSubscription.objects.filter(user=request.user) # type: ignore[misc]
game_subscriptions = subscriptions.filter(game_id__isnull=False)
# Direct game subscriptions
direct_game_subscriptions = subscriptions.filter(game_id__isnull=False)
# Organization subscriptions
org_subscriptions = subscriptions.filter(organization_id__isnull=False) org_subscriptions = subscriptions.filter(organization_id__isnull=False)
# Get games from organization subscriptions (inherited games)
inherited_games = Game.objects.filter(owner__in=org_subscriptions.values("organization"))
# Create mapping of inherited game IDs to their organization names
inherited_game_org_map = {}
for game in inherited_games:
if game.owner:
inherited_game_org_map[game.id] = game.owner.name
# Combine direct and inherited game IDs
direct_game_ids = direct_game_subscriptions.values_list("game_id", flat=True)
inherited_game_ids = inherited_games.values_list("id", flat=True)
all_game_ids = set(direct_game_ids) | set(inherited_game_ids)
# Get all games (direct + inherited)
game_subscriptions_combined = Game.objects.filter(id__in=all_game_ids)
# Get direct game IDs for template indication
direct_game_ids = list(direct_game_subscriptions.values_list("game_id", flat=True))
# Get all games (direct + inherited) with inheritance info
games_with_inheritance = []
for game in game_subscriptions_combined:
is_inherited = game.id not in direct_game_ids
inherited_from = inherited_game_org_map.get(game.id) if is_inherited else None
games_with_inheritance.append({
"game": game,
"is_inherited": is_inherited,
"inherited_from": inherited_from,
})
return render( return render(
request, request,
"accounts/profile.html", "accounts/profile.html",
{ {
"user": request.user, "user": request.user,
"game_subscriptions": game_subscriptions, "games_with_inheritance": games_with_inheritance,
"org_subscriptions": org_subscriptions, "org_subscriptions": org_subscriptions,
}, },
) )

View file

@ -29,9 +29,12 @@
<h2>Will get notifications for these subscriptions:</h2> <h2>Will get notifications for these subscriptions:</h2>
<h3>Games</h3> <h3>Games</h3>
<ul> <ul>
{% for subscription in game_subscriptions %} {% for item in games_with_inheritance %}
<li> <li>
<a href="{% url 'twitch:game_detail' subscription.game_id %}">{{ subscription.game.display_name }}</a> <a href="{% url 'twitch:game_detail' item.game.id %}">{{ item.game.display_name }}</a>
{% if item.is_inherited %}
<span style="font-size: 0.85em; color: #666; font-style: italic;">(inherited from {{ item.inherited_from }})</span>
{% endif %}
</li> </li>
{% empty %} {% empty %}
<li>You have no game subscriptions yet.</li> <li>You have no game subscriptions yet.</li>