mirror of
https://github.com/django/django.git
synced 2025-03-31 19:46:42 +00:00
Refs #32365 -- Removed is_dst argument for various methods and functions.
Per deprecation timeline.
This commit is contained in:
parent
e6f82438d4
commit
2fad163257
@ -241,18 +241,14 @@ class TruncBase(TimezoneMixin, Transform):
|
|||||||
kind = None
|
kind = None
|
||||||
tzinfo = None
|
tzinfo = None
|
||||||
|
|
||||||
# RemovedInDjango50Warning: when the deprecation ends, remove is_dst
|
|
||||||
# argument.
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
expression,
|
expression,
|
||||||
output_field=None,
|
output_field=None,
|
||||||
tzinfo=None,
|
tzinfo=None,
|
||||||
is_dst=timezone.NOT_PASSED,
|
|
||||||
**extra,
|
**extra,
|
||||||
):
|
):
|
||||||
self.tzinfo = tzinfo
|
self.tzinfo = tzinfo
|
||||||
self.is_dst = is_dst
|
|
||||||
super().__init__(expression, output_field=output_field, **extra)
|
super().__init__(expression, output_field=output_field, **extra)
|
||||||
|
|
||||||
def as_sql(self, compiler, connection):
|
def as_sql(self, compiler, connection):
|
||||||
@ -343,7 +339,7 @@ class TruncBase(TimezoneMixin, Transform):
|
|||||||
pass
|
pass
|
||||||
elif value is not None:
|
elif value is not None:
|
||||||
value = value.replace(tzinfo=None)
|
value = value.replace(tzinfo=None)
|
||||||
value = timezone.make_aware(value, self.tzinfo, is_dst=self.is_dst)
|
value = timezone.make_aware(value, self.tzinfo)
|
||||||
elif not connection.features.has_zoneinfo_database:
|
elif not connection.features.has_zoneinfo_database:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Database returned an invalid datetime value. Are time "
|
"Database returned an invalid datetime value. Are time "
|
||||||
@ -360,22 +356,16 @@ class TruncBase(TimezoneMixin, Transform):
|
|||||||
|
|
||||||
|
|
||||||
class Trunc(TruncBase):
|
class Trunc(TruncBase):
|
||||||
|
|
||||||
# RemovedInDjango50Warning: when the deprecation ends, remove is_dst
|
|
||||||
# argument.
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
expression,
|
expression,
|
||||||
kind,
|
kind,
|
||||||
output_field=None,
|
output_field=None,
|
||||||
tzinfo=None,
|
tzinfo=None,
|
||||||
is_dst=timezone.NOT_PASSED,
|
|
||||||
**extra,
|
**extra,
|
||||||
):
|
):
|
||||||
self.kind = kind
|
self.kind = kind
|
||||||
super().__init__(
|
super().__init__(expression, output_field=output_field, tzinfo=tzinfo, **extra)
|
||||||
expression, output_field=output_field, tzinfo=tzinfo, is_dst=is_dst, **extra
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class TruncYear(TruncBase):
|
class TruncYear(TruncBase):
|
||||||
|
@ -1372,11 +1372,7 @@ class QuerySet(AltersData):
|
|||||||
.order_by(("-" if order == "DESC" else "") + "datefield")
|
.order_by(("-" if order == "DESC" else "") + "datefield")
|
||||||
)
|
)
|
||||||
|
|
||||||
# RemovedInDjango50Warning: when the deprecation ends, remove is_dst
|
def datetimes(self, field_name, kind, order="ASC", tzinfo=None):
|
||||||
# argument.
|
|
||||||
def datetimes(
|
|
||||||
self, field_name, kind, order="ASC", tzinfo=None, is_dst=timezone.NOT_PASSED
|
|
||||||
):
|
|
||||||
"""
|
"""
|
||||||
Return a list of datetime objects representing all available
|
Return a list of datetime objects representing all available
|
||||||
datetimes for the given field_name, scoped to 'kind'.
|
datetimes for the given field_name, scoped to 'kind'.
|
||||||
@ -1400,7 +1396,6 @@ class QuerySet(AltersData):
|
|||||||
kind,
|
kind,
|
||||||
output_field=DateTimeField(),
|
output_field=DateTimeField(),
|
||||||
tzinfo=tzinfo,
|
tzinfo=tzinfo,
|
||||||
is_dst=is_dst,
|
|
||||||
),
|
),
|
||||||
plain_field=F(field_name),
|
plain_field=F(field_name),
|
||||||
)
|
)
|
||||||
|
@ -37,9 +37,6 @@ __all__ = [ # noqa for utc RemovedInDjango50Warning.
|
|||||||
"make_naive",
|
"make_naive",
|
||||||
]
|
]
|
||||||
|
|
||||||
# RemovedInDjango50Warning: sentinel for deprecation of is_dst parameters.
|
|
||||||
NOT_PASSED = object()
|
|
||||||
|
|
||||||
|
|
||||||
def __getattr__(name):
|
def __getattr__(name):
|
||||||
if name != "utc":
|
if name != "utc":
|
||||||
@ -259,17 +256,8 @@ def is_naive(value):
|
|||||||
return value.utcoffset() is None
|
return value.utcoffset() is None
|
||||||
|
|
||||||
|
|
||||||
def make_aware(value, timezone=None, is_dst=NOT_PASSED):
|
def make_aware(value, timezone=None):
|
||||||
"""Make a naive datetime.datetime in a given time zone aware."""
|
"""Make a naive datetime.datetime in a given time zone aware."""
|
||||||
if is_dst is NOT_PASSED:
|
|
||||||
is_dst = None
|
|
||||||
else:
|
|
||||||
warnings.warn(
|
|
||||||
"The is_dst argument to make_aware(), used by the Trunc() "
|
|
||||||
"database functions and QuerySet.datetimes(), is deprecated as it "
|
|
||||||
"has no effect with zoneinfo time zones.",
|
|
||||||
RemovedInDjango50Warning,
|
|
||||||
)
|
|
||||||
if timezone is None:
|
if timezone is None:
|
||||||
timezone = get_current_timezone()
|
timezone = get_current_timezone()
|
||||||
# Check that we won't overwrite the timezone of an aware datetime.
|
# Check that we won't overwrite the timezone of an aware datetime.
|
||||||
|
@ -503,7 +503,7 @@ Usage example::
|
|||||||
``Trunc``
|
``Trunc``
|
||||||
---------
|
---------
|
||||||
|
|
||||||
.. class:: Trunc(expression, kind, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: Trunc(expression, kind, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
Truncates a date up to a significant component.
|
Truncates a date up to a significant component.
|
||||||
|
|
||||||
@ -521,14 +521,6 @@ value. If ``output_field`` is omitted, it will default to the ``output_field``
|
|||||||
of ``expression``. A ``tzinfo`` subclass, usually provided by :mod:`zoneinfo`,
|
of ``expression``. A ``tzinfo`` subclass, usually provided by :mod:`zoneinfo`,
|
||||||
can be passed to truncate a value in a specific timezone.
|
can be passed to truncate a value in a specific timezone.
|
||||||
|
|
||||||
.. deprecated:: 4.0
|
|
||||||
|
|
||||||
The ``is_dst`` parameter indicates whether or not ``pytz`` should interpret
|
|
||||||
nonexistent and ambiguous datetimes in daylight saving time. By default
|
|
||||||
(when ``is_dst=None``), ``pytz`` raises an exception for such datetimes.
|
|
||||||
|
|
||||||
The ``is_dst`` parameter is deprecated and will be removed in Django 5.0.
|
|
||||||
|
|
||||||
Given the datetime ``2015-06-15 14:30:50.000321+00:00``, the built-in ``kind``\s
|
Given the datetime ``2015-06-15 14:30:50.000321+00:00``, the built-in ``kind``\s
|
||||||
return:
|
return:
|
||||||
|
|
||||||
@ -594,28 +586,24 @@ Usage example::
|
|||||||
``DateField`` truncation
|
``DateField`` truncation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. class:: TruncYear(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncYear(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'year'
|
.. attribute:: kind = 'year'
|
||||||
|
|
||||||
.. class:: TruncMonth(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncMonth(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'month'
|
.. attribute:: kind = 'month'
|
||||||
|
|
||||||
.. class:: TruncWeek(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncWeek(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
Truncates to midnight on the Monday of the week.
|
Truncates to midnight on the Monday of the week.
|
||||||
|
|
||||||
.. attribute:: kind = 'week'
|
.. attribute:: kind = 'week'
|
||||||
|
|
||||||
.. class:: TruncQuarter(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncQuarter(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'quarter'
|
.. attribute:: kind = 'quarter'
|
||||||
|
|
||||||
.. deprecated:: 4.0
|
|
||||||
|
|
||||||
The ``is_dst`` parameter is deprecated and will be removed in Django 5.0.
|
|
||||||
|
|
||||||
These are logically equivalent to ``Trunc('date_field', kind)``. They truncate
|
These are logically equivalent to ``Trunc('date_field', kind)``. They truncate
|
||||||
all parts of the date up to ``kind`` which allows grouping or filtering dates
|
all parts of the date up to ``kind`` which allows grouping or filtering dates
|
||||||
with less precision. ``expression`` can have an ``output_field`` of either
|
with less precision. ``expression`` can have an ``output_field`` of either
|
||||||
@ -675,26 +663,22 @@ truncate function. It's also registered as a transform on ``DateTimeField`` as
|
|||||||
truncate function. It's also registered as a transform on ``DateTimeField`` as
|
truncate function. It's also registered as a transform on ``DateTimeField`` as
|
||||||
``__time``.
|
``__time``.
|
||||||
|
|
||||||
.. class:: TruncDay(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncDay(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'day'
|
.. attribute:: kind = 'day'
|
||||||
|
|
||||||
.. class:: TruncHour(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncHour(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'hour'
|
.. attribute:: kind = 'hour'
|
||||||
|
|
||||||
.. class:: TruncMinute(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncMinute(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'minute'
|
.. attribute:: kind = 'minute'
|
||||||
|
|
||||||
.. class:: TruncSecond(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncSecond(expression, output_field=None, tzinfo=None, **extra)
|
||||||
|
|
||||||
.. attribute:: kind = 'second'
|
.. attribute:: kind = 'second'
|
||||||
|
|
||||||
.. deprecated:: 4.0
|
|
||||||
|
|
||||||
The ``is_dst`` parameter is deprecated and will be removed in Django 5.0.
|
|
||||||
|
|
||||||
These are logically equivalent to ``Trunc('datetime_field', kind)``. They
|
These are logically equivalent to ``Trunc('datetime_field', kind)``. They
|
||||||
truncate all parts of the date up to ``kind`` and allow grouping or filtering
|
truncate all parts of the date up to ``kind`` and allow grouping or filtering
|
||||||
datetimes with less precision. ``expression`` must have an ``output_field`` of
|
datetimes with less precision. ``expression`` must have an ``output_field`` of
|
||||||
@ -728,25 +712,21 @@ Usage example::
|
|||||||
``TimeField`` truncation
|
``TimeField`` truncation
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. class:: TruncHour(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncHour(expression, output_field=None, tzinfo=None, **extra)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
.. attribute:: kind = 'hour'
|
.. attribute:: kind = 'hour'
|
||||||
|
|
||||||
.. class:: TruncMinute(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncMinute(expression, output_field=None, tzinfo=None, **extra)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
.. attribute:: kind = 'minute'
|
.. attribute:: kind = 'minute'
|
||||||
|
|
||||||
.. class:: TruncSecond(expression, output_field=None, tzinfo=None, is_dst=None, **extra)
|
.. class:: TruncSecond(expression, output_field=None, tzinfo=None, **extra)
|
||||||
:noindex:
|
:noindex:
|
||||||
|
|
||||||
.. attribute:: kind = 'second'
|
.. attribute:: kind = 'second'
|
||||||
|
|
||||||
.. deprecated:: 4.0
|
|
||||||
|
|
||||||
The ``is_dst`` parameter is deprecated and will be removed in Django 5.0.
|
|
||||||
|
|
||||||
These are logically equivalent to ``Trunc('time_field', kind)``. They truncate
|
These are logically equivalent to ``Trunc('time_field', kind)``. They truncate
|
||||||
all parts of the time up to ``kind`` which allows grouping or filtering times
|
all parts of the time up to ``kind`` which allows grouping or filtering times
|
||||||
with less precision. ``expression`` can have an ``output_field`` of either
|
with less precision. ``expression`` can have an ``output_field`` of either
|
||||||
|
@ -837,7 +837,7 @@ Examples::
|
|||||||
``datetimes()``
|
``datetimes()``
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
.. method:: datetimes(field_name, kind, order='ASC', tzinfo=None, is_dst=None)
|
.. method:: datetimes(field_name, kind, order='ASC', tzinfo=None)
|
||||||
|
|
||||||
Returns a ``QuerySet`` that evaluates to a list of :class:`datetime.datetime`
|
Returns a ``QuerySet`` that evaluates to a list of :class:`datetime.datetime`
|
||||||
objects representing all available dates of a particular kind within the
|
objects representing all available dates of a particular kind within the
|
||||||
@ -859,14 +859,6 @@ object. If it's ``None``, Django uses the :ref:`current time zone
|
|||||||
<default-current-time-zone>`. It has no effect when :setting:`USE_TZ` is
|
<default-current-time-zone>`. It has no effect when :setting:`USE_TZ` is
|
||||||
``False``.
|
``False``.
|
||||||
|
|
||||||
``is_dst`` indicates whether or not ``pytz`` should interpret nonexistent and
|
|
||||||
ambiguous datetimes in daylight saving time. By default (when ``is_dst=None``),
|
|
||||||
``pytz`` raises an exception for such datetimes.
|
|
||||||
|
|
||||||
.. deprecated:: 4.0
|
|
||||||
|
|
||||||
The ``is_dst`` parameter is deprecated and will be removed in Django 5.0.
|
|
||||||
|
|
||||||
.. _database-time-zone-definitions:
|
.. _database-time-zone-definitions:
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
@ -972,38 +972,13 @@ appropriate entities.
|
|||||||
Returns ``True`` if ``value`` is naive, ``False`` if it is aware. This
|
Returns ``True`` if ``value`` is naive, ``False`` if it is aware. This
|
||||||
function assumes that ``value`` is a :class:`~datetime.datetime`.
|
function assumes that ``value`` is a :class:`~datetime.datetime`.
|
||||||
|
|
||||||
.. function:: make_aware(value, timezone=None, is_dst=None)
|
.. function:: make_aware(value, timezone=None)
|
||||||
|
|
||||||
Returns an aware :class:`~datetime.datetime` that represents the same
|
Returns an aware :class:`~datetime.datetime` that represents the same
|
||||||
point in time as ``value`` in ``timezone``, ``value`` being a naive
|
point in time as ``value`` in ``timezone``, ``value`` being a naive
|
||||||
:class:`~datetime.datetime`. If ``timezone`` is set to ``None``, it
|
:class:`~datetime.datetime`. If ``timezone`` is set to ``None``, it
|
||||||
defaults to the :ref:`current time zone <default-current-time-zone>`.
|
defaults to the :ref:`current time zone <default-current-time-zone>`.
|
||||||
|
|
||||||
.. deprecated:: 4.0
|
|
||||||
|
|
||||||
When using ``pytz``, the ``pytz.AmbiguousTimeError`` exception is
|
|
||||||
raised if you try to make ``value`` aware during a DST transition where
|
|
||||||
the same time occurs twice (when reverting from DST). Setting
|
|
||||||
``is_dst`` to ``True`` or ``False`` will avoid the exception by
|
|
||||||
choosing if the time is pre-transition or post-transition respectively.
|
|
||||||
|
|
||||||
When using ``pytz``, the ``pytz.NonExistentTimeError`` exception is
|
|
||||||
raised if you try to make ``value`` aware during a DST transition such
|
|
||||||
that the time never occurred. For example, if the 2:00 hour is skipped
|
|
||||||
during a DST transition, trying to make 2:30 aware in that time zone
|
|
||||||
will raise an exception. To avoid that you can use ``is_dst`` to
|
|
||||||
specify how ``make_aware()`` should interpret such a nonexistent time.
|
|
||||||
If ``is_dst=True`` then the above time would be interpreted as 2:30 DST
|
|
||||||
time (equivalent to 1:30 local time). Conversely, if ``is_dst=False``
|
|
||||||
the time would be interpreted as 2:30 standard time (equivalent to 3:30
|
|
||||||
local time).
|
|
||||||
|
|
||||||
The ``is_dst`` parameter has no effect when using non-``pytz`` timezone
|
|
||||||
implementations.
|
|
||||||
|
|
||||||
The ``is_dst`` parameter is deprecated and will be removed in Django
|
|
||||||
5.0.
|
|
||||||
|
|
||||||
.. function:: make_naive(value, timezone=None)
|
.. function:: make_naive(value, timezone=None)
|
||||||
|
|
||||||
Returns a naive :class:`~datetime.datetime` that represents in
|
Returns a naive :class:`~datetime.datetime` that represents in
|
||||||
|
@ -280,6 +280,20 @@ to remove usage of these features.
|
|||||||
|
|
||||||
* Support for ``pytz`` timezones is removed.
|
* Support for ``pytz`` timezones is removed.
|
||||||
|
|
||||||
|
* The ``is_dst`` argument is removed from:
|
||||||
|
|
||||||
|
* ``QuerySet.datetimes()``
|
||||||
|
* ``django.utils.timezone.make_aware()``
|
||||||
|
* ``django.db.models.functions.Trunc()``
|
||||||
|
* ``django.db.models.functions.TruncSecond()``
|
||||||
|
* ``django.db.models.functions.TruncMinute()``
|
||||||
|
* ``django.db.models.functions.TruncHour()``
|
||||||
|
* ``django.db.models.functions.TruncDay()``
|
||||||
|
* ``django.db.models.functions.TruncWeek()``
|
||||||
|
* ``django.db.models.functions.TruncMonth()``
|
||||||
|
* ``django.db.models.functions.TruncQuarter()``
|
||||||
|
* ``django.db.models.functions.TruncYear()``
|
||||||
|
|
||||||
See :ref:`deprecated-features-4.1` for details on these changes, including how
|
See :ref:`deprecated-features-4.1` for details on these changes, including how
|
||||||
to remove usage of these features.
|
to remove usage of these features.
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ except ImportError:
|
|||||||
|
|
||||||
from django.test import SimpleTestCase, override_settings
|
from django.test import SimpleTestCase, override_settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.deprecation import RemovedInDjango50Warning
|
|
||||||
|
|
||||||
PARIS_ZI = zoneinfo.ZoneInfo("Europe/Paris")
|
PARIS_ZI = zoneinfo.ZoneInfo("Europe/Paris")
|
||||||
EAT = timezone.get_fixed_timezone(180) # Africa/Nairobi
|
EAT = timezone.get_fixed_timezone(180) # Africa/Nairobi
|
||||||
@ -226,17 +225,6 @@ class TimezoneTests(SimpleTestCase):
|
|||||||
self.assertEqual(std.utcoffset(), datetime.timedelta(hours=1))
|
self.assertEqual(std.utcoffset(), datetime.timedelta(hours=1))
|
||||||
self.assertEqual(dst.utcoffset(), datetime.timedelta(hours=2))
|
self.assertEqual(dst.utcoffset(), datetime.timedelta(hours=2))
|
||||||
|
|
||||||
def test_make_aware_is_dst_deprecation_warning(self):
|
|
||||||
msg = (
|
|
||||||
"The is_dst argument to make_aware(), used by the Trunc() "
|
|
||||||
"database functions and QuerySet.datetimes(), is deprecated as it "
|
|
||||||
"has no effect with zoneinfo time zones."
|
|
||||||
)
|
|
||||||
with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
|
|
||||||
timezone.make_aware(
|
|
||||||
datetime.datetime(2011, 9, 1, 13, 20, 30), EAT, is_dst=True
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_get_timezone_name(self):
|
def test_get_timezone_name(self):
|
||||||
"""
|
"""
|
||||||
The _get_timezone_name() helper must return the offset for fixed offset
|
The _get_timezone_name() helper must return the offset for fixed offset
|
||||||
|
Loading…
x
Reference in New Issue
Block a user