Skip to content

Commit 58e3ffc

Browse files
committed
Merge branch 'master' into GeoModelAdminMixin
2 parents 0dac9c4 + b59a0fb commit 58e3ffc

File tree

17 files changed

+36
-148
lines changed

17 files changed

+36
-148
lines changed

django-stubs/conf/global_settings.pyi

-5
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ TIME_ZONE: str
4040

4141
# If you set this to True, Django will use timezone-aware datetimes.
4242
USE_TZ: bool
43-
USE_DEPRECATED_PYTZ: bool
4443

4544
# Language code for this installation. All choices can be found here:
4645
# http://www.i18nguy.com/unicode/language-identifiers.html
@@ -66,10 +65,6 @@ LANGUAGE_COOKIE_HTTPONLY: bool
6665
LANGUAGE_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False] | None
6766
LANGUAGE_COOKIE_SECURE: bool
6867

69-
# If you set this to True, Django will format dates, numbers and calendars
70-
# according to user current locale.
71-
USE_L10N: bool
72-
7368
# Not-necessarily-technical managers of the site. They get broken link
7469
# notifications and other various emails.
7570
MANAGERS: _Admins

django-stubs/contrib/admin/options.pyi

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class BaseModelAdmin(Generic[_ModelT]):
128128
def get_prepopulated_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> dict[str, Sequence[str]]: ...
129129
def get_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ...
130130
def get_sortable_by(self, request: HttpRequest) -> _DisplayT[_ModelT]: ...
131-
def lookup_allowed(self, lookup: str, value: str) -> bool: ...
131+
def lookup_allowed(self, lookup: str, value: str, request: HttpRequest | None = ...) -> bool: ...
132132
def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ...
133133
def has_add_permission(self, request: HttpRequest) -> bool: ...
134134
def has_change_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ...

django-stubs/contrib/gis/admin/__init__.pyi

-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,5 @@ from django.contrib.admin import action as action
88
from django.contrib.admin import autodiscover as autodiscover
99
from django.contrib.admin import register as register
1010
from django.contrib.admin import site as site
11-
from django.contrib.gis.admin.options import GeoModelAdmin as GeoModelAdmin
1211
from django.contrib.gis.admin.options import GISModelAdmin as GISModelAdmin
13-
from django.contrib.gis.admin.options import OSMGeoAdmin as OSMGeoAdmin
1412
from django.contrib.gis.admin.widgets import OpenLayersWidget as OpenLayersWidget

django-stubs/contrib/gis/admin/options.pyi

-46
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,11 @@ from django.contrib.admin import ModelAdmin
44
from django.contrib.gis.forms import OSMWidget
55
from django.db.models import Field
66
from django.forms.fields import Field as FormField
7-
from django.forms.widgets import Media
87
from django.http import HttpRequest
98

10-
spherical_mercator_srid: int
11-
129
class GeoModelAdminMixin:
1310
gis_widget: ClassVar[type[OSMWidget]]
1411
gis_widget_kwargs: ClassVar[dict[str, Any]]
1512
def formfield_for_dbfield(self, db_field: Field, request: HttpRequest, **kwargs: Any) -> FormField: ...
1613

1714
class GISModelAdmin(GeoModelAdminMixin, ModelAdmin): ...
18-
19-
class GeoModelAdmin(ModelAdmin):
20-
default_lon: int
21-
default_lat: int
22-
default_zoom: int
23-
display_wkt: bool
24-
display_srid: bool
25-
extra_js: Any
26-
num_zoom: int
27-
max_zoom: bool
28-
min_zoom: bool
29-
units: str | bool
30-
max_resolution: str | bool
31-
max_extent: str | bool
32-
modifiable: bool
33-
mouse_position: bool
34-
scale_text: bool
35-
layerswitcher: bool
36-
scrollable: bool
37-
map_width: int
38-
map_height: int
39-
map_srid: int
40-
map_template: str
41-
openlayers_url: str
42-
point_zoom: Any
43-
wms_url: str
44-
wms_layer: str
45-
wms_name: str
46-
wms_options: Any
47-
debug: bool
48-
widget: Any
49-
@property
50-
def media(self) -> Media: ...
51-
def get_map_widget(self, db_field: Any) -> Any: ...
52-
53-
class OSMGeoAdmin(GeoModelAdmin):
54-
map_template: str
55-
num_zoom: int
56-
map_srid: Any
57-
max_extent: str
58-
max_resolution: str
59-
point_zoom: int
60-
units: str

