diff --git a/core/tests/test_views.py b/core/tests/test_views.py index e97b8a7..938c24b 100644 --- a/core/tests/test_views.py +++ b/core/tests/test_views.py @@ -1,3 +1,5 @@ +from datetime import UTC +from datetime import datetime as dt from typing import TYPE_CHECKING from django.test import RequestFactory @@ -6,6 +8,9 @@ from django.test.utils import override_settings from django.urls import reverse from core.views import _build_base_url +from kick.models import KickCategory +from kick.models import KickDropCampaign +from kick.models import KickOrganization if TYPE_CHECKING: from django.test.client import _MonkeyPatchedWSGIResponse @@ -43,3 +48,76 @@ class TestSitemapViews(TestCase): ) assert response.status_code == 200 assert " KickOrganization: + return KickOrganization.objects.create(kick_id=kick_id, name=name) + + def _make_category(self, kick_id: int, name: str) -> KickCategory: + return KickCategory.objects.create( + kick_id=kick_id, + name=name, + slug=name.lower().replace(" ", "-"), + ) + + def _make_campaign( + self, + kick_id: str, + name: str, + category: KickCategory | None, + organization: KickOrganization, + ) -> KickDropCampaign: + return KickDropCampaign.objects.create( + kick_id=kick_id, + name=name, + status="active", + starts_at=dt(2020, 1, 1, tzinfo=UTC), + ends_at=dt(2099, 12, 31, tzinfo=UTC), + organization=organization, + category=category, + rule_id=1, + rule_name="Watch to redeem", + is_fully_imported=True, + ) + + def test_shows_organization_under_game_heading(self) -> None: + """Organization name should appear under the game heading, not per-campaign.""" + org: KickOrganization = self._make_org("org-test-1", "Test Studio") + cat: KickCategory = self._make_category(999, "Test Game") + self._make_campaign("camp-test-1", "Test Campaign", cat, org) + + response: _MonkeyPatchedWSGIResponse = self.client.get( + reverse("core:dashboard"), + ) + content: str = response.content.decode() + + assert response.status_code == 200 + # Organization should be near the game heading + assert "Test Studio" in content + # Game name should appear + assert "Test Game" in content + + def test_unknown_category_shows_org_link_in_heading(self) -> None: + """Campaigns without a category should show org name as the heading.""" + org: KickOrganization = self._make_org("org-uncat-1", "Uncategorized Org") + campaign: KickDropCampaign = self._make_campaign( + "camp-uncat-1", + "No Category Campaign", + None, + org, + ) + + response: _MonkeyPatchedWSGIResponse = self.client.get( + reverse("core:dashboard"), + ) + content: str = response.content.decode() + + assert response.status_code == 200 + assert campaign.name in content + # Org name should appear as a link to the org detail page + org_url: str = reverse("kick:organization_detail", args=[org.kick_id]) + assert org_url in content + assert "Unknown Category" not in content diff --git a/core/views.py b/core/views.py index b8e1af7..6b20b55 100644 --- a/core/views.py +++ b/core/views.py @@ -1062,8 +1062,14 @@ def dashboard(request: HttpRequest) -> HttpResponse: "image": game_image, "kick_id": game_kick_id, "campaigns": [], + "organizations": [], } + if campaign.organization: + org = campaign.organization + if org not in kick_campaigns_by_game[game_key]["organizations"]: + kick_campaigns_by_game[game_key]["organizations"].append(org) + kick_campaigns_by_game[game_key]["campaigns"].append({ "campaign": campaign, "channels": list(campaign.channels.all()), diff --git a/templates/core/dashboard.html b/templates/core/dashboard.html index f15695d..c19674e 100644 --- a/templates/core/dashboard.html +++ b/templates/core/dashboard.html @@ -203,6 +203,15 @@ {% endif %} + {% if campaign.ends_at %} +

+ Ends: + +

+ {% endif %} {% if campaign.game %}

Game: @@ -213,15 +222,6 @@ Type: Site-wide reward campaign

{% endif %} - {% if campaign.ends_at %} -

- Ends: - -

- {% endif %} {% if campaign.summary %}

{{ campaign.summary }}

{% endif %} @@ -254,10 +254,24 @@

{% if game_data.kick_id %} {{ game_data.name }} + {% elif game_data.organizations %} + {% for org in game_data.organizations %} + {{ org.name }} + {% if not forloop.last %}, {% endif %} + {% endfor %} {% else %} {{ game_data.name }} {% endif %}

+ {% if game_data.kick_id and game_data.organizations %} +
+ Organization: + {% for org in game_data.organizations %} + {{ org.name }} + {% if not forloop.last %}, {% endif %} + {% endfor %} +
+ {% endif %}
@@ -315,12 +329,6 @@ text-align: left"> Started {{ campaign_data.campaign.starts_at|timesince }} ago - {% if campaign_data.campaign.organization %} -

- Organization: - {{ campaign_data.campaign.organization.name }} -

- {% endif %}
Channels: