From bd66d2f50385c80e4c6a8f0bf6777a8232c1e1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Sun, 5 Apr 2026 05:16:59 +0200 Subject: [PATCH] Fix chzzk campaign feed filter being broken by new raw_json_v2 field --- chzzk/tests/test_views.py | 64 +++++++++++++++++++++++++++++++++++++++ chzzk/views.py | 5 ++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/chzzk/tests/test_views.py b/chzzk/tests/test_views.py index 465e959..38e84be 100644 --- a/chzzk/tests/test_views.py +++ b/chzzk/tests/test_views.py @@ -103,3 +103,67 @@ class ChzzkDashboardViewTests(TestCase): assert "watch" in content assert "100" in content assert "No" in content # ios_based_reward=False + + def test_campaign_feed_only_includes_campaigns_with_raw_json(self) -> None: + """Test that the RSS feed only includes campaigns with raw JSON data.""" + now: datetime = timezone.now() + + excluded: ChzzkCampaign = ChzzkCampaign.objects.create( + campaign_no=3001, + title="No JSON campaign", + description="Excluded because no raw JSON", + category_type="game", + category_id="1", + category_value="TestGame", + service_id="chzzk", + state="ACTIVE", + start_date=now - timedelta(days=1), + end_date=now + timedelta(days=1), + has_ios_based_reward=False, + drops_campaign_not_started=False, + source_api="unit-test", + ) + + included_v1: ChzzkCampaign = ChzzkCampaign.objects.create( + campaign_no=3002, + title="JSON v1 campaign", + description="Included because raw_json_v1 is present", + category_type="game", + category_id="1", + category_value="TestGame", + service_id="chzzk", + state="ACTIVE", + start_date=now - timedelta(days=1), + end_date=now + timedelta(days=1), + has_ios_based_reward=False, + drops_campaign_not_started=False, + source_api="unit-test", + raw_json_v1={"foo": "bar"}, + ) + + included_v2: ChzzkCampaign = ChzzkCampaign.objects.create( + campaign_no=3003, + title="JSON v2 campaign", + description="Included because raw_json_v2 is present", + category_type="game", + category_id="1", + category_value="TestGame", + service_id="chzzk", + state="ACTIVE", + start_date=now - timedelta(days=2), + end_date=now + timedelta(days=2), + has_ios_based_reward=False, + drops_campaign_not_started=False, + source_api="unit-test", + raw_json_v2={"foo": "bar"}, + ) + + response: _MonkeyPatchedWSGIResponse = self.client.get( + reverse("chzzk:campaign_feed"), + ) + assert response.status_code == 200 + + content: str = response.content.decode() + assert included_v1.title in content + assert included_v2.title in content + assert excluded.title not in content diff --git a/chzzk/views.py b/chzzk/views.py index 3cb332b..6146c31 100644 --- a/chzzk/views.py +++ b/chzzk/views.py @@ -1,5 +1,6 @@ from typing import TYPE_CHECKING +from django.db.models import Q from django.db.models.query import QuerySet from django.shortcuts import get_object_or_404 from django.shortcuts import render @@ -112,7 +113,9 @@ class ChzzkCampaignFeed(TTVDropsBaseFeed): QuerySet: A queryset of ChzzkCampaign objects. """ limit: int = self._limit if self._limit is not None else 50 - return models.ChzzkCampaign.objects.filter(raw_json__isnull=False).order_by( + return models.ChzzkCampaign.objects.filter( + Q(raw_json_v1__isnull=False) | Q(raw_json_v2__isnull=False), + ).order_by( "-start_date", )[:limit]