django-stubs/db/backends/base/base.pyi

-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ _ExecuteWrapper: TypeAlias = Callable[
2424
[Callable[[str, Any, bool, dict[str, Any]], Any], str, Any, bool, dict[str, Any]], Any
2525
]
2626

27-
def timezone_constructor(tzname: str) -> tzinfo: ...
28-
2927
class BaseDatabaseWrapper:
3028
data_types: dict[str, str]
3129
data_types_suffix: dict[str, str]

django-stubs/db/models/constraints.pyi

+14-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ from django.db.models.base import Model
77
from django.db.models.expressions import BaseExpression, Combinable
88
from django.db.models.query_utils import Q
99
from django.utils.functional import _StrOrPromise
10-
from typing_extensions import Self
10+
from typing_extensions import Self, deprecated
1111

1212
class Deferrable(Enum):
1313
DEFERRED: str
@@ -18,7 +18,19 @@ class BaseConstraint:
1818
violation_error_code: str | None
1919
violation_error_message: _StrOrPromise | None
2020
default_violation_error_message: _StrOrPromise
21-
def __init__(self, name: str, violation_error_message: _StrOrPromise | None = ...) -> None: ...
21+
@overload
22+
def __init__(
23+
self, *, name: str, violation_error_code: str | None = ..., violation_error_message: _StrOrPromise | None = ...
24+
) -> None: ...
25+
@overload
26+
@deprecated("Passing positional arguments to BaseConstraint is deprecated and will be removed in Django 6.0")
27+
def __init__(
28+
self,
29+
*args: Any,
30+
name: str | None = ...,
31+
violation_error_code: str | None = ...,
32+
violation_error_message: _StrOrPromise | None = ...,
33+
) -> None: ...
2234
def constraint_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ...
2335
def create_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ...
2436
def remove_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ...

django-stubs/templatetags/tz.pyi

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
from datetime import datetime
1+
from datetime import datetime, tzinfo
22
from typing import Any
33

44
from django.template import Node
55
from django.template.base import FilterExpression, NodeList, Parser, Token
6-
from django.utils.timezone import _TzInfoT
76

87
register: Any
98

109
class datetimeobject(datetime): ...
1110

1211
def localtime(value: datetime | str | None) -> Any: ...
1312
def utc(value: datetime | str | None) -> Any: ...
14-
def do_timezone(value: datetime | str | None, arg: _TzInfoT | str | None) -> Any: ...
13+
def do_timezone(value: datetime | str | None, arg: tzinfo | str | None) -> Any: ...
1514

1615
class LocalTimeNode(Node):
1716
nodelist: NodeList

django-stubs/test/runner.pyi

+2-4
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,7 @@ class DiscoverRunner:
144144
@contextmanager
145145
def load_with_patterns(self) -> Iterator[None]: ...
146146
def load_tests_for_label(self, label: str, discover_kwargs: dict[str, str]) -> TestSuite: ...
147-
def build_suite(
148-
self, test_labels: Sequence[str] = ..., extra_tests: list[Any] | None = ..., **kwargs: Any
149-
) -> TestSuite: ...
147+
def build_suite(self, test_labels: Sequence[str] | None = ..., **kwargs: Any) -> TestSuite: ...
150148
def setup_databases(self, **kwargs: Any) -> list[tuple[BaseDatabaseWrapper, str, bool]]: ...
151149
def get_resultclass(self) -> type[TextTestResult] | None: ...
152150
def get_test_runner_kwargs(self) -> dict[str, Any]: ...
@@ -157,7 +155,7 @@ class DiscoverRunner:
157155
def suite_result(self, suite: TestSuite, result: TextTestResult, **kwargs: Any) -> int: ...
158156
def _get_databases(self, suite: TestSuite) -> set[str]: ...
159157
def get_databases(self, suite: TestSuite) -> set[str]: ...
160-
def run_tests(self, test_labels: list[str], extra_tests: list[Any] | None = ..., **kwargs: Any) -> int: ...
158+
def run_tests(self, test_labels: list[str], **kwargs: Any) -> int: ...
161159

