Add types

This commit is contained in:
Joakim Hellsén 2026-02-08 11:55:25 +01:00
commit f4dd987f73
Signed by: Joakim Hellsén
SSH key fingerprint: SHA256:/9h/CsExpFp+PRhsfA0xznFx2CGfTT5R/kpuFfUgEQk

View file

@ -7,8 +7,10 @@ from collections import OrderedDict
from collections import defaultdict from collections import defaultdict
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import Any from typing import Any
from typing import Literal
from django.core.paginator import EmptyPage from django.core.paginator import EmptyPage
from django.core.paginator import Page
from django.core.paginator import PageNotAnInteger from django.core.paginator import PageNotAnInteger
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.core.serializers import serialize from django.core.serializers import serialize
@ -120,7 +122,6 @@ def search_view(request: HttpRequest) -> HttpResponse:
Q(title__istartswith=query) | Q(description__icontains=query), Q(title__istartswith=query) | Q(description__icontains=query),
).select_related("badge_set") ).select_related("badge_set")
else: else:
# SQLite-compatible text search using icontains
results["organizations"] = Organization.objects.filter( results["organizations"] = Organization.objects.filter(
name__icontains=query, name__icontains=query,
) )
@ -815,10 +816,10 @@ def reward_campaign_list_view(request: HttpRequest) -> HttpResponse:
elif status_filter == "expired": elif status_filter == "expired":
queryset = queryset.filter(ends_at__lt=now) queryset = queryset.filter(ends_at__lt=now)
paginator = Paginator(queryset, per_page) paginator: Paginator[RewardCampaign] = Paginator(queryset, per_page)
page = request.GET.get("page") or 1 page: str | Literal[1] = request.GET.get("page") or 1
try: try:
reward_campaigns = paginator.page(page) reward_campaigns: Page[RewardCampaign] = paginator.page(page)
except PageNotAnInteger: except PageNotAnInteger:
reward_campaigns = paginator.page(1) reward_campaigns = paginator.page(1)
except EmptyPage: except EmptyPage:
@ -1032,8 +1033,8 @@ def docs_rss_view(request: HttpRequest) -> HttpResponse:
] ]
# Get sample game and organization for examples # Get sample game and organization for examples
sample_game = Game.objects.first() sample_game: Game | None = Game.objects.first()
sample_org = Organization.objects.first() sample_org: Organization | None = Organization.objects.first()
return render( return render(
request, request,
@ -1067,9 +1068,7 @@ class ChannelListView(ListView):
if search_query: if search_query:
queryset = queryset.filter(Q(name__icontains=search_query) | Q(display_name__icontains=search_query)) queryset = queryset.filter(Q(name__icontains=search_query) | Q(display_name__icontains=search_query))
# Count directly from the through table for maximum efficiency campaign_count_subquery: QuerySet[DropCampaign, DropCampaign] = (
# This avoids unnecessary JOINs and GROUP BY operations
campaign_count_subquery = (
DropCampaign.allow_channels.through.objects DropCampaign.allow_channels.through.objects
.filter(channel_id=OuterRef("pk")) .filter(channel_id=OuterRef("pk"))
.values("channel_id") .values("channel_id")