diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index be0163441020..b08e34682d43 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -42,6 +42,7 @@ "stubs/corus", "stubs/dateparser", "stubs/defusedxml", + "stubs/django-filter", "stubs/docker", "stubs/docutils", "stubs/Flask-SocketIO", diff --git a/stubs/django-filter/@tests/stubtest_allowlist.txt b/stubs/django-filter/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..d266723ddf4e --- /dev/null +++ b/stubs/django-filter/@tests/stubtest_allowlist.txt @@ -0,0 +1,41 @@ +django_filters.Filter.__init__ +django_filters.FilterMethod +django_filters.FilterSet.base_filters +django_filters.FilterSet.declared_filters +django_filters.NumberFilter.get_max_validator +django_filters.QuerySetRequestMixin +django_filters.RemovedInDjangoFilter25Warning +django_filters.fields.BaseCSVWidget.surrogate +django_filters.fields.CSVWidget.__init__ +django_filters.fields.DJANGO_50 +django_filters.filters.__all__ +django_filters.filters.Filter.__init__ +django_filters.filters.NumberFilter.get_max_validator +django_filters.filterset.BaseFilterSet.filter_for_field +django_filters.filterset.FilterSet.base_filters +django_filters.filterset.FilterSet.declared_filters +django_filters.rest_framework.DjangoFilterBackend +django_filters.rest_framework.Filter.__init__ +django_filters.rest_framework.FilterSet.base_filters +django_filters.rest_framework.FilterSet.declared_filters +django_filters.rest_framework.NumberFilter.get_max_validator +django_filters.rest_framework.__all__ +django_filters.rest_framework.backends.DjangoFilterBackend +django_filters.rest_framework.backends.RenameAttributes +django_filters.rest_framework.filters.Filter.__init__ +django_filters.rest_framework.filters.NumberFilter.get_max_validator +django_filters.rest_framework.filterset.FilterSet.base_filters +django_filters.rest_framework.filterset.FilterSet.declared_filters +django_filters.views.BaseFilterView +django_filters.views.FilterMixin +django_filters.views.FilterMixinRenames +django_filters.views.FilterView +django_filters.views.MigrationNotice +django_filters.views.RenameAttributesBase +django_filters.widgets.BaseCSVWidget.surrogate +django_filters.widgets.CSVWidget.__init__ + +# These fail due to DJANGO_SETTINGS_MODULE being unset +django_filters.compat +django_filters.conf +django_filters.utils diff --git a/stubs/django-filter/METADATA.toml b/stubs/django-filter/METADATA.toml new file mode 100644 index 000000000000..1a4b4eb4c47d --- /dev/null +++ b/stubs/django-filter/METADATA.toml @@ -0,0 +1,3 @@ +version = "23.3.*" +upstream_repository = "https://github.com/carltongibson/django-filter" +requires = ["django-stubs"] diff --git a/stubs/django-filter/django_filters/__init__.pyi b/stubs/django-filter/django_filters/__init__.pyi new file mode 100644 index 000000000000..6563a1f3a690 --- /dev/null +++ b/stubs/django-filter/django_filters/__init__.pyi @@ -0,0 +1,9 @@ +from typing import Any + +from . import rest_framework as rest_framework +from .filters import * +from .filterset import FilterSet as FilterSet + +def parse_version(version: Any): ... + +VERSION: Any diff --git a/stubs/django-filter/django_filters/compat.pyi b/stubs/django-filter/django_filters/compat.pyi new file mode 100644 index 000000000000..fb298ad1d046 --- /dev/null +++ b/stubs/django-filter/django_filters/compat.pyi @@ -0,0 +1 @@ +def is_crispy(): ... diff --git a/stubs/django-filter/django_filters/conf.pyi b/stubs/django-filter/django_filters/conf.pyi new file mode 100644 index 000000000000..278c9b5660e8 --- /dev/null +++ b/stubs/django-filter/django_filters/conf.pyi @@ -0,0 +1,15 @@ +from typing import Any + +from .utils import deprecate as deprecate + +DEFAULTS: Any +DEPRECATED_SETTINGS: Any + +def is_callable(value: Any): ... + +class Settings: + def __getattr__(self, name: Any): ... + def get_setting(self, setting: Any): ... + def change_setting(self, setting: Any, value: Any, enter: Any, **kwargs: Any) -> None: ... + +settings: Any diff --git a/stubs/django-filter/django_filters/constants.pyi b/stubs/django-filter/django_filters/constants.pyi new file mode 100644 index 000000000000..e7cee31637d4 --- /dev/null +++ b/stubs/django-filter/django_filters/constants.pyi @@ -0,0 +1,4 @@ +from typing import Any + +ALL_FIELDS: str +EMPTY_VALUES: Any diff --git a/stubs/django-filter/django_filters/exceptions.pyi b/stubs/django-filter/django_filters/exceptions.pyi new file mode 100644 index 000000000000..fa718bef6ee2 --- /dev/null +++ b/stubs/django-filter/django_filters/exceptions.pyi @@ -0,0 +1,6 @@ +from typing import Any + +from django.core.exceptions import FieldError + +class FieldLookupError(FieldError): + def __init__(self, model_field: Any, lookup_expr: Any) -> None: ... diff --git a/stubs/django-filter/django_filters/fields.pyi b/stubs/django-filter/django_filters/fields.pyi new file mode 100644 index 000000000000..ed07338fe4d9 --- /dev/null +++ b/stubs/django-filter/django_filters/fields.pyi @@ -0,0 +1,96 @@ +from typing import Any, TypeVar + +from django import forms +from django.db.models import Model + +from .conf import settings as settings +from .constants import EMPTY_VALUES as EMPTY_VALUES +from .utils import handle_timezone as handle_timezone +from .widgets import ( + BaseCSVWidget as BaseCSVWidget, + CSVWidget as CSVWidget, + DateRangeWidget as DateRangeWidget, + LookupChoiceWidget as LookupChoiceWidget, + RangeWidget as RangeWidget, +) + +_M = TypeVar("_M", bound=Model) + +class RangeField(forms.MultiValueField): + widget: Any = ... + def __init__(self, fields: Any | None = ..., *args: Any, **kwargs: Any) -> None: ... + def compress(self, data_list: Any): ... + +class DateRangeField(RangeField): + widget: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def compress(self, data_list: Any): ... + +class DateTimeRangeField(RangeField): + widget: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class IsoDateTimeRangeField(RangeField): + widget: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class TimeRangeField(RangeField): + widget: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class Lookup: + def __new__(cls, value: Any, lookup_expr: Any): ... + +class LookupChoiceField(forms.MultiValueField): + default_error_messages: Any = ... + def __init__(self, field: Any, lookup_choices: Any, *args: Any, **kwargs: Any) -> None: ... + def compress(self, data_list: Any): ... + +class IsoDateTimeField(forms.DateTimeField): + ISO_8601: str = ... + input_formats: Any = ... + def strptime(self, value: Any, format: Any): ... + +class BaseCSVField(forms.Field): + base_widget_class: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def clean(self, value: Any): ... + +class BaseRangeField(BaseCSVField): + widget: Any = ... + default_error_messages: Any = ... + def clean(self, value: Any): ... + +class ChoiceIterator: + field: Any = ... + choices: Any = ... + def __init__(self, field: Any, choices: Any) -> None: ... + def __iter__(self) -> Any: ... + def __len__(self): ... + +class ModelChoiceIterator(forms.models.ModelChoiceIterator): + def __iter__(self) -> Any: ... + def __len__(self): ... + +class ChoiceIteratorMixin: + null_label: Any = ... + null_value: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + choices: Any = ... + +class ChoiceField(ChoiceIteratorMixin, forms.ChoiceField): + iterator: Any = ... + empty_label: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class MultipleChoiceField(ChoiceIteratorMixin, forms.MultipleChoiceField): + iterator: Any = ... + empty_label: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class ModelChoiceField(ChoiceIteratorMixin, forms.ModelChoiceField[_M]): + iterator: Any = ... + def to_python(self, value: Any): ... + +class ModelMultipleChoiceField(ChoiceIteratorMixin, forms.ModelMultipleChoiceField[_M]): + iterator: Any = ... diff --git a/stubs/django-filter/django_filters/filters.pyi b/stubs/django-filter/django_filters/filters.pyi new file mode 100644 index 000000000000..db363f11da0e --- /dev/null +++ b/stubs/django-filter/django_filters/filters.pyi @@ -0,0 +1,174 @@ +from _typeshed import Incomplete +from collections.abc import Callable +from typing import Any + +class Filter: + creation_counter: int = ... + field_class: Any = ... + field_name: Any = ... + lookup_expr: Any = ... + distinct: Any = ... + exclude: Any = ... + extra: Any = ... + def __init__( + self, + field_name: Any | None = ..., + lookup_expr: str = ..., + *, + label: Any | None = ..., + method: Any | None = ..., + distinct: bool = ..., + exclude: bool = ..., + **kwargs: Any, + ) -> None: ... + def get_method(self, qs: Any): ... + method: Callable[..., Incomplete] = ... + label: Any = ... + @property + def field(self): ... + def filter(self, qs: Any, value: Any): ... + +class CharFilter(Filter): + field_class: Any = ... + +class BooleanFilter(Filter): + field_class: Any = ... + +class ChoiceFilter(Filter): + field_class: Any = ... + null_value: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def filter(self, qs: Any, value: Any): ... + +class TypedChoiceFilter(Filter): + field_class: Any = ... + +class UUIDFilter(Filter): + field_class: Any = ... + +class MultipleChoiceFilter(Filter): + field_class: Any = ... + always_filter: bool = ... + conjoined: Any = ... + null_value: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def is_noop(self, qs: Any, value: Any): ... + def filter(self, qs: Any, value: Any): ... + def get_filter_predicate(self, v: Any): ... + +class TypedMultipleChoiceFilter(MultipleChoiceFilter): + field_class: Any = ... + +class DateFilter(Filter): + field_class: Any = ... + +class DateTimeFilter(Filter): + field_class: Any = ... + +class IsoDateTimeFilter(DateTimeFilter): + field_class: Any = ... + +class TimeFilter(Filter): + field_class: Any = ... + +class DurationFilter(Filter): + field_class: Any = ... + +class QuerySetRequestMixin: + queryset: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def get_request(self): ... + def get_queryset(self, request: Any): ... + @property + def field(self): ... + +class ModelChoiceFilter(QuerySetRequestMixin, ChoiceFilter): + field_class: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class ModelMultipleChoiceFilter(QuerySetRequestMixin, MultipleChoiceFilter): + field_class: Any = ... + +class NumberFilter(Filter): + field_class: Any = ... + +class NumericRangeFilter(Filter): + field_class: Any = ... + lookup_expr: str = ... + def filter(self, qs: Any, value: Any): ... + +class RangeFilter(Filter): + field_class: Any = ... + lookup_expr: str = ... + def filter(self, qs: Any, value: Any): ... + +class DateRangeFilter(ChoiceFilter): + choices: Any = ... + filters: Any = ... + def __init__(self, choices: Any | None = ..., filters: Any | None = ..., *args: Any, **kwargs: Any) -> None: ... + def filter(self, qs: Any, value: Any): ... + +class DateFromToRangeFilter(RangeFilter): + field_class: Any = ... + +class DateTimeFromToRangeFilter(RangeFilter): + field_class: Any = ... + +class IsoDateTimeFromToRangeFilter(RangeFilter): + field_class: Any = ... + +class TimeRangeFilter(RangeFilter): + field_class: Any = ... + +class AllValuesFilter(ChoiceFilter): + @property + def field(self): ... + +class AllValuesMultipleFilter(MultipleChoiceFilter): + @property + def field(self): ... + +class BaseCSVFilter(Filter): + base_field_class: Any = ... + field_class: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class BaseInFilter(BaseCSVFilter): + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class BaseRangeFilter(BaseCSVFilter): + base_field_class: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +class LookupChoiceFilter(Filter): + field_class: Any = ... + outer_class: Any = ... + empty_label: Any = ... + lookup_choices: Any = ... + def __init__( + self, field_name: Any | None = ..., lookup_choices: Any | None = ..., field_class: Any | None = ..., **kwargs: Any + ) -> None: ... + @classmethod + def normalize_lookup(cls, lookup: Any): ... + def get_lookup_choices(self): ... + @property + def field(self): ... + lookup_expr: Any = ... + def filter(self, qs: Any, lookup: Any): ... + +class OrderingFilter(BaseCSVFilter, ChoiceFilter): + descending_fmt: Any = ... + param_map: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def get_ordering_value(self, param: Any): ... + def filter(self, qs: Any, value: Any): ... + @classmethod + def normalize_fields(cls, fields: Any): ... + def build_choices(self, fields: Any, labels: Any): ... + +class FilterMethod: + f: Any = ... + def __init__(self, filter_instance: Any) -> None: ... + def __call__(self, qs: Any, value: Any): ... + @property + def method(self): ... diff --git a/stubs/django-filter/django_filters/filterset.pyi b/stubs/django-filter/django_filters/filterset.pyi new file mode 100644 index 000000000000..c5d2ce379625 --- /dev/null +++ b/stubs/django-filter/django_filters/filterset.pyi @@ -0,0 +1,53 @@ +from typing import Any + +def remote_queryset(field: Any): ... + +class FilterSetOptions: + model: Any = ... + fields: Any = ... + exclude: Any = ... + filter_overrides: Any = ... + form: Any = ... + def __init__(self, options: Any | None = ...) -> None: ... + +class FilterSetMetaclass(type): + def __new__(cls, name: Any, bases: Any, attrs: Any): ... + @classmethod + def get_declared_filters(cls, bases: Any, attrs: Any): ... + +FILTER_FOR_DBFIELD_DEFAULTS: Any + +class BaseFilterSet: + FILTER_DEFAULTS: Any = ... + is_bound: Any = ... + data: Any = ... + queryset: Any = ... + request: Any = ... + form_prefix: Any = ... + filters: Any = ... + def __init__( + self, data: Any | None = ..., queryset: Any | None = ..., *, request: Any | None = ..., prefix: Any | None = ... + ) -> None: ... + def is_valid(self): ... + @property + def errors(self): ... + def filter_queryset(self, queryset: Any): ... + @property + def qs(self): ... + def get_form_class(self): ... + @property + def form(self): ... + @classmethod + def get_fields(cls): ... + @classmethod + def get_filter_name(cls, field_name: Any, lookup_expr: Any): ... + @classmethod + def get_filters(cls): ... + @classmethod + def filter_for_field(cls, field: Any, field_name: Any, lookup_expr: str = ...): ... + @classmethod + def filter_for_lookup(cls, field: Any, lookup_type: Any): ... + +class FilterSet(BaseFilterSet, metaclass=FilterSetMetaclass): ... + +def filterset_factory(model: Any, fields: Any = ...): ... diff --git a/stubs/django-filter/django_filters/rest_framework/__init__.pyi b/stubs/django-filter/django_filters/rest_framework/__init__.pyi new file mode 100644 index 000000000000..8d5d8ac63dde --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/__init__.pyi @@ -0,0 +1,38 @@ +from .backends import DjangoFilterBackend as DjangoFilterBackend +from .filters import * +from .filterset import FilterSet as FilterSet + +__all__ = [ + "DjangoFilterBackend", + "FilterSet", + "BooleanFilter", + "AllValuesFilter", + "AllValuesMultipleFilter", + "BaseCSVFilter", + "BaseInFilter", + "BaseRangeFilter", + "CharFilter", + "ChoiceFilter", + "DateFilter", + "DateFromToRangeFilter", + "DateRangeFilter", + "DateTimeFilter", + "DateTimeFromToRangeFilter", + "DurationFilter", + "Filter", + "IsoDateTimeFilter", + "IsoDateTimeFromToRangeFilter", + "LookupChoiceFilter", + "ModelChoiceFilter", + "ModelMultipleChoiceFilter", + "MultipleChoiceFilter", + "NumberFilter", + "NumericRangeFilter", + "OrderingFilter", + "RangeFilter", + "TimeFilter", + "TimeRangeFilter", + "TypedChoiceFilter", + "TypedMultipleChoiceFilter", + "UUIDFilter", +] diff --git a/stubs/django-filter/django_filters/rest_framework/backends.pyi b/stubs/django-filter/django_filters/rest_framework/backends.pyi new file mode 100644 index 000000000000..822ef149c842 --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/backends.pyi @@ -0,0 +1,24 @@ +from typing import Any + +from django.utils.deprecation import RenameMethodsBase + +from .. import compat as compat, utils as utils +from . import filters as filters, filterset as filterset + +class RenameAttributes(utils.RenameAttributesBase, RenameMethodsBase): + renamed_attributes: Any = ... + renamed_methods: Any = ... + +class DjangoFilterBackend(metaclass=RenameAttributes): + filterset_base: Any = ... + raise_exception: bool = ... + @property + def template(self): ... + def get_filterset(self, request: Any, queryset: Any, view: Any): ... + def get_filterset_class(self, view: Any, queryset: Any | None = ...): ... + def get_filterset_kwargs(self, request: Any, queryset: Any, view: Any): ... + def filter_queryset(self, request: Any, queryset: Any, view: Any): ... + def to_html(self, request: Any, queryset: Any, view: Any): ... + def get_coreschema_field(self, field: Any): ... + def get_schema_fields(self, view: Any): ... + def get_schema_operation_parameters(self, view: Any): ... diff --git a/stubs/django-filter/django_filters/rest_framework/filters.pyi b/stubs/django-filter/django_filters/rest_framework/filters.pyi new file mode 100644 index 000000000000..819e25f8fa00 --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/filters.pyi @@ -0,0 +1,70 @@ +from typing import Any + +from django_filters import ( + AllValuesFilter, + AllValuesMultipleFilter, + BaseCSVFilter, + BaseInFilter, + BaseRangeFilter, + CharFilter, + ChoiceFilter, + DateFilter, + DateFromToRangeFilter, + DateRangeFilter, + DateTimeFilter, + DateTimeFromToRangeFilter, + DurationFilter, + Filter, + IsoDateTimeFilter, + IsoDateTimeFromToRangeFilter, + LookupChoiceFilter, + ModelChoiceFilter, + ModelMultipleChoiceFilter, + MultipleChoiceFilter, + NumberFilter, + NumericRangeFilter, + OrderingFilter, + RangeFilter, + TimeFilter, + TimeRangeFilter, + TypedChoiceFilter, + TypedMultipleChoiceFilter, + UUIDFilter, + filters, +) + +class BooleanFilter(filters.BooleanFilter): + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +__all__ = [ + "BooleanFilter", + "AllValuesFilter", + "AllValuesMultipleFilter", + "BaseCSVFilter", + "BaseInFilter", + "BaseRangeFilter", + "CharFilter", + "ChoiceFilter", + "DateFilter", + "DateFromToRangeFilter", + "DateRangeFilter", + "DateTimeFilter", + "DateTimeFromToRangeFilter", + "DurationFilter", + "Filter", + "IsoDateTimeFilter", + "IsoDateTimeFromToRangeFilter", + "LookupChoiceFilter", + "ModelChoiceFilter", + "ModelMultipleChoiceFilter", + "MultipleChoiceFilter", + "NumberFilter", + "NumericRangeFilter", + "OrderingFilter", + "RangeFilter", + "TimeFilter", + "TimeRangeFilter", + "TypedChoiceFilter", + "TypedMultipleChoiceFilter", + "UUIDFilter", +] diff --git a/stubs/django-filter/django_filters/rest_framework/filterset.pyi b/stubs/django-filter/django_filters/rest_framework/filterset.pyi new file mode 100644 index 000000000000..cef1f07a90d8 --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/filterset.pyi @@ -0,0 +1,10 @@ +from typing import Any + +from django_filters import filterset as filterset + +FILTER_FOR_DBFIELD_DEFAULTS: Any + +class FilterSet(filterset.FilterSet): + FILTER_DEFAULTS: Any = ... + @property + def form(self): ... diff --git a/stubs/django-filter/django_filters/utils.pyi b/stubs/django-filter/django_filters/utils.pyi new file mode 100644 index 000000000000..d8dfe4e4dc09 --- /dev/null +++ b/stubs/django-filter/django_filters/utils.pyi @@ -0,0 +1,27 @@ +from typing import Any + +from .exceptions import FieldLookupError as FieldLookupError + +def deprecate(msg: Any, level_modifier: int = ...) -> None: ... + +class MigrationNotice(DeprecationWarning): + url: str = ... + def __init__(self, message: Any) -> None: ... + +class RenameAttributesBase(type): + renamed_attributes: Any = ... + def __new__(metacls: Any, name: Any, bases: Any, attrs: Any): ... + def get_name(metacls: Any, name: Any): ... + def __getattr__(metacls: Any, name: Any): ... + def __setattr__(metacls: Any, name: Any, value: Any): ... + +def try_dbfield(fn: Any, field_class: Any): ... +def get_all_model_fields(model: Any): ... +def get_model_field(model: Any, field_name: Any): ... +def get_field_parts(model: Any, field_name: Any): ... +def resolve_field(model_field: Any, lookup_expr: Any): ... +def handle_timezone(value: Any, is_dst: Any | None = ...): ... +def verbose_field_name(model: Any, field_name: Any): ... +def verbose_lookup_expr(lookup_expr: Any): ... +def label_for_filter(model: Any, field_name: Any, lookup_expr: Any, exclude: bool = ...): ... +def translate_validation(error_dict: Any): ... diff --git a/stubs/django-filter/django_filters/views.pyi b/stubs/django-filter/django_filters/views.pyi new file mode 100644 index 000000000000..fc36dcf123ea --- /dev/null +++ b/stubs/django-filter/django_filters/views.pyi @@ -0,0 +1,39 @@ +from _typeshed import Incomplete +from typing import Any + +from django.views.generic import View +from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin + +from .constants import ALL_FIELDS as ALL_FIELDS +from .filterset import filterset_factory as filterset_factory +from .utils import MigrationNotice as MigrationNotice, RenameAttributesBase as RenameAttributesBase + +class FilterMixinRenames(RenameAttributesBase): + renamed_attributes: Any = ... + +class FilterMixin(metaclass=FilterMixinRenames): + filterset_class: Any = ... + filterset_fields: Any = ... + strict: bool = ... + def get_filterset_class(self): ... + def get_filterset(self, filterset_class: Any): ... + def get_filterset_kwargs(self, filterset_class: Any): ... + def get_strict(self): ... + +class BaseFilterView(FilterMixin, MultipleObjectMixin[Incomplete], View): + filterset: Any = ... + object_list: Any = ... + def get(self, request: Any, *args: Any, **kwargs: Any): ... + +class FilterView(MultipleObjectTemplateResponseMixin, BaseFilterView): + template_name_suffix: str = ... + +def object_filter( + request: Any, + model: Any | None = ..., + queryset: Any | None = ..., + template_name: Any | None = ..., + extra_context: Any | None = ..., + context_processors: Any | None = ..., + filter_class: Any | None = ..., +): ... diff --git a/stubs/django-filter/django_filters/widgets.pyi b/stubs/django-filter/django_filters/widgets.pyi new file mode 100644 index 000000000000..163abbe839d1 --- /dev/null +++ b/stubs/django-filter/django_filters/widgets.pyi @@ -0,0 +1,63 @@ +from _typeshed import Incomplete +from typing import Any +from typing_extensions import TypeAlias + +from django import forms +from django.forms.renderers import BaseRenderer +from django.utils.safestring import SafeText + +_OptAttrs: TypeAlias = dict[str, Any] + +class LinkWidget(forms.Widget): + choices: Any = ... + def __init__(self, attrs: Any | None = ..., choices: Any = ...) -> None: ... + data: Any = ... + def value_from_datadict(self, data: Any, files: Any, name: Any): ... + def render( # type: ignore[override] + self, + name: str, + value: Any, + attrs: _OptAttrs | None = ..., + choices: tuple[Incomplete, ...] = ..., + renderer: BaseRenderer | None = ..., + ) -> SafeText: ... + def render_options(self, choices: Any, selected_choices: Any, name: Any): ... + def render_option(self, name: Any, selected_choices: Any, option_value: Any, option_label: Any): ... + def option_string(self): ... + +class SuffixedMultiWidget(forms.MultiWidget): + suffixes: Any = ... + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + def suffixed(self, name: Any, suffix: Any): ... + def get_context(self, name: Any, value: Any, attrs: Any): ... + def value_from_datadict(self, data: Any, files: Any, name: Any): ... + def value_omitted_from_data(self, data: Any, files: Any, name: Any): ... + def replace_name(self, output: Any, index: Any): ... + def decompress(self, value: Any): ... + +class RangeWidget(SuffixedMultiWidget): + template_name: str = ... + suffixes: Any = ... + def __init__(self, attrs: Any | None = ...) -> None: ... + def decompress(self, value: Any): ... + +class DateRangeWidget(RangeWidget): + suffixes: Any = ... + +class LookupChoiceWidget(SuffixedMultiWidget): + suffixes: Any = ... + def decompress(self, value: Any): ... + +class BooleanWidget(forms.Select): + def __init__(self, attrs: Any | None = ...) -> None: ... + def render(self, name: Any, value: Any, attrs: Any | None = ..., renderer: Any | None = ...): ... + def value_from_datadict(self, data: Any, files: Any, name: Any): ... + +class BaseCSVWidget(forms.Widget): + def value_from_datadict(self, data: Any, files: Any, name: Any): ... + def render(self, name: Any, value: Any, attrs: Any | None = ..., renderer: Any | None = ...): ... + +class CSVWidget(BaseCSVWidget, forms.TextInput): ... + +class QueryArrayWidget(BaseCSVWidget, forms.TextInput): + def value_from_datadict(self, data: Any, files: Any, name: Any): ...