Skip to content

Commit

Permalink
chore: Add types for DjangoFilterBackend
Browse files Browse the repository at this point in the history
  • Loading branch information
last-partizan committed Sep 12, 2024
1 parent 4a3eb8b commit 65156bf
Showing 1 changed file with 17 additions and 7 deletions.
24 changes: 17 additions & 7 deletions django_filters/rest_framework/backends.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,40 @@
from __future__ import annotations

import warnings
from typing import TYPE_CHECKING, Any, TypeVar

from django.template import loader

from .. import compat, utils
from . import filters, filterset

if TYPE_CHECKING:
from django.db.models.query import QuerySet
from rest_framework.generics import GenericAPIView
from rest_framework.request import Request

Q = TypeVar("Q", bound=QuerySet[Any])


class DjangoFilterBackend:
filterset_base = filterset.FilterSet
raise_exception = True

@property
def template(self):
def template(self) -> str:
if compat.is_crispy():
return "django_filters/rest_framework/crispy_form.html"
return "django_filters/rest_framework/form.html"

def get_filterset(self, request, queryset, view):
def get_filterset(self, request: Request, queryset: QuerySet[Any], view: GenericAPIView) -> filterset.FilterSet | None:
filterset_class = self.get_filterset_class(view, queryset)
if filterset_class is None:
return None

kwargs = self.get_filterset_kwargs(request, queryset, view)
return filterset_class(**kwargs)

def get_filterset_class(self, view, queryset=None):
def get_filterset_class(self, view: GenericAPIView, queryset: QuerySet[Any] | None = None) -> type[filterset.FilterSet] | None:
"""
Return the `FilterSet` class used to filter the queryset.
"""
Expand Down Expand Up @@ -57,14 +67,14 @@ class Meta(MetaBase):

return None

def get_filterset_kwargs(self, request, queryset, view):
def get_filterset_kwargs(self, request: Request, queryset: QuerySet[Any], view: GenericAPIView) -> dict[str, Any]:
return {
"data": request.query_params,
"queryset": queryset,
"request": request,
}

def filter_queryset(self, request, queryset, view):
def filter_queryset(self, request: Request, queryset: Q, view: Any) -> Q:
filterset = self.get_filterset(request, queryset, view)
if filterset is None:
return queryset
Expand All @@ -73,7 +83,7 @@ def filter_queryset(self, request, queryset, view):
raise utils.translate_validation(filterset.errors)
return filterset.qs

def to_html(self, request, queryset, view):
def to_html(self, request: Request, queryset: QuerySet, view: GenericAPIView) -> str | None:
filterset = self.get_filterset(request, queryset, view)
if filterset is None:
return None
Expand Down Expand Up @@ -129,7 +139,7 @@ def get_schema_fields(self, view):
]
)

def get_schema_operation_parameters(self, view):
def get_schema_operation_parameters(self, view: GenericAPIView) -> Any:
from django_filters import RemovedInDjangoFilter25Warning
warnings.warn(
"Built-in schema generation is deprecated. Use drf-spectacular.",
Expand Down

0 comments on commit 65156bf

Please sign in to comment.