From 026bc57f7743d7c741b96f94ecb776fa32deff6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Fri, 9 Jan 2026 21:35:47 +0100 Subject: [PATCH] Only show DropCampaignDetails --- twitch/feeds.py | 21 ++++++++++++++++++--- twitch/views.py | 20 ++++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/twitch/feeds.py b/twitch/feeds.py index b1c80c2..a022b33 100644 --- a/twitch/feeds.py +++ b/twitch/feeds.py @@ -467,7 +467,12 @@ class DropCampaignFeed(Feed): def items(self) -> list[DropCampaign]: """Return the latest 100 drop campaigns.""" - return list(DropCampaign.objects.select_related("game").order_by("-added_at")[:100]) + return list( + DropCampaign.objects + .filter(operation_name="DropCampaignDetails") + .select_related("game") + .order_by("-added_at")[:100], + ) def item_title(self, item: Model) -> SafeText: """Return the campaign name as the item title (SafeText for RSS).""" @@ -609,7 +614,12 @@ class GameCampaignFeed(Feed): def items(self, obj: Game) -> list[DropCampaign]: """Return the latest 100 drop campaigns for this game, ordered by most recently added.""" - return list(DropCampaign.objects.filter(game=obj).select_related("game").order_by("-added_at")[:100]) + return list( + DropCampaign.objects + .filter(game=obj, operation_name="DropCampaignDetails") + .select_related("game") + .order_by("-added_at")[:100], + ) # MARK: /rss/organizations//campaigns/ @@ -642,7 +652,12 @@ class OrganizationCampaignFeed(Feed): def items(self, obj: Organization) -> list[DropCampaign]: """Return the latest 100 drop campaigns for this organization, ordered by most recently added.""" - return list(DropCampaign.objects.filter(game__owner=obj).select_related("game").order_by("-added_at")[:100]) + return list( + DropCampaign.objects + .filter(game__owner=obj, operation_name="DropCampaignDetails") + .select_related("game") + .order_by("-added_at")[:100], + ) def item_author_name(self, item: DropCampaign) -> str: """Return the author name for the campaign, typically the game name.""" diff --git a/twitch/views.py b/twitch/views.py index f67c07c..62e9771 100644 --- a/twitch/views.py +++ b/twitch/views.py @@ -68,6 +68,7 @@ def search_view(request: HttpRequest) -> HttpResponse: results["games"] = Game.objects.filter(Q(name__istartswith=query) | Q(display_name__istartswith=query)) results["campaigns"] = DropCampaign.objects.filter( Q(name__istartswith=query) | Q(description__icontains=query), + operation_name="DropCampaignDetails", ).select_related("game") results["drops"] = TimeBasedDrop.objects.filter(name__istartswith=query).select_related("campaign") results["benefits"] = DropBenefit.objects.filter(name__istartswith=query).prefetch_related( @@ -83,6 +84,7 @@ def search_view(request: HttpRequest) -> HttpResponse: ) results["campaigns"] = DropCampaign.objects.filter( Q(name__icontains=query) | Q(description__icontains=query), + operation_name="DropCampaignDetails", ).select_related("game") results["drops"] = TimeBasedDrop.objects.filter( name__icontains=query, @@ -204,7 +206,7 @@ def drop_campaign_list_view(request: HttpRequest) -> HttpResponse: game_filter: str | None = request.GET.get("game") status_filter: str | None = request.GET.get("status") per_page: int = 100 - queryset: QuerySet[DropCampaign] = DropCampaign.objects.all() + queryset: QuerySet[DropCampaign] = DropCampaign.objects.filter(operation_name="DropCampaignDetails") if game_filter: queryset = queryset.filter(game__twitch_id=game_filter) @@ -311,7 +313,10 @@ def drop_campaign_detail_view(request: HttpRequest, twitch_id: str) -> HttpRespo Http404: If the campaign is not found. """ try: - campaign: DropCampaign = DropCampaign.objects.select_related("game__owner").get(twitch_id=twitch_id) + campaign: DropCampaign = DropCampaign.objects.select_related("game__owner").get( + twitch_id=twitch_id, + operation_name="DropCampaignDetails", + ) except DropCampaign.DoesNotExist as exc: msg = "No campaign found matching the query" raise Http404(msg) from exc @@ -527,7 +532,7 @@ class GameDetailView(DetailView): now: datetime.datetime = timezone.now() all_campaigns: QuerySet[DropCampaign] = ( DropCampaign.objects - .filter(game=game) + .filter(game=game, operation_name="DropCampaignDetails") .select_related("game__owner") .prefetch_related( Prefetch( @@ -636,7 +641,7 @@ def dashboard(request: HttpRequest) -> HttpResponse: now: datetime.datetime = timezone.now() active_campaigns: QuerySet[DropCampaign] = ( DropCampaign.objects - .filter(start_at__lte=now, end_at__gte=now) + .filter(start_at__lte=now, end_at__gte=now, operation_name="DropCampaignDetails") .select_related("game__owner") .prefetch_related( "allow_channels", @@ -695,6 +700,7 @@ def debug_view(request: HttpRequest) -> HttpResponse: # Campaigns with missing or obviously broken images broken_image_campaigns: QuerySet[DropCampaign] = DropCampaign.objects.filter( Q(image_url__isnull=True) | Q(image_url__exact="") | ~Q(image_url__startswith="http"), + operation_name="DropCampaignDetails", ).select_related("game") # Benefits with missing images @@ -714,12 +720,14 @@ def debug_view(request: HttpRequest) -> HttpResponse: # Campaigns with invalid dates (start after end or missing either) invalid_date_campaigns: QuerySet[DropCampaign] = DropCampaign.objects.filter( Q(start_at__gt=F("end_at")) | Q(start_at__isnull=True) | Q(end_at__isnull=True), + operation_name="DropCampaignDetails", ).select_related("game") # Duplicate campaign names per game. # We retrieve the game's name for user-friendly display. duplicate_name_campaigns = ( DropCampaign.objects + .filter(operation_name="DropCampaignDetails") .values("game__display_name", "name", "game__twitch_id") .annotate(name_count=Count("twitch_id")) .filter(name_count__gt=1) @@ -729,7 +737,7 @@ def debug_view(request: HttpRequest) -> HttpResponse: # Campaigns currently active but image missing active_missing_image: QuerySet[DropCampaign] = ( DropCampaign.objects - .filter(start_at__lte=now, end_at__gte=now) + .filter(start_at__lte=now, end_at__gte=now, operation_name="DropCampaignDetails") .filter( Q(image_url__isnull=True) | Q(image_url__exact="") | ~Q(image_url__startswith="http"), ) @@ -899,7 +907,7 @@ class ChannelDetailView(DetailView): now: datetime.datetime = timezone.now() all_campaigns: QuerySet[DropCampaign] = ( DropCampaign.objects - .filter(allow_channels=channel) + .filter(allow_channels=channel, operation_name="DropCampaignDetails") .select_related("game__owner") .prefetch_related( Prefetch(