From 45ae19a23f00e8c4e92a941c3ef80ed19d89b2ef Mon Sep 17 00:00:00 2001 From: Brian Helba Date: Tue, 19 Sep 2023 14:17:50 -0400 Subject: [PATCH 1/2] Add "Field.formfield" annotations --- django-stubs/contrib/gis/db/models/fields.pyi | 4 +++- django-stubs/db/models/fields/__init__.pyi | 8 +++++++- scripts/stubtest/allowlist.txt | 4 ++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/django-stubs/contrib/gis/db/models/fields.pyi b/django-stubs/contrib/gis/db/models/fields.pyi index 31d9fd841..8ca3757a4 100644 --- a/django-stubs/contrib/gis/db/models/fields.pyi +++ b/django-stubs/contrib/gis/db/models/fields.pyi @@ -108,7 +108,9 @@ class GeometryField(BaseSpatialField[_ST, _GT]): validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... - def formfield(self, **kwargs: Any) -> Any: ... # type: ignore[override] + def formfield( # type: ignore[override] + self, form_class: type[forms.GeometryField] | None = ..., geom_type: str = ..., srid: Any = ..., **kwargs: Any + ) -> forms.GeometryField: ... def select_format(self, compiler: Any, sql: Any, params: Any) -> Any: ... class PointField(GeometryField[_ST, _GT]): diff --git a/django-stubs/db/models/fields/__init__.pyi b/django-stubs/db/models/fields/__init__.pyi index 3e25c2d45..d6725d4b6 100644 --- a/django-stubs/db/models/fields/__init__.pyi +++ b/django-stubs/db/models/fields/__init__.pyi @@ -5,6 +5,7 @@ from datetime import date, time, timedelta from datetime import datetime as real_datetime from typing import Any, ClassVar, Generic, Literal, Protocol, TypeVar, overload +from django import forms from django.core import validators # due to weird mypy.stubtest error from django.core.checks import CheckMessage from django.core.exceptions import FieldDoesNotExist as FieldDoesNotExist @@ -202,7 +203,12 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]): def get_db_prep_save(self, value: Any, connection: BaseDatabaseWrapper) -> Any: ... def get_internal_type(self) -> str: ... # TODO: plugin support - def formfield(self, form_class: Any | None = ..., choices_form_class: Any | None = ..., **kwargs: Any) -> Any: ... + def formfield( + self, + form_class: type[forms.Field] | None = ..., + choices_form_class: type[forms.ChoiceField] | None = ..., + **kwargs: Any, + ) -> forms.Field: ... def save_form_data(self, instance: Model, data: Any) -> None: ... def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = ...) -> None: ... def to_python(self, value: Any) -> Any: ... diff --git a/scripts/stubtest/allowlist.txt b/scripts/stubtest/allowlist.txt index a230a84aa..931f19a97 100644 --- a/scripts/stubtest/allowlist.txt +++ b/scripts/stubtest/allowlist.txt @@ -14,6 +14,10 @@ django.contrib.auth.migrations.* django.contrib.flatpages.migrations.* django.contrib.contenttypes.migrations.* +# Annotate optional parameters which Django accepts as **kwargs +django.contrib.gis.db.models.GeometryField.formfield +django.contrib.gis.db.models.fields.GeometryField.formfield + # default_storage is actually an instance of DefaultStorage, but it proxies through to a Storage django.core.files.storage.default_storage From 9010b5f8569255c55bc2253602a90eba2e57f46c Mon Sep 17 00:00:00 2001 From: Marti Raudsepp Date: Wed, 18 Oct 2023 17:59:42 +0300 Subject: [PATCH 2/2] Apply suggestions from code review --- django-stubs/contrib/gis/db/models/fields.pyi | 4 ++-- django-stubs/db/models/fields/__init__.pyi | 4 ++-- scripts/stubtest/allowlist.txt | 4 ---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/django-stubs/contrib/gis/db/models/fields.pyi b/django-stubs/contrib/gis/db/models/fields.pyi index 8ca3757a4..9de810933 100644 --- a/django-stubs/contrib/gis/db/models/fields.pyi +++ b/django-stubs/contrib/gis/db/models/fields.pyi @@ -109,8 +109,8 @@ class GeometryField(BaseSpatialField[_ST, _GT]): error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... def formfield( # type: ignore[override] - self, form_class: type[forms.GeometryField] | None = ..., geom_type: str = ..., srid: Any = ..., **kwargs: Any - ) -> forms.GeometryField: ... + self, *, form_class: type[GeometryField] | None = ..., geom_type: str = ..., srid: Any = ..., **kwargs: Any + ) -> GeometryField: ... def select_format(self, compiler: Any, sql: Any, params: Any) -> Any: ... class PointField(GeometryField[_ST, _GT]): diff --git a/django-stubs/db/models/fields/__init__.pyi b/django-stubs/db/models/fields/__init__.pyi index 279131eca..471245bf8 100644 --- a/django-stubs/db/models/fields/__init__.pyi +++ b/django-stubs/db/models/fields/__init__.pyi @@ -205,10 +205,10 @@ class Field(RegisterLookupMixin, Generic[_ST, _GT]): # TODO: plugin support def formfield( self, - form_class: type[forms.Field] | None = ..., + form_class: type[Field] | None = ..., choices_form_class: type[forms.ChoiceField] | None = ..., **kwargs: Any, - ) -> forms.Field: ... + ) -> Field: ... def save_form_data(self, instance: Model, data: Any) -> None: ... def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = ...) -> None: ... def to_python(self, value: Any) -> Any: ... diff --git a/scripts/stubtest/allowlist.txt b/scripts/stubtest/allowlist.txt index 7e783daf9..57feee188 100644 --- a/scripts/stubtest/allowlist.txt +++ b/scripts/stubtest/allowlist.txt @@ -14,10 +14,6 @@ django.contrib.auth.migrations.* django.contrib.flatpages.migrations.* django.contrib.contenttypes.migrations.* -# Annotate optional parameters which Django accepts as **kwargs -django.contrib.gis.db.models.GeometryField.formfield -django.contrib.gis.db.models.fields.GeometryField.formfield - # default_storage is actually an instance of DefaultStorage, but it proxies through to a Storage django.core.files.storage.default_storage