From 0060f4d8f6e9a608a8a2426eb56897e28b99f30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Thu, 8 Jan 2026 19:41:05 +0100 Subject: [PATCH] Update dashboard --- templates/twitch/dashboard.html | 210 ++++++++++++++++---------------- twitch/views.py | 29 +---- 2 files changed, 113 insertions(+), 126 deletions(-) diff --git a/templates/twitch/dashboard.html b/templates/twitch/dashboard.html index 2d27fd5..817f3f2 100644 --- a/templates/twitch/dashboard.html +++ b/templates/twitch/dashboard.html @@ -7,7 +7,7 @@

Twitch Drops

-Drops are sorted alphabetically by organization and game. Click on a campaign or game title to see more details.
+Latest drops are shown first within each game. Click on a campaign or game title to see more details.
 Hover over the end time to see the exact date and time.
 
@@ -18,99 +18,90 @@ Hover over the end time to see the exact date and time. {% if campaigns_by_org_game %} {% for org_id, org_data in campaigns_by_org_game.items %} -
-

- {% if org_data.name %} - {{ org_data.name }} - {% else %} - Organization {{ org_id }} - {% endif %} -

- {% for game_id, game_data in org_data.games.items %} -
-
-

- {{ game_data.name }} -

-
-
-
- Box art for {{ game_data.name }} -
-
-
- {% for campaign in game_data.campaigns %} -
-
- - Image for {{ campaign.name }} -

{{ campaign.clean_name }}

-
- - - - -
- Channels: -
    - {% if campaign.allow_is_enabled %} - {% if campaign.allow_channels.all %} - {% for channel in campaign.allow_channels.all %} - {% if forloop.counter <= 5 %} -
  • - - {{ channel.display_name }} - -
  • - {% endif %} - {% endfor %} - {% if campaign.allow_channels.all|length > 5 %} -
  • - ... and {{ campaign.allow_channels.all|length|add:"-5" }} more + {% for game_id, game_data in org_data.games.items %} +
    +
    +

    + {{ game_data.name }} +

    +
    +
    +
    + Box art for {{ game_data.name }} +
    +
    +
    + {% for campaign in game_data.campaigns %} +
    +
    + + Image for {{ campaign.name }} +

    {{ campaign.clean_name }}

    +
    + + + + +
    + Channels: + -
    + {% else %} + {% if campaign.game.twitch_directory_url %} +
  • + + Go to a participating live channel + +
  • + {% else %} +
  • Failed to get Twitch directory URL :(
  • + {% endif %} + {% endif %} +
-
- {% endfor %} -
+
+
+ {% endfor %} - - {% endfor %} -
+ + + {% endfor %} {% endfor %} {% else %}

No active campaigns at the moment.

diff --git a/twitch/views.py b/twitch/views.py index b0e4cec..7f4f94e 100644 --- a/twitch/views.py +++ b/twitch/views.py @@ -641,9 +641,11 @@ def dashboard(request: HttpRequest) -> HttpResponse: .prefetch_related( "allow_channels", ) + .order_by("-start_at") ) - campaigns_by_org_game: dict[str, Any] = {} + # Use OrderedDict to preserve insertion order (newest campaigns first) + campaigns_by_org_game: OrderedDict[str, Any] = OrderedDict() for campaign in active_campaigns: owner: Organization | None = campaign.game.owner @@ -654,7 +656,7 @@ def dashboard(request: HttpRequest) -> HttpResponse: game_name: str = campaign.game.display_name if org_id not in campaigns_by_org_game: - campaigns_by_org_game[org_id] = {"name": org_name, "games": {}} + campaigns_by_org_game[org_id] = {"name": org_name, "games": OrderedDict()} if game_id not in campaigns_by_org_game[org_id]["games"]: campaigns_by_org_game[org_id]["games"][game_id] = { @@ -663,33 +665,14 @@ def dashboard(request: HttpRequest) -> HttpResponse: "campaigns": [], } - campaigns_by_org_game[org_id]["games"][game_id]["campaigns"].append( - campaign, - ) - - sorted_campaigns_by_org_game: dict[str, Any] = { - 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"], - ) - } - - 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"], - ) - } + campaigns_by_org_game[org_id]["games"][game_id]["campaigns"].append(campaign) return render( request, "twitch/dashboard.html", { "active_campaigns": active_campaigns, - "campaigns_by_org_game": sorted_campaigns_by_org_game, + "campaigns_by_org_game": campaigns_by_org_game, "now": now, }, )