From 58778b5c517263b615df61280dbd2474a987eaca Mon Sep 17 00:00:00 2001 From: Davis Raymond Muro Date: Wed, 29 Jan 2020 17:22:14 +0300 Subject: [PATCH 1/6] [django-filter] Setup initial structure --- .../django-filter/django_filters/__init__.pyi | 9 + stubs/django-filter/django_filters/compat.pyi | 1 + stubs/django-filter/django_filters/conf.pyi | 17 ++ .../django_filters/constants.pyi | 4 + .../django_filters/exceptions.pyi | 6 + stubs/django-filter/django_filters/fields.pyi | 95 +++++++++ .../django-filter/django_filters/filters.pyi | 182 ++++++++++++++++++ .../django_filters/filterset.pyi | 78 ++++++++ stubs/django-filter/django_filters/models.pyi | 0 .../rest_framework/__init__.pyi | 3 + .../rest_framework/backends.pyi | 26 +++ .../django_filters/rest_framework/filters.pyi | 37 ++++ .../rest_framework/filterset.pyi | 10 + stubs/django-filter/django_filters/utils.pyi | 29 +++ stubs/django-filter/django_filters/views.pyi | 42 ++++ .../django-filter/django_filters/widgets.pyi | 75 ++++++++ 16 files changed, 614 insertions(+) create mode 100644 stubs/django-filter/django_filters/__init__.pyi create mode 100644 stubs/django-filter/django_filters/compat.pyi create mode 100644 stubs/django-filter/django_filters/conf.pyi create mode 100644 stubs/django-filter/django_filters/constants.pyi create mode 100644 stubs/django-filter/django_filters/exceptions.pyi create mode 100644 stubs/django-filter/django_filters/fields.pyi create mode 100644 stubs/django-filter/django_filters/filters.pyi create mode 100644 stubs/django-filter/django_filters/filterset.pyi create mode 100644 stubs/django-filter/django_filters/models.pyi create mode 100644 stubs/django-filter/django_filters/rest_framework/__init__.pyi create mode 100644 stubs/django-filter/django_filters/rest_framework/backends.pyi create mode 100644 stubs/django-filter/django_filters/rest_framework/filters.pyi create mode 100644 stubs/django-filter/django_filters/rest_framework/filterset.pyi create mode 100644 stubs/django-filter/django_filters/utils.pyi create mode 100644 stubs/django-filter/django_filters/views.pyi create mode 100644 stubs/django-filter/django_filters/widgets.pyi 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..832da5e5c71c --- /dev/null +++ b/stubs/django-filter/django_filters/conf.pyi @@ -0,0 +1,17 @@ +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..410e56a44028 --- /dev/null +++ b/stubs/django-filter/django_filters/fields.pyi @@ -0,0 +1,95 @@ +from typing import Any, Optional + +from django import forms + +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 +from .widgets import CSVWidget as CSVWidget +from .widgets import DateRangeWidget as DateRangeWidget +from .widgets import LookupChoiceWidget as LookupChoiceWidget +from .widgets import RangeWidget as RangeWidget + +class RangeField(forms.MultiValueField): + widget: Any = ... + def __init__( + self, fields: Optional[Any] = ..., *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): + iterator: Any = ... + def to_python(self, value: Any): ... + +class ModelMultipleChoiceField(ChoiceIteratorMixin, forms.ModelMultipleChoiceField): + 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..98039e2a773c --- /dev/null +++ b/stubs/django-filter/django_filters/filters.pyi @@ -0,0 +1,182 @@ +from typing import Any, Callable, Optional + +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: Optional[Any] = ..., + lookup_expr: str = ..., + *, + label: Optional[Any] = ..., + method: Optional[Any] = ..., + distinct: bool = ..., + exclude: bool = ..., + **kwargs: Any + ) -> None: ... + def get_method(self, qs: Any): ... + method: Callable = ... + 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: Optional[Any] = ..., + filters: Optional[Any] = ..., + *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: Optional[Any] = ..., + lookup_choices: Optional[Any] = ..., + field_class: Optional[Any] = ..., + **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..2484e075e33a --- /dev/null +++ b/stubs/django-filter/django_filters/filterset.pyi @@ -0,0 +1,78 @@ +from typing import Any, Optional + +from .conf import settings +from .constants import ALL_FIELDS +from .filters import ( + BaseInFilter, + BaseRangeFilter, + BooleanFilter, + CharFilter, + ChoiceFilter, + DateFilter, + DateTimeFilter, + DurationFilter, + Filter, + ModelChoiceFilter, + ModelMultipleChoiceFilter, + NumberFilter, + TimeFilter, + UUIDFilter, +) +from .utils import get_all_model_fields, get_model_field, resolve_field, try_dbfield + +def remote_queryset(field: Any): ... + +class FilterSetOptions: + model: Any = ... + fields: Any = ... + exclude: Any = ... + filter_overrides: Any = ... + form: Any = ... + def __init__(self, options: Optional[Any] = ...) -> 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: Optional[Any] = ..., + queryset: Optional[Any] = ..., + *, + request: Optional[Any] = ..., + prefix: Optional[Any] = ... + ) -> 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/models.pyi b/stubs/django-filter/django_filters/models.pyi new file mode 100644 index 000000000000..e69de29bb2d1 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..adb475260a84 --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/__init__.pyi @@ -0,0 +1,3 @@ +from .backends import DjangoFilterBackend as DjangoFilterBackend +from .filters import * +from .filterset import FilterSet as FilterSet 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..f90fc304e7b5 --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/backends.pyi @@ -0,0 +1,26 @@ +from typing import Any, Optional + +from django.utils.deprecation import RenameMethodsBase + +from .. import compat as compat +from .. import utils as utils +from . import filters as filters +from . import 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: Optional[Any] = ...): ... + 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..0f279b195197 --- /dev/null +++ b/stubs/django-filter/django_filters/rest_framework/filters.pyi @@ -0,0 +1,37 @@ +from typing import Any + +from django_filters import filters + +class BooleanFilter(filters.BooleanFilter): + def __init__(self, *args: Any, **kwargs: Any) -> None: ... + +# Names in __all__ with no definition: +# 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..618f72d8a37e --- /dev/null +++ b/stubs/django-filter/django_filters/utils.pyi @@ -0,0 +1,29 @@ +from typing import Any, Optional + +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: Optional[Any] = ...): ... +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..57c65268d4aa --- /dev/null +++ b/stubs/django-filter/django_filters/views.pyi @@ -0,0 +1,42 @@ +from typing import Any, Optional + +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 +from .utils import 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, 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: Optional[Any] = ..., + queryset: Optional[Any] = ..., + template_name: Optional[Any] = ..., + extra_context: Optional[Any] = ..., + context_processors: Optional[Any] = ..., + filter_class: Optional[Any] = ..., +): ... diff --git a/stubs/django-filter/django_filters/widgets.pyi b/stubs/django-filter/django_filters/widgets.pyi new file mode 100644 index 000000000000..a6ff3494ac01 --- /dev/null +++ b/stubs/django-filter/django_filters/widgets.pyi @@ -0,0 +1,75 @@ +from typing import Any, Dict, Optional, Tuple + +from django import forms +from django.forms.renderers import EngineMixin +from django.utils.safestring import SafeText + +_OptAttrs = Dict[str, Any] + +class LinkWidget(forms.Widget): + choices: Any = ... + def __init__(self, attrs: Optional[Any] = ..., choices: Any = ...) -> None: ... + data: Any = ... + def value_from_datadict(self, data: Any, files: Any, name: Any): ... + def render( + self, + name: str, + value: Any, + attrs: Optional[_OptAttrs] = ..., + choices: Tuple = ..., + renderer: Optional[EngineMixin] = ..., + ) -> 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: Optional[Any] = ...) -> 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: Optional[Any] = ...) -> None: ... + def render( + self, + name: Any, + value: Any, + attrs: Optional[Any] = ..., + renderer: Optional[Any] = ..., + ): ... + 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: Optional[Any] = ..., + renderer: Optional[Any] = ..., + ): ... + +class CSVWidget(BaseCSVWidget, forms.TextInput): ... + +class QueryArrayWidget(BaseCSVWidget, forms.TextInput): + def value_from_datadict(self, data: Any, files: Any, name: Any): ... From eb3432148d3fb8b856801d6e911c945a7457a260 Mon Sep 17 00:00:00 2001 From: Tom Parker-Shemilt Date: Tue, 3 Jan 2023 16:36:43 +0000 Subject: [PATCH 2/6] [django-filter] Fix widget error --- stubs/django-filter/django_filters/widgets.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/django-filter/django_filters/widgets.pyi b/stubs/django-filter/django_filters/widgets.pyi index a6ff3494ac01..a2e61084acd9 100644 --- a/stubs/django-filter/django_filters/widgets.pyi +++ b/stubs/django-filter/django_filters/widgets.pyi @@ -1,7 +1,7 @@ from typing import Any, Dict, Optional, Tuple from django import forms -from django.forms.renderers import EngineMixin +from django.forms.renderers import BaseRenderer from django.utils.safestring import SafeText _OptAttrs = Dict[str, Any] @@ -11,13 +11,13 @@ class LinkWidget(forms.Widget): def __init__(self, attrs: Optional[Any] = ..., choices: Any = ...) -> None: ... data: Any = ... def value_from_datadict(self, data: Any, files: Any, name: Any): ... - def render( + def render( # type: ignore[override] self, name: str, value: Any, attrs: Optional[_OptAttrs] = ..., choices: Tuple = ..., - renderer: Optional[EngineMixin] = ..., + renderer: Optional[BaseRenderer] = ..., ) -> SafeText: ... def render_options(self, choices: Any, selected_choices: Any, name: Any): ... def render_option( From 94280227a4168c3956e721ed6771eb868cf17611 Mon Sep 17 00:00:00 2001 From: Tom Parker-Shemilt Date: Sat, 18 Mar 2023 13:55:41 +0000 Subject: [PATCH 3/6] [django-filter] Explicitly export all the filters from the rest_framework module --- .../rest_framework/__init__.pyi | 35 +++++++ .../django_filters/rest_framework/filters.pyi | 95 +++++++++++++------ 2 files changed, 99 insertions(+), 31 deletions(-) diff --git a/stubs/django-filter/django_filters/rest_framework/__init__.pyi b/stubs/django-filter/django_filters/rest_framework/__init__.pyi index adb475260a84..8d5d8ac63dde 100644 --- a/stubs/django-filter/django_filters/rest_framework/__init__.pyi +++ b/stubs/django-filter/django_filters/rest_framework/__init__.pyi @@ -1,3 +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/filters.pyi b/stubs/django-filter/django_filters/rest_framework/filters.pyi index 0f279b195197..819e25f8fa00 100644 --- a/stubs/django-filter/django_filters/rest_framework/filters.pyi +++ b/stubs/django-filter/django_filters/rest_framework/filters.pyi @@ -1,37 +1,70 @@ from typing import Any -from django_filters import filters +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: ... -# Names in __all__ with no definition: -# 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 +__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", +] From 862b49a07b077120ff74c0980951612a60530ace Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Sun, 22 Oct 2023 13:11:43 +0300 Subject: [PATCH 4/6] [django-filter] Update to typeshed style --- stubs/django-filter/django_filters/conf.pyi | 4 +- stubs/django-filter/django_filters/fields.pyi | 22 +++++------ .../django-filter/django_filters/filters.pyi | 24 ++++-------- .../django_filters/filterset.pyi | 31 ++-------------- .../rest_framework/backends.pyi | 10 ++--- stubs/django-filter/django_filters/utils.pyi | 8 ++-- stubs/django-filter/django_filters/views.pyi | 22 +++++------ .../django-filter/django_filters/widgets.pyi | 37 +++++-------------- 8 files changed, 46 insertions(+), 112 deletions(-) diff --git a/stubs/django-filter/django_filters/conf.pyi b/stubs/django-filter/django_filters/conf.pyi index 832da5e5c71c..278c9b5660e8 100644 --- a/stubs/django-filter/django_filters/conf.pyi +++ b/stubs/django-filter/django_filters/conf.pyi @@ -10,8 +10,6 @@ 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: ... + def change_setting(self, setting: Any, value: Any, enter: Any, **kwargs: Any) -> None: ... settings: Any diff --git a/stubs/django-filter/django_filters/fields.pyi b/stubs/django-filter/django_filters/fields.pyi index 410e56a44028..59a866e5f60f 100644 --- a/stubs/django-filter/django_filters/fields.pyi +++ b/stubs/django-filter/django_filters/fields.pyi @@ -1,21 +1,21 @@ -from typing import Any, Optional +from typing import Any from django import forms 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 -from .widgets import CSVWidget as CSVWidget -from .widgets import DateRangeWidget as DateRangeWidget -from .widgets import LookupChoiceWidget as LookupChoiceWidget -from .widgets import RangeWidget as RangeWidget +from .widgets import ( + BaseCSVWidget as BaseCSVWidget, + CSVWidget as CSVWidget, + DateRangeWidget as DateRangeWidget, + LookupChoiceWidget as LookupChoiceWidget, + RangeWidget as RangeWidget, +) class RangeField(forms.MultiValueField): widget: Any = ... - def __init__( - self, fields: Optional[Any] = ..., *args: Any, **kwargs: Any - ) -> None: ... + def __init__(self, fields: Any | None = ..., *args: Any, **kwargs: Any) -> None: ... def compress(self, data_list: Any): ... class DateRangeField(RangeField): @@ -40,9 +40,7 @@ class Lookup: class LookupChoiceField(forms.MultiValueField): default_error_messages: Any = ... - def __init__( - self, field: Any, lookup_choices: Any, *args: Any, **kwargs: Any - ) -> None: ... + def __init__(self, field: Any, lookup_choices: Any, *args: Any, **kwargs: Any) -> None: ... def compress(self, data_list: Any): ... class IsoDateTimeField(forms.DateTimeField): diff --git a/stubs/django-filter/django_filters/filters.pyi b/stubs/django-filter/django_filters/filters.pyi index 98039e2a773c..10697beb231e 100644 --- a/stubs/django-filter/django_filters/filters.pyi +++ b/stubs/django-filter/django_filters/filters.pyi @@ -1,4 +1,4 @@ -from typing import Any, Callable, Optional +from typing import Any, Callable class Filter: creation_counter: int = ... @@ -10,14 +10,14 @@ class Filter: extra: Any = ... def __init__( self, - field_name: Optional[Any] = ..., + field_name: Any | None = ..., lookup_expr: str = ..., *, - label: Optional[Any] = ..., - method: Optional[Any] = ..., + label: Any | None = ..., + method: Any | None = ..., distinct: bool = ..., exclude: bool = ..., - **kwargs: Any + **kwargs: Any, ) -> None: ... def get_method(self, qs: Any): ... method: Callable = ... @@ -103,13 +103,7 @@ class RangeFilter(Filter): class DateRangeFilter(ChoiceFilter): choices: Any = ... filters: Any = ... - def __init__( - self, - choices: Optional[Any] = ..., - filters: Optional[Any] = ..., - *args: Any, - **kwargs: Any - ) -> None: ... + def __init__(self, choices: Any | None = ..., filters: Any | None = ..., *args: Any, **kwargs: Any) -> None: ... def filter(self, qs: Any, value: Any): ... class DateFromToRangeFilter(RangeFilter): @@ -150,11 +144,7 @@ class LookupChoiceFilter(Filter): empty_label: Any = ... lookup_choices: Any = ... def __init__( - self, - field_name: Optional[Any] = ..., - lookup_choices: Optional[Any] = ..., - field_class: Optional[Any] = ..., - **kwargs: Any + self, field_name: Any | None = ..., lookup_choices: Any | None = ..., field_class: Any | None = ..., **kwargs: Any ) -> None: ... @classmethod def normalize_lookup(cls, lookup: Any): ... diff --git a/stubs/django-filter/django_filters/filterset.pyi b/stubs/django-filter/django_filters/filterset.pyi index 2484e075e33a..c5d2ce379625 100644 --- a/stubs/django-filter/django_filters/filterset.pyi +++ b/stubs/django-filter/django_filters/filterset.pyi @@ -1,24 +1,4 @@ -from typing import Any, Optional - -from .conf import settings -from .constants import ALL_FIELDS -from .filters import ( - BaseInFilter, - BaseRangeFilter, - BooleanFilter, - CharFilter, - ChoiceFilter, - DateFilter, - DateTimeFilter, - DurationFilter, - Filter, - ModelChoiceFilter, - ModelMultipleChoiceFilter, - NumberFilter, - TimeFilter, - UUIDFilter, -) -from .utils import get_all_model_fields, get_model_field, resolve_field, try_dbfield +from typing import Any def remote_queryset(field: Any): ... @@ -28,7 +8,7 @@ class FilterSetOptions: exclude: Any = ... filter_overrides: Any = ... form: Any = ... - def __init__(self, options: Optional[Any] = ...) -> None: ... + def __init__(self, options: Any | None = ...) -> None: ... class FilterSetMetaclass(type): def __new__(cls, name: Any, bases: Any, attrs: Any): ... @@ -46,12 +26,7 @@ class BaseFilterSet: form_prefix: Any = ... filters: Any = ... def __init__( - self, - data: Optional[Any] = ..., - queryset: Optional[Any] = ..., - *, - request: Optional[Any] = ..., - prefix: Optional[Any] = ... + self, data: Any | None = ..., queryset: Any | None = ..., *, request: Any | None = ..., prefix: Any | None = ... ) -> None: ... def is_valid(self): ... @property diff --git a/stubs/django-filter/django_filters/rest_framework/backends.pyi b/stubs/django-filter/django_filters/rest_framework/backends.pyi index f90fc304e7b5..822ef149c842 100644 --- a/stubs/django-filter/django_filters/rest_framework/backends.pyi +++ b/stubs/django-filter/django_filters/rest_framework/backends.pyi @@ -1,11 +1,9 @@ -from typing import Any, Optional +from typing import Any from django.utils.deprecation import RenameMethodsBase -from .. import compat as compat -from .. import utils as utils -from . import filters as filters -from . import filterset as filterset +from .. import compat as compat, utils as utils +from . import filters as filters, filterset as filterset class RenameAttributes(utils.RenameAttributesBase, RenameMethodsBase): renamed_attributes: Any = ... @@ -17,7 +15,7 @@ class DjangoFilterBackend(metaclass=RenameAttributes): @property def template(self): ... def get_filterset(self, request: Any, queryset: Any, view: Any): ... - def get_filterset_class(self, view: Any, queryset: Optional[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): ... diff --git a/stubs/django-filter/django_filters/utils.pyi b/stubs/django-filter/django_filters/utils.pyi index 618f72d8a37e..d8dfe4e4dc09 100644 --- a/stubs/django-filter/django_filters/utils.pyi +++ b/stubs/django-filter/django_filters/utils.pyi @@ -1,4 +1,4 @@ -from typing import Any, Optional +from typing import Any from .exceptions import FieldLookupError as FieldLookupError @@ -20,10 +20,8 @@ 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: Optional[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 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 index 57c65268d4aa..482056c8029f 100644 --- a/stubs/django-filter/django_filters/views.pyi +++ b/stubs/django-filter/django_filters/views.pyi @@ -1,15 +1,11 @@ -from typing import Any, Optional +from typing import Any from django.views.generic import View -from django.views.generic.list import ( - MultipleObjectMixin, - MultipleObjectTemplateResponseMixin, -) +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 -from .utils import RenameAttributesBase as RenameAttributesBase +from .utils import MigrationNotice as MigrationNotice, RenameAttributesBase as RenameAttributesBase class FilterMixinRenames(RenameAttributesBase): renamed_attributes: Any = ... @@ -33,10 +29,10 @@ class FilterView(MultipleObjectTemplateResponseMixin, BaseFilterView): def object_filter( request: Any, - model: Optional[Any] = ..., - queryset: Optional[Any] = ..., - template_name: Optional[Any] = ..., - extra_context: Optional[Any] = ..., - context_processors: Optional[Any] = ..., - filter_class: Optional[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 index a2e61084acd9..2e9f387944e5 100644 --- a/stubs/django-filter/django_filters/widgets.pyi +++ b/stubs/django-filter/django_filters/widgets.pyi @@ -1,28 +1,21 @@ -from typing import Any, Dict, Optional, Tuple +from typing import Any from django import forms from django.forms.renderers import BaseRenderer from django.utils.safestring import SafeText -_OptAttrs = Dict[str, Any] +_OptAttrs = dict[str, Any] class LinkWidget(forms.Widget): choices: Any = ... - def __init__(self, attrs: Optional[Any] = ..., choices: Any = ...) -> None: ... + 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: Optional[_OptAttrs] = ..., - choices: Tuple = ..., - renderer: Optional[BaseRenderer] = ..., + self, name: str, value: Any, attrs: _OptAttrs | None = ..., choices: tuple = ..., 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 render_option(self, name: Any, selected_choices: Any, option_value: Any, option_label: Any): ... def option_string(self): ... class SuffixedMultiWidget(forms.MultiWidget): @@ -38,7 +31,7 @@ class SuffixedMultiWidget(forms.MultiWidget): class RangeWidget(SuffixedMultiWidget): template_name: str = ... suffixes: Any = ... - def __init__(self, attrs: Optional[Any] = ...) -> None: ... + def __init__(self, attrs: Any | None = ...) -> None: ... def decompress(self, value: Any): ... class DateRangeWidget(RangeWidget): @@ -49,25 +42,13 @@ class LookupChoiceWidget(SuffixedMultiWidget): def decompress(self, value: Any): ... class BooleanWidget(forms.Select): - def __init__(self, attrs: Optional[Any] = ...) -> None: ... - def render( - self, - name: Any, - value: Any, - attrs: Optional[Any] = ..., - renderer: Optional[Any] = ..., - ): ... + 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: Optional[Any] = ..., - renderer: Optional[Any] = ..., - ): ... + def render(self, name: Any, value: Any, attrs: Any | None = ..., renderer: Any | None = ...): ... class CSVWidget(BaseCSVWidget, forms.TextInput): ... From 8956aafc5d1a6a91fc77da94c83e456b53b55eec Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Thu, 19 Oct 2023 23:41:13 +0300 Subject: [PATCH 5/6] [django-filter] Add django-filter metadata --- pyrightconfig.stricter.json | 1 + .../@tests/stubtest_allowlist.txt | 41 +++++++++++++++++++ stubs/django-filter/METADATA.toml | 3 ++ 3 files changed, 45 insertions(+) create mode 100644 stubs/django-filter/@tests/stubtest_allowlist.txt create mode 100644 stubs/django-filter/METADATA.toml 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..48ae9e6ae4ba --- /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.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.models +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"] From 4f003274cbdc7931ffcf9ad4809b5e3fb8cf5d9b Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Sun, 22 Oct 2023 12:52:25 +0300 Subject: [PATCH 6/6] [django-filter] Various minor fixes --- stubs/django-filter/@tests/stubtest_allowlist.txt | 2 +- stubs/django-filter/django_filters/fields.pyi | 9 ++++++--- stubs/django-filter/django_filters/filters.pyi | 6 ++++-- stubs/django-filter/django_filters/models.pyi | 0 stubs/django-filter/django_filters/views.pyi | 3 ++- stubs/django-filter/django_filters/widgets.pyi | 11 +++++++++-- 6 files changed, 22 insertions(+), 9 deletions(-) delete mode 100644 stubs/django-filter/django_filters/models.pyi diff --git a/stubs/django-filter/@tests/stubtest_allowlist.txt b/stubs/django-filter/@tests/stubtest_allowlist.txt index 48ae9e6ae4ba..d266723ddf4e 100644 --- a/stubs/django-filter/@tests/stubtest_allowlist.txt +++ b/stubs/django-filter/@tests/stubtest_allowlist.txt @@ -8,12 +8,12 @@ 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.models django_filters.rest_framework.DjangoFilterBackend django_filters.rest_framework.Filter.__init__ django_filters.rest_framework.FilterSet.base_filters diff --git a/stubs/django-filter/django_filters/fields.pyi b/stubs/django-filter/django_filters/fields.pyi index 59a866e5f60f..ed07338fe4d9 100644 --- a/stubs/django-filter/django_filters/fields.pyi +++ b/stubs/django-filter/django_filters/fields.pyi @@ -1,6 +1,7 @@ -from typing import Any +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 @@ -13,6 +14,8 @@ from .widgets import ( 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: ... @@ -85,9 +88,9 @@ class MultipleChoiceField(ChoiceIteratorMixin, forms.MultipleChoiceField): empty_label: Any = ... def __init__(self, *args: Any, **kwargs: Any) -> None: ... -class ModelChoiceField(ChoiceIteratorMixin, forms.ModelChoiceField): +class ModelChoiceField(ChoiceIteratorMixin, forms.ModelChoiceField[_M]): iterator: Any = ... def to_python(self, value: Any): ... -class ModelMultipleChoiceField(ChoiceIteratorMixin, forms.ModelMultipleChoiceField): +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 index 10697beb231e..db363f11da0e 100644 --- a/stubs/django-filter/django_filters/filters.pyi +++ b/stubs/django-filter/django_filters/filters.pyi @@ -1,4 +1,6 @@ -from typing import Any, Callable +from _typeshed import Incomplete +from collections.abc import Callable +from typing import Any class Filter: creation_counter: int = ... @@ -20,7 +22,7 @@ class Filter: **kwargs: Any, ) -> None: ... def get_method(self, qs: Any): ... - method: Callable = ... + method: Callable[..., Incomplete] = ... label: Any = ... @property def field(self): ... diff --git a/stubs/django-filter/django_filters/models.pyi b/stubs/django-filter/django_filters/models.pyi deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/stubs/django-filter/django_filters/views.pyi b/stubs/django-filter/django_filters/views.pyi index 482056c8029f..fc36dcf123ea 100644 --- a/stubs/django-filter/django_filters/views.pyi +++ b/stubs/django-filter/django_filters/views.pyi @@ -1,3 +1,4 @@ +from _typeshed import Incomplete from typing import Any from django.views.generic import View @@ -19,7 +20,7 @@ class FilterMixin(metaclass=FilterMixinRenames): def get_filterset_kwargs(self, filterset_class: Any): ... def get_strict(self): ... -class BaseFilterView(FilterMixin, MultipleObjectMixin, View): +class BaseFilterView(FilterMixin, MultipleObjectMixin[Incomplete], View): filterset: Any = ... object_list: Any = ... def get(self, request: Any, *args: Any, **kwargs: Any): ... diff --git a/stubs/django-filter/django_filters/widgets.pyi b/stubs/django-filter/django_filters/widgets.pyi index 2e9f387944e5..163abbe839d1 100644 --- a/stubs/django-filter/django_filters/widgets.pyi +++ b/stubs/django-filter/django_filters/widgets.pyi @@ -1,10 +1,12 @@ +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 = dict[str, Any] +_OptAttrs: TypeAlias = dict[str, Any] class LinkWidget(forms.Widget): choices: Any = ... @@ -12,7 +14,12 @@ class LinkWidget(forms.Widget): 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 = ..., renderer: BaseRenderer | None = ... + 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): ...