From c7c2d86ddb0b92d710736b33a0a34ac4be9c65cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Wed, 23 Jul 2025 14:29:35 +0200 Subject: [PATCH] Refactor dashboard view to group active campaigns by organization and game --- templates/twitch/dashboard.html | 196 +++++++++++++++++++++++--------- twitch/views.py | 35 +++++- 2 files changed, 177 insertions(+), 54 deletions(-) diff --git a/templates/twitch/dashboard.html b/templates/twitch/dashboard.html index ded57b1..ac94258 100644 --- a/templates/twitch/dashboard.html +++ b/templates/twitch/dashboard.html @@ -3,60 +3,144 @@ {% block title %}Dashboard - Twitch Drops Tracker{% endblock %} {% block content %} -
+
-

Dashboard

-

Track your active Twitch drop campaigns and progress.

+

Dashboard

+

Track your active Twitch drop campaigns and progress.

-
+ + +
-
-
Active Campaigns
+
+
Active Campaigns
- {% if active_campaigns %} -
- {% for campaign in active_campaigns %} -
-
-
-
- {% if campaign.image_url %} - {{ campaign.name }} - {% else %} -
- + {% if campaigns_by_org_game %} + {% for org_id, org_data in campaigns_by_org_game.items %} +
+
{{ org_data.name }}
+ + {% for game_id, game_data in org_data.games.items %} +
+
+ + {{ game_data.name }} + +
+ +
+ {% for campaign in game_data.campaigns %} +
+
+
+
+ {% if campaign.image_url %} + {{ campaign.name }} + {% else %} +
+ +
+ {% endif %} +
+
+
+
+ {{ campaign.clean_name }}
+
+
+ Active + Ends + {{ campaign.end_at|date:"M d" }} +
+ +
- {% endif %} -
-
-
-
- {{ campaign.clean_name }}
-
-

- - {{ campaign.game.display_name }} - -

-
- Active - Details -
+ {% endfor %}
{% endfor %}
+ {% endfor %} {% else %}
No active campaigns at the moment. @@ -70,26 +154,32 @@
-
-
Quick Stats
+
+
Quick Stats
-
+
-
-
-

{{ active_campaigns.count }}

-

Active Campaigns

+
+
+

{{ active_campaigns.count }}

+

Active Campaigns

-
-
-

{{ now|date:"F j, Y" }}

-

Current Date

+
+
+

{{ campaigns_by_org_game|length }}

+

Organizations

-
-
- +
+
+

{{ now|date:"M j" }}

+

Current Date

+
+
+
+ diff --git a/twitch/views.py b/twitch/views.py index 47e3ca3..5ed16ae 100644 --- a/twitch/views.py +++ b/twitch/views.py @@ -318,11 +318,44 @@ def dashboard(request: HttpRequest) -> HttpResponse: .prefetch_related(Prefetch("time_based_drops", queryset=TimeBasedDrop.objects.prefetch_related("benefits"))) ) + # Group active campaigns by organization and then by game + campaigns_by_org_game = {} + + for campaign in active_campaigns: + org_id = campaign.owner.id + org_name = campaign.owner.name + game_id = campaign.game.id + game_name = campaign.game.display_name + + # Initialize org dict if not exists + if org_id not in campaigns_by_org_game: + campaigns_by_org_game[org_id] = {"name": org_name, "games": {}} + + # Initialize game list if not exists + if game_id not in campaigns_by_org_game[org_id]["games"]: + campaigns_by_org_game[org_id]["games"][game_id] = {"name": game_name, "campaigns": []} + + # Add campaign to the game list + campaigns_by_org_game[org_id]["games"][game_id]["campaigns"].append(campaign) + + # Sort organizations alphabetically + sorted_campaigns_by_org_game = { + org_id: campaigns_by_org_game[org_id] + for org_id in sorted(campaigns_by_org_game.keys(), key=lambda k: campaigns_by_org_game[k]["name"]) + } + + # Sort games alphabetically within each organization + for org_data in sorted_campaigns_by_org_game.values(): + org_data["games"] = { + game_id: org_data["games"][game_id] for game_id in sorted(org_data["games"].keys(), key=lambda k: org_data["games"][k]["name"]) + } + return render( request, "twitch/dashboard.html", { - "active_campaigns": active_campaigns, + "active_campaigns": active_campaigns, # Keep the original list for backward compatibility + "campaigns_by_org_game": sorted_campaigns_by_org_game, # Add the new organized structure "now": now, }, )