- {{ game_data.name }} -
-{{ campaign.clean_name }}
- - - - - --
- {% 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 }} +
+++++
++ + {% endfor %}+ {% for campaign in game_data.campaigns %} +++ - {% endfor %} -+ +-+
{{ campaign.clean_name }}
+ + + + + ++ Channels: ++ {% else %} + {% if campaign.game.twitch_directory_url %} +-
+ {% 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 + {% endif %} {% else %} {% if campaign.game.twitch_directory_url %} @@ -118,25 +109,38 @@ Hover over the end time to see the exact date and time. - Go to a participating live channel + title="Open Twitch category page for {{ campaign.game.display_name }} with Drops filter"> + Browse {{ campaign.game.display_name }} category {% else %} -
- Failed to get Twitch directory URL :( +
- Failed to get Twitch category URL :( {% endif %} {% endif %} -
- + + Go to a participating live channel + +
+ {% else %} +- Failed to get Twitch directory URL :(
+ {% endif %} + {% endif %} +
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, }, )