Only show DropCampaignDetails

This commit is contained in:
Joakim Hellsén 2026-01-09 21:35:47 +01:00
commit 026bc57f77
No known key found for this signature in database
2 changed files with 32 additions and 9 deletions

View file

@ -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/<twitch_id>/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."""

View file

@ -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(