162160
def is_discoverable(label: str) -> bool: ...
163161
def reorder_suite(

django-stubs/utils/baseconv.pyi

-22
This file was deleted.

django-stubs/utils/dateformat.pyi

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
from datetime import date
1+
from datetime import date, tzinfo
22
from datetime import datetime as builtin_datetime
33
from datetime import time as builtin_time
44
from re import Pattern
55
from typing import Any, Literal
66

7-
from django.utils.timezone import _TzInfoT
8-
97
re_formatchars: Pattern[str]
108
re_escaped: Pattern[str]
119

@@ -14,7 +12,7 @@ class Formatter:
1412

1513
class TimeFormat(Formatter):
1614
data: builtin_datetime | builtin_time
17-
timezone: _TzInfoT | None
15+
timezone: tzinfo | None
1816
def __init__(self, obj: builtin_datetime | builtin_time) -> None: ...
1917
def a(self) -> str: ...
2018
def A(self) -> str: ...
@@ -34,7 +32,7 @@ class TimeFormat(Formatter):
3432

3533
class DateFormat(TimeFormat):
3634
data: builtin_datetime | date | builtin_time # type: ignore[assignment]
37-
timezone: _TzInfoT | None
35+
timezone: tzinfo | None
3836
year_days: Any
3937
def __init__(self, obj: builtin_datetime | builtin_time | date) -> None: ...
4038
def b(self) -> str: ...

django-stubs/utils/datetime_safe.pyi

-15
This file was deleted.

django-stubs/utils/timezone.pyi

+11-22
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,22 @@ from datetime import date, datetime, time, timedelta, timezone, tzinfo
33
from types import TracebackType
44
from typing import Any, Literal, overload
55

6-
import pytz
7-
from pytz import BaseTzInfo
8-
from typing_extensions import TypeAlias, TypeGuard
9-
10-
_PytzTzInfoT: TypeAlias = pytz.tzinfo.BaseTzInfo | pytz._FixedOffset
11-
12-
_TzInfoT: TypeAlias = _PytzTzInfoT | tzinfo
6+
import zoneinfo
137

148
utc: Any
159

1610
def get_fixed_timezone(offset: timedelta | int) -> timezone: ...
17-
def get_default_timezone() -> BaseTzInfo: ...
11+
def get_default_timezone() -> zoneinfo.ZoneInfo: ...
1812
def get_default_timezone_name() -> str: ...
19-
20-
# Strictly speaking, it is possible to activate() a non-pytz timezone,
21-
# in which case BaseTzInfo is incorrect. However, this is unlikely,
22-
# so we use it anyway, to keep things ergonomic for most users.
23-
def get_current_timezone() -> BaseTzInfo: ...
13+
def get_current_timezone() -> zoneinfo.ZoneInfo: ...
2414
def get_current_timezone_name() -> str: ...
25-
def activate(timezone: _TzInfoT | str) -> None: ...
15+
def activate(timezone: tzinfo | str) -> None: ...
2616
def deactivate() -> None: ...
2717

2818
class override(ContextDecorator):
29-
timezone: str | _TzInfoT | None
30-
old_timezone: _TzInfoT | None
31-
def __init__(self, timezone: str | _TzInfoT | None) -> None: ...
19+
timezone: str | tzinfo | None
20+
old_timezone: tzinfo | None
21+
def __init__(self, timezone: str | tzinfo | None) -> None: ...
3222
def __enter__(self) -> None: ...
3323
def __exit__(
3424
self,
@@ -37,8 +27,8 @@ class override(ContextDecorator):
3727
exc_tb: TracebackType | None,
3828
) -> None: ...
3929

40-
def localtime(value: datetime | None = ..., timezone: _TzInfoT | None = ...) -> datetime: ...
41-
def localdate(value: datetime | None = ..., timezone: _TzInfoT | None = ...) -> date: ...
30+
def localtime(value: datetime | None = ..., timezone: tzinfo | None = ...) -> datetime: ...
31+
def localdate(value: datetime | None = ..., timezone: tzinfo | None = ...) -> date: ...
4232
def now() -> datetime: ...
4333
@overload
4434
def is_aware(value: time) -> Literal[False]: ...
@@ -48,6 +38,5 @@ def is_aware(value: datetime) -> bool: ...
4838
def is_naive(value: time) -> Literal[True]: ...
4939
@overload
5040
def is_naive(value: datetime) -> bool: ...
51-
def make_aware(value: datetime, timezone: _TzInfoT | None = ..., is_dst: bool | None = ...) -> datetime: ...
52-
def make_naive(value: datetime, timezone: _TzInfoT | None = ...) -> datetime: ...
53-
def _is_pytz_zone(tz: _TzInfoT) -> TypeGuard[_PytzTzInfoT]: ...
41+
def make_aware(value: datetime, timezone: tzinfo | None = ..., is_dst: bool | None = ...) -> datetime: ...
42+
def make_naive(value: datetime, timezone: tzinfo | None = ...) -> datetime: ...

mypy_django_plugin/django/context.py

+3
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ def get_field_related_model_cls(self, field: Union["RelatedField[Any, Any]", For
369369
else:
370370
related_model_cls = field.field.model
371371

372+
if related_model_cls is None:
373+
raise UnregisteredModelError
374+
372375
if isinstance(related_model_cls, str):
373376
if related_model_cls == "self": # type: ignore[unreachable]
374377
# same model

scripts/stubtest/allowlist_todo.txt

-5
Original file line numberDiff line numberDiff line change
@@ -225,19 +225,15 @@ django.contrib.flatpages.models.FlatPage.template_name
225225
django.contrib.flatpages.models.FlatPage.title
226226
django.contrib.flatpages.models.FlatPage.url
227227
django.contrib.gis.admin.GISModelAdmin
228-
django.contrib.gis.admin.GeoModelAdmin
229228
django.contrib.gis.admin.ModelAdmin
230229
django.contrib.gis.admin.ModelAdmin.log_addition
231230
django.contrib.gis.admin.ModelAdmin.log_change
232231
django.contrib.gis.admin.ModelAdmin.log_deletion
233-
django.contrib.gis.admin.OSMGeoAdmin
234232
django.contrib.gis.admin.StackedInline
235233
django.contrib.gis.admin.TabularInline
236234
django.contrib.gis.admin.action
237235
django.contrib.gis.admin.display
238236
django.contrib.gis.admin.options.GISModelAdmin
239-
django.contrib.gis.admin.options.GeoModelAdmin
240-
django.contrib.gis.admin.options.OSMGeoAdmin
241237
django.contrib.gis.admin.site
242238
django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.can_alter_geometry_field
243239
django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.empty_intersection_returns_none
@@ -1670,7 +1666,6 @@ django.templatetags.static.StaticNode.__init__
16701666
django.test.SimpleTestCase.assertFormError
16711667
django.test.SimpleTestCase.assertFormSetError
16721668
django.test.SimpleTestCase.assertTemplateNotUsed
1673-
django.test.runner.DiscoverRunner.build_suite
16741669
django.test.runner.DiscoverRunner.log
16751670
django.test.runner.DiscoverRunner.reorder_by
16761671
django.test.runner.DummyList

0 commit comments

Comments
 (0)