From efb7f9ced2dcf71294353596a265e3fd67faffeb Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 18 Feb 2025 08:35:36 +0100 Subject: [PATCH] Refs #36005 -- Used datetime.UTC alias instead of datetime.timezone.utc. datetime.UTC was added in Python 3.11. --- .../contrib/humanize/templatetags/humanize.py | 4 +- django/contrib/sessions/backends/file.py | 2 +- django/contrib/sitemaps/views.py | 2 +- django/core/cache/backends/db.py | 4 +- django/core/files/storage/filesystem.py | 4 +- django/db/backends/base/base.py | 2 +- django/db/migrations/serializer.py | 4 +- django/db/models/fields/__init__.py | 2 +- django/http/response.py | 4 +- django/templatetags/tz.py | 6 +- django/utils/dateparse.py | 2 +- django/utils/feedgenerator.py | 2 +- django/utils/http.py | 6 +- django/utils/timezone.py | 4 +- django/utils/version.py | 2 +- django/views/decorators/http.py | 2 +- docs/intro/tutorial02.txt | 2 +- docs/ref/models/database-functions.txt | 36 +-- docs/ref/signals.txt | 2 +- docs/topics/i18n/timezones.txt | 2 +- tests/aggregation/tests.py | 6 +- tests/auth_tests/test_remote_user.py | 6 +- tests/datatypes/tests.py | 2 +- .../datetime/test_extract_trunc.py | 237 +++++++++--------- tests/file_storage/tests.py | 43 ++-- tests/foreign_object/tests.py | 2 +- .../field_tests/test_datetimefield.py | 6 +- tests/generic_views/test_dates.py | 48 +--- tests/humanize_tests/tests.py | 4 +- tests/migrations/test_writer.py | 11 +- tests/postgres_tests/test_ranges.py | 6 +- tests/responses/test_cookie.py | 12 +- tests/schema/tests.py | 4 +- tests/staticfiles_tests/storage.py | 4 +- tests/staticfiles_tests/test_management.py | 2 +- tests/timezones/tests.py | 6 +- tests/utils_tests/test_dateformat.py | 6 +- tests/utils_tests/test_feedgenerator.py | 2 +- tests/utils_tests/test_http.py | 38 +-- tests/utils_tests/test_timesince.py | 2 +- tests/utils_tests/test_timezone.py | 2 +- 41 files changed, 271 insertions(+), 272 deletions(-) diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py index 2e3f133033..f471f59389 100644 --- a/django/contrib/humanize/templatetags/humanize.py +++ b/django/contrib/humanize/templatetags/humanize.py @@ -1,5 +1,5 @@ import re -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from decimal import Decimal from django import template @@ -297,7 +297,7 @@ class NaturalTimeFormatter: if not isinstance(value, date): # datetime is a subclass of date return value - now = datetime.now(timezone.utc if is_aware(value) else None) + now = datetime.now(UTC if is_aware(value) else None) if value < now: delta = now - value if delta.days != 0: diff --git a/django/contrib/sessions/backends/file.py b/django/contrib/sessions/backends/file.py index e15b3f0141..9710cd2769 100644 --- a/django/contrib/sessions/backends/file.py +++ b/django/contrib/sessions/backends/file.py @@ -64,7 +64,7 @@ class SessionStore(SessionBase): Return the modification time of the file storing the session's content. """ modification = os.stat(self._key_to_file()).st_mtime - tz = datetime.timezone.utc if settings.USE_TZ else None + tz = datetime.UTC if settings.USE_TZ else None return datetime.datetime.fromtimestamp(modification, tz=tz) def _expiry_date(self, session_data): diff --git a/django/contrib/sitemaps/views.py b/django/contrib/sitemaps/views.py index 166563b200..bbdcf4656e 100644 --- a/django/contrib/sitemaps/views.py +++ b/django/contrib/sitemaps/views.py @@ -35,7 +35,7 @@ def _get_latest_lastmod(current_lastmod, new_lastmod): if not isinstance(new_lastmod, datetime.datetime): new_lastmod = datetime.datetime.combine(new_lastmod, datetime.time.min) if timezone.is_naive(new_lastmod): - new_lastmod = timezone.make_aware(new_lastmod, datetime.timezone.utc) + new_lastmod = timezone.make_aware(new_lastmod, datetime.UTC) return new_lastmod if current_lastmod is None else max(current_lastmod, new_lastmod) diff --git a/django/core/cache/backends/db.py b/django/core/cache/backends/db.py index f41105177f..d231d66b2f 100644 --- a/django/core/cache/backends/db.py +++ b/django/core/cache/backends/db.py @@ -1,7 +1,7 @@ "Database cache backend." import base64 import pickle -from datetime import datetime, timezone +from datetime import UTC, datetime from django.conf import settings from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache @@ -124,7 +124,7 @@ class DatabaseCache(BaseDatabaseCache): if timeout is None: exp = datetime.max else: - tz = timezone.utc if settings.USE_TZ else None + tz = UTC if settings.USE_TZ else None exp = datetime.fromtimestamp(timeout, tz=tz) exp = exp.replace(microsecond=0) if num > self._max_entries: diff --git a/django/core/files/storage/filesystem.py b/django/core/files/storage/filesystem.py index 54c31e536a..428ae61b40 100644 --- a/django/core/files/storage/filesystem.py +++ b/django/core/files/storage/filesystem.py @@ -1,5 +1,5 @@ import os -from datetime import datetime, timezone +from datetime import UTC, datetime from urllib.parse import urljoin from django.conf import settings @@ -215,7 +215,7 @@ class FileSystemStorage(Storage, StorageSettingsMixin): If timezone support is enabled, make an aware datetime object in UTC; otherwise make a naive one in the local timezone. """ - tz = timezone.utc if settings.USE_TZ else None + tz = UTC if settings.USE_TZ else None return datetime.fromtimestamp(ts, tz=tz) def get_accessed_time(self, name): diff --git a/django/db/backends/base/base.py b/django/db/backends/base/base.py index e6e0325d07..a1e7cf8f83 100644 --- a/django/db/backends/base/base.py +++ b/django/db/backends/base/base.py @@ -150,7 +150,7 @@ class BaseDatabaseWrapper: if not settings.USE_TZ: return None elif self.settings_dict["TIME_ZONE"] is None: - return datetime.timezone.utc + return datetime.UTC else: return zoneinfo.ZoneInfo(self.settings_dict["TIME_ZONE"]) diff --git a/django/db/migrations/serializer.py b/django/db/migrations/serializer.py index eabdb24f20..300bde3780 100644 --- a/django/db/migrations/serializer.py +++ b/django/db/migrations/serializer.py @@ -81,8 +81,8 @@ class DatetimeDatetimeSerializer(BaseSerializer): """For datetime.datetime.""" def serialize(self): - if self.value.tzinfo is not None and self.value.tzinfo != datetime.timezone.utc: - self.value = self.value.astimezone(datetime.timezone.utc) + if self.value.tzinfo is not None and self.value.tzinfo != datetime.UTC: + self.value = self.value.astimezone(datetime.UTC) imports = ["import datetime"] return repr(self.value), set(imports) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 66d79626fd..14557527db 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -1339,7 +1339,7 @@ class CommaSeparatedIntegerField(CharField): def _to_naive(value): if timezone.is_aware(value): - value = timezone.make_naive(value, datetime.timezone.utc) + value = timezone.make_naive(value, datetime.UTC) return value diff --git a/django/http/response.py b/django/http/response.py index 4a0ea67013..6d09bc87e2 100644 --- a/django/http/response.py +++ b/django/http/response.py @@ -240,8 +240,8 @@ class HttpResponseBase: if expires is not None: if isinstance(expires, datetime.datetime): if timezone.is_naive(expires): - expires = timezone.make_aware(expires, datetime.timezone.utc) - delta = expires - datetime.datetime.now(tz=datetime.timezone.utc) + expires = timezone.make_aware(expires, datetime.UTC) + delta = expires - datetime.datetime.now(tz=datetime.UTC) # Add one second so the date matches exactly (a fraction of # time gets lost between converting to a timedelta and # then the date string). diff --git a/django/templatetags/tz.py b/django/templatetags/tz.py index f2cee2d3fe..5efd3c7fcf 100644 --- a/django/templatetags/tz.py +++ b/django/templatetags/tz.py @@ -1,7 +1,5 @@ import zoneinfo -from datetime import datetime -from datetime import timezone as datetime_timezone -from datetime import tzinfo +from datetime import datetime, tzinfo from django.template import Library, Node, TemplateSyntaxError from django.utils import timezone @@ -33,7 +31,7 @@ def utc(value): """ Convert a datetime to UTC. """ - return do_timezone(value, datetime_timezone.utc) + return do_timezone(value, datetime.UTC) @register.filter("timezone") diff --git a/django/utils/dateparse.py b/django/utils/dateparse.py index 5cedd1affa..42c2684d7c 100644 --- a/django/utils/dateparse.py +++ b/django/utils/dateparse.py @@ -118,7 +118,7 @@ def parse_datetime(value): kw["microsecond"] = kw["microsecond"] and kw["microsecond"].ljust(6, "0") tzinfo = kw.pop("tzinfo") if tzinfo == "Z": - tzinfo = datetime.timezone.utc + tzinfo = datetime.UTC elif tzinfo is not None: offset_mins = int(tzinfo[-2:]) if len(tzinfo) > 3 else 0 offset = 60 * int(tzinfo[1:3]) + offset_mins diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py index fae3271430..e52720a61e 100644 --- a/django/utils/feedgenerator.py +++ b/django/utils/feedgenerator.py @@ -277,7 +277,7 @@ class SyndicationFeed: if latest_date is None or item_date > latest_date: latest_date = item_date - return latest_date or datetime.datetime.now(tz=datetime.timezone.utc) + return latest_date or datetime.datetime.now(tz=datetime.UTC) class Enclosure: diff --git a/django/utils/http.py b/django/utils/http.py index 2098cbc36d..9ca32eab08 100644 --- a/django/utils/http.py +++ b/django/utils/http.py @@ -2,7 +2,7 @@ import base64 import re import unicodedata from binascii import Error as BinasciiError -from datetime import datetime, timezone +from datetime import UTC, datetime from email.utils import formatdate from urllib.parse import quote, unquote from urllib.parse import urlencode as original_urlencode @@ -115,7 +115,7 @@ def parse_http_date(date): try: year = int(m["year"]) if year < 100: - current_year = datetime.now(tz=timezone.utc).year + current_year = datetime.now(tz=UTC).year current_century = current_year - (current_year % 100) if year - (current_year % 100) > 50: # year that appears to be more than 50 years in the future are @@ -128,7 +128,7 @@ def parse_http_date(date): hour = int(m["hour"]) min = int(m["min"]) sec = int(m["sec"]) - result = datetime(year, month, day, hour, min, sec, tzinfo=timezone.utc) + result = datetime(year, month, day, hour, min, sec, tzinfo=UTC) return int(result.timestamp()) except Exception as exc: raise ValueError("%r is not a valid date" % date) from exc diff --git a/django/utils/timezone.py b/django/utils/timezone.py index 102562b254..6d6cbf6d8f 100644 --- a/django/utils/timezone.py +++ b/django/utils/timezone.py @@ -5,7 +5,7 @@ Timezone-related classes and functions. import functools import zoneinfo from contextlib import ContextDecorator -from datetime import datetime, timedelta, timezone, tzinfo +from datetime import UTC, datetime, timedelta, timezone, tzinfo from asgiref.local import Local @@ -201,7 +201,7 @@ def now(): """ Return an aware or naive datetime.datetime, depending on settings.USE_TZ. """ - return datetime.now(tz=timezone.utc if settings.USE_TZ else None) + return datetime.now(tz=UTC if settings.USE_TZ else None) # By design, these four functions don't perform any checks on their arguments. diff --git a/django/utils/version.py b/django/utils/version.py index 4ef8cfbcfe..2bb650ac89 100644 --- a/django/utils/version.py +++ b/django/utils/version.py @@ -96,7 +96,7 @@ def get_git_changeset(): text=True, ) timestamp = git_log.stdout - tz = datetime.timezone.utc + tz = datetime.UTC try: timestamp = datetime.datetime.fromtimestamp(int(timestamp), tz=tz) except ValueError: diff --git a/django/views/decorators/http.py b/django/views/decorators/http.py index a4c1ebc31e..efdaa21e30 100644 --- a/django/views/decorators/http.py +++ b/django/views/decorators/http.py @@ -110,7 +110,7 @@ def condition(etag_func=None, last_modified_func=None): if last_modified_func: if dt := last_modified_func(request, *args, **kwargs): if not timezone.is_aware(dt): - dt = timezone.make_aware(dt, datetime.timezone.utc) + dt = timezone.make_aware(dt, datetime.UTC) res_last_modified = int(dt.timestamp()) # The value from etag_func() could be quoted or unquoted. res_etag = etag_func(request, *args, **kwargs) if etag_func else None diff --git a/docs/intro/tutorial02.txt b/docs/intro/tutorial02.txt index 6a87d2d01c..f78a83d1bd 100644 --- a/docs/intro/tutorial02.txt +++ b/docs/intro/tutorial02.txt @@ -376,7 +376,7 @@ Once you're in the shell, explore the :doc:`database API `: >>> q.question_text "What's new?" >>> q.pub_date - datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc) + datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.UTC) # Change values by changing the attributes, then calling save(). >>> q.question_text = "What's up?" diff --git a/docs/ref/models/database-functions.txt b/docs/ref/models/database-functions.txt index 089e02d15e..aa18ed4045 100644 --- a/docs/ref/models/database-functions.txt +++ b/docs/ref/models/database-functions.txt @@ -355,7 +355,7 @@ that deal with date-parts can be used with ``DateField``: .. code-block:: pycon - >>> from datetime import datetime, timezone + >>> from datetime import UTC, datetime >>> from django.db.models.functions import ( ... ExtractDay, ... ExtractMonth, @@ -366,8 +366,8 @@ that deal with date-parts can be used with ``DateField``: ... ExtractIsoYear, ... ExtractYear, ... ) - >>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc) - >>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc) + >>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=UTC) + >>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=UTC) >>> Experiment.objects.create( ... start_datetime=start_2015, ... start_date=start_2015.date(), @@ -424,7 +424,7 @@ Each class is also a ``Transform`` registered on ``DateTimeField`` as .. code-block:: pycon - >>> from datetime import datetime, timezone + >>> from datetime import UTC, datetime >>> from django.db.models.functions import ( ... ExtractDay, ... ExtractHour, @@ -438,8 +438,8 @@ Each class is also a ``Transform`` registered on ``DateTimeField`` as ... ExtractIsoYear, ... ExtractYear, ... ) - >>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc) - >>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc) + >>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=UTC) + >>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=UTC) >>> Experiment.objects.create( ... start_datetime=start_2015, ... start_date=start_2015.date(), @@ -664,12 +664,12 @@ that deal with date-parts can be used with ``DateField``: .. code-block:: pycon - >>> from datetime import datetime, timezone + >>> from datetime import UTC, datetime >>> from django.db.models import Count >>> from django.db.models.functions import TruncMonth, TruncYear - >>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc) - >>> start2 = datetime(2015, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc) - >>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc) + >>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=UTC) + >>> start2 = datetime(2015, 6, 15, 14, 40, 2, 123, tzinfo=UTC) + >>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=UTC) >>> Experiment.objects.create(start_datetime=start1, start_date=start1.date()) >>> Experiment.objects.create(start_datetime=start2, start_date=start2.date()) >>> Experiment.objects.create(start_datetime=start3, start_date=start3.date()) @@ -744,7 +744,7 @@ Usage example: .. code-block:: pycon - >>> from datetime import date, datetime, timezone + >>> from datetime import UTC, date, datetime >>> from django.db.models import Count >>> from django.db.models.functions import ( ... TruncDate, @@ -754,7 +754,7 @@ Usage example: ... TruncSecond, ... ) >>> import zoneinfo - >>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc) + >>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=UTC) >>> Experiment.objects.create(start_datetime=start1, start_date=start1.date()) >>> melb = zoneinfo.ZoneInfo("Australia/Melbourne") >>> Experiment.objects.annotate( @@ -767,8 +767,8 @@ Usage example: {'date': datetime.date(2014, 6, 15), 'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=zoneinfo.ZoneInfo('Australia/Melbourne')), 'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=zoneinfo.ZoneInfo('Australia/Melbourne')), - 'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=timezone.utc), - 'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=timezone.utc) + 'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=UTC), + 'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=UTC) } ``TimeField`` truncation @@ -799,12 +799,12 @@ that deal with time-parts can be used with ``TimeField``: .. code-block:: pycon - >>> from datetime import datetime, timezone + >>> from datetime import UTC, datetime >>> from django.db.models import Count, TimeField >>> from django.db.models.functions import TruncHour - >>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc) - >>> start2 = datetime(2014, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc) - >>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc) + >>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=UTC) + >>> start2 = datetime(2014, 6, 15, 14, 40, 2, 123, tzinfo=UTC) + >>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=UTC) >>> Experiment.objects.create(start_datetime=start1, start_time=start1.time()) >>> Experiment.objects.create(start_datetime=start2, start_time=start2.time()) >>> Experiment.objects.create(start_datetime=start3, start_time=start3.time()) diff --git a/docs/ref/signals.txt b/docs/ref/signals.txt index 953b18c1f6..6e040cbfda 100644 --- a/docs/ref/signals.txt +++ b/docs/ref/signals.txt @@ -88,7 +88,7 @@ Argument Value arguments passed to ``__init__()``) ``kwargs`` ``{'question_text': "What's new?",`` - ``'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)}`` + ``'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.UTC)}`` ========== =============================================================== ``post_init`` diff --git a/docs/topics/i18n/timezones.txt b/docs/topics/i18n/timezones.txt index 0d866dac6c..905cb5c615 100644 --- a/docs/topics/i18n/timezones.txt +++ b/docs/topics/i18n/timezones.txt @@ -137,7 +137,7 @@ used. However, :ref:`as explained above `, this isn't entirely reliable, and you should always work with aware datetimes in UTC in your own code. For instance, use :meth:`~datetime.datetime.fromtimestamp` - and set the ``tz`` parameter to :attr:`~datetime.timezone.utc`. + and set the ``tz`` parameter to :obj:`datetime.UTC`. Selecting the current time zone ------------------------------- diff --git a/tests/aggregation/tests.py b/tests/aggregation/tests.py index 861b2c5dfc..86151000b5 100644 --- a/tests/aggregation/tests.py +++ b/tests/aggregation/tests.py @@ -1932,7 +1932,7 @@ class AggregateTestCase(TestCase): ) def test_aggregation_default_using_time_from_database(self): - now = timezone.now().astimezone(datetime.timezone.utc) + now = timezone.now().astimezone(datetime.UTC) expr = Min( "store__friday_night_closing", filter=~Q(store__name="Amazon.com"), @@ -1984,7 +1984,7 @@ class AggregateTestCase(TestCase): ) def test_aggregation_default_using_date_from_database(self): - now = timezone.now().astimezone(datetime.timezone.utc) + now = timezone.now().astimezone(datetime.UTC) expr = Min("book__pubdate", default=TruncDate(NowUTC())) queryset = Publisher.objects.annotate(earliest_pubdate=expr).order_by("name") self.assertSequenceEqual( @@ -2045,7 +2045,7 @@ class AggregateTestCase(TestCase): ) def test_aggregation_default_using_datetime_from_database(self): - now = timezone.now().astimezone(datetime.timezone.utc) + now = timezone.now().astimezone(datetime.UTC) expr = Min( "store__original_opening", filter=~Q(store__name="Amazon.com"), diff --git a/tests/auth_tests/test_remote_user.py b/tests/auth_tests/test_remote_user.py index 85de931c1a..67748d6c23 100644 --- a/tests/auth_tests/test_remote_user.py +++ b/tests/auth_tests/test_remote_user.py @@ -1,4 +1,4 @@ -from datetime import datetime, timezone +from datetime import UTC, datetime from django.conf import settings from django.contrib.auth import aauthenticate, authenticate @@ -197,7 +197,7 @@ class RemoteUserTest(TestCase): # Set last_login to something so we can determine if it changes. default_login = datetime(2000, 1, 1) if settings.USE_TZ: - default_login = default_login.replace(tzinfo=timezone.utc) + default_login = default_login.replace(tzinfo=UTC) user.last_login = default_login user.save() @@ -216,7 +216,7 @@ class RemoteUserTest(TestCase): # Set last_login to something so we can determine if it changes. default_login = datetime(2000, 1, 1) if settings.USE_TZ: - default_login = default_login.replace(tzinfo=timezone.utc) + default_login = default_login.replace(tzinfo=UTC) user.last_login = default_login await user.asave() diff --git a/tests/datatypes/tests.py b/tests/datatypes/tests.py index 97f3ec0852..fa08ed878d 100644 --- a/tests/datatypes/tests.py +++ b/tests/datatypes/tests.py @@ -93,7 +93,7 @@ class DataTypesTestCase(TestCase): def test_error_on_timezone(self): """Regression test for #8354: the MySQL and Oracle backends should raise an error if given a timezone-aware datetime object.""" - dt = datetime.datetime(2008, 8, 31, 16, 20, tzinfo=datetime.timezone.utc) + dt = datetime.datetime(2008, 8, 31, 16, 20, tzinfo=datetime.UTC) d = Donut(name="Bear claw", consumed_at=dt) # MySQL backend does not support timezone-aware datetimes. with self.assertRaises(ValueError): diff --git a/tests/db_functions/datetime/test_extract_trunc.py b/tests/db_functions/datetime/test_extract_trunc.py index 3f13ca7989..b4dd160f32 100644 --- a/tests/db_functions/datetime/test_extract_trunc.py +++ b/tests/db_functions/datetime/test_extract_trunc.py @@ -1,6 +1,5 @@ +import datetime import zoneinfo -from datetime import datetime, timedelta -from datetime import timezone as datetime_timezone from django.conf import settings from django.db import DataError, OperationalError @@ -63,22 +62,22 @@ def truncate_to(value, kind, tzinfo=None): if kind == "hour": return value.replace(minute=0, second=0, microsecond=0) if kind == "day": - if isinstance(value, datetime): + if isinstance(value, datetime.datetime): return value.replace(hour=0, minute=0, second=0, microsecond=0) return value if kind == "week": - if isinstance(value, datetime): - return (value - timedelta(days=value.weekday())).replace( + if isinstance(value, datetime.datetime): + return (value - datetime.timedelta(days=value.weekday())).replace( hour=0, minute=0, second=0, microsecond=0 ) - return value - timedelta(days=value.weekday()) + return value - datetime.timedelta(days=value.weekday()) if kind == "month": - if isinstance(value, datetime): + if isinstance(value, datetime.datetime): return value.replace(day=1, hour=0, minute=0, second=0, microsecond=0) return value.replace(day=1) if kind == "quarter": month_in_quarter = value.month - (value.month - 1) % 3 - if isinstance(value, datetime): + if isinstance(value, datetime.datetime): return value.replace( month=month_in_quarter, day=1, @@ -89,7 +88,7 @@ def truncate_to(value, kind, tzinfo=None): ) return value.replace(month=month_in_quarter, day=1) # otherwise, truncate to year - if isinstance(value, datetime): + if isinstance(value, datetime.datetime): return value.replace( month=1, day=1, hour=0, minute=0, second=0, microsecond=0 ) @@ -125,8 +124,8 @@ class DateFunctionTests(TestCase): Extract year uses a BETWEEN filter to compare the year to allow indexes to be used. """ - start_datetime = datetime(2015, 6, 15, 14, 10) - end_datetime = datetime(2016, 6, 15, 14, 10) + start_datetime = datetime.datetime(2015, 6, 15, 14, 10) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -164,8 +163,8 @@ class DateFunctionTests(TestCase): self.assertEqual(query_string.count("extract"), 3) def test_extract_year_greaterthan_lookup(self): - start_datetime = datetime(2015, 6, 15, 14, 10) - end_datetime = datetime(2016, 6, 15, 14, 10) + start_datetime = datetime.datetime(2015, 6, 15, 14, 10) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -189,8 +188,8 @@ class DateFunctionTests(TestCase): self.assertGreaterEqual(str(qs.query).lower().count("extract"), 2) def test_extract_year_lessthan_lookup(self): - start_datetime = datetime(2015, 6, 15, 14, 10) - end_datetime = datetime(2016, 6, 15, 14, 10) + start_datetime = datetime.datetime(2015, 6, 15, 14, 10) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -214,8 +213,8 @@ class DateFunctionTests(TestCase): self.assertGreaterEqual(str(qs.query).lower().count("extract"), 2) def test_extract_lookup_name_sql_injection(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -230,8 +229,8 @@ class DateFunctionTests(TestCase): ).exists() def test_extract_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -387,8 +386,8 @@ class DateFunctionTests(TestCase): @skipUnlessDBFeature("has_native_duration_field") def test_extract_duration(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -435,8 +434,8 @@ class DateFunctionTests(TestCase): DTModel.objects.annotate(extracted=Extract("duration", lookup)) def test_extract_year_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -464,8 +463,8 @@ class DateFunctionTests(TestCase): ) def test_extract_iso_year_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -494,12 +493,12 @@ class DateFunctionTests(TestCase): ) def test_extract_iso_year_func_boundaries(self): - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: end_datetime = timezone.make_aware(end_datetime) - week_52_day_2014 = datetime(2014, 12, 27, 13, 0) # Sunday - week_1_day_2014_2015 = datetime(2014, 12, 31, 13, 0) # Wednesday - week_53_day_2015 = datetime(2015, 12, 31, 13, 0) # Thursday + week_52_day_2014 = datetime.datetime(2014, 12, 27, 13, 0) # Sunday + week_1_day_2014_2015 = datetime.datetime(2014, 12, 31, 13, 0) # Wednesday + week_53_day_2015 = datetime.datetime(2015, 12, 31, 13, 0) # Thursday if settings.USE_TZ: week_1_day_2014_2015 = timezone.make_aware(week_1_day_2014_2015) week_52_day_2014 = timezone.make_aware(week_52_day_2014) @@ -539,8 +538,8 @@ class DateFunctionTests(TestCase): self.assertSequenceEqual(qs, [obj_1_iso_2014]) def test_extract_month_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -574,8 +573,8 @@ class DateFunctionTests(TestCase): ) def test_extract_day_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -603,8 +602,8 @@ class DateFunctionTests(TestCase): ) def test_extract_week_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -633,8 +632,8 @@ class DateFunctionTests(TestCase): ) def test_extract_quarter_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 8, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 8, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -662,12 +661,12 @@ class DateFunctionTests(TestCase): ) def test_extract_quarter_func_boundaries(self): - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: end_datetime = timezone.make_aware(end_datetime) - last_quarter_2014 = datetime(2014, 12, 31, 13, 0) - first_quarter_2015 = datetime(2015, 1, 1, 13, 0) + last_quarter_2014 = datetime.datetime(2014, 12, 31, 13, 0) + first_quarter_2015 = datetime.datetime(2015, 1, 1, 13, 0) if settings.USE_TZ: last_quarter_2014 = timezone.make_aware(last_quarter_2014) first_quarter_2015 = timezone.make_aware(first_quarter_2015) @@ -691,13 +690,13 @@ class DateFunctionTests(TestCase): ) def test_extract_week_func_boundaries(self): - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: end_datetime = timezone.make_aware(end_datetime) - week_52_day_2014 = datetime(2014, 12, 27, 13, 0) # Sunday - week_1_day_2014_2015 = datetime(2014, 12, 31, 13, 0) # Wednesday - week_53_day_2015 = datetime(2015, 12, 31, 13, 0) # Thursday + week_52_day_2014 = datetime.datetime(2014, 12, 27, 13, 0) # Sunday + week_1_day_2014_2015 = datetime.datetime(2014, 12, 31, 13, 0) # Wednesday + week_53_day_2015 = datetime.datetime(2015, 12, 31, 13, 0) # Thursday if settings.USE_TZ: week_1_day_2014_2015 = timezone.make_aware(week_1_day_2014_2015) week_52_day_2014 = timezone.make_aware(week_52_day_2014) @@ -725,8 +724,8 @@ class DateFunctionTests(TestCase): ) def test_extract_weekday_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -760,8 +759,8 @@ class DateFunctionTests(TestCase): ) def test_extract_iso_weekday_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -795,8 +794,8 @@ class DateFunctionTests(TestCase): ) def test_extract_hour_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -824,8 +823,8 @@ class DateFunctionTests(TestCase): ) def test_extract_minute_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -859,8 +858,8 @@ class DateFunctionTests(TestCase): ) def test_extract_second_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -894,8 +893,8 @@ class DateFunctionTests(TestCase): ) def test_extract_second_func_no_fractional(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 30, 50, 783) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 30, 50, 783) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -910,8 +909,8 @@ class DateFunctionTests(TestCase): ) def test_trunc_lookup_name_sql_injection(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -931,8 +930,8 @@ class DateFunctionTests(TestCase): self.assertIs(exists, False) def test_trunc_func(self): - start_datetime = datetime(999, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(999, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1045,14 +1044,14 @@ class DateFunctionTests(TestCase): def test_trunc_week(self): self._test_trunc_week( - start_datetime=datetime(2015, 6, 15, 14, 30, 50, 321), - end_datetime=datetime(2016, 6, 15, 14, 10, 50, 123), + start_datetime=datetime.datetime(2015, 6, 15, 14, 30, 50, 321), + end_datetime=datetime.datetime(2016, 6, 15, 14, 10, 50, 123), ) def test_trunc_week_before_1000(self): self._test_trunc_week( - start_datetime=datetime(999, 6, 15, 14, 30, 50, 321), - end_datetime=datetime(2016, 6, 15, 14, 10, 50, 123), + start_datetime=datetime.datetime(999, 6, 15, 14, 30, 50, 321), + end_datetime=datetime.datetime(2016, 6, 15, 14, 10, 50, 123), ) def test_trunc_invalid_arguments(self): @@ -1108,8 +1107,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_year_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "year") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "year" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1155,13 +1156,15 @@ class DateFunctionTests(TestCase): ) def test_trunc_quarter_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 10, 15, 14, 10, 50, 123), "quarter") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 10, 15, 14, 10, 50, 123), "quarter" + ) last_quarter_2015 = truncate_to( - datetime(2015, 12, 31, 14, 10, 50, 123), "quarter" + datetime.datetime(2015, 12, 31, 14, 10, 50, 123), "quarter" ) first_quarter_2016 = truncate_to( - datetime(2016, 1, 1, 14, 10, 50, 123), "quarter" + datetime.datetime(2016, 1, 1, 14, 10, 50, 123), "quarter" ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) @@ -1212,8 +1215,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_month_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "month") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "month" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1259,8 +1264,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_week_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "week") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "week" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1296,8 +1303,8 @@ class DateFunctionTests(TestCase): ) def test_trunc_date_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1343,8 +1350,8 @@ class DateFunctionTests(TestCase): ) def test_trunc_time_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1390,8 +1397,8 @@ class DateFunctionTests(TestCase): ) def test_trunc_time_comparison(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 26) # 0 microseconds. - end_datetime = datetime(2015, 6, 15, 14, 30, 26, 321) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 26) # 0 microseconds. + end_datetime = datetime.datetime(2015, 6, 15, 14, 30, 26, 321) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1417,8 +1424,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_day_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "day") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "day" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1453,8 +1462,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_hour_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "hour") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "hour" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1500,8 +1511,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_minute_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "minute") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "minute" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1549,8 +1562,10 @@ class DateFunctionTests(TestCase): ) def test_trunc_second_func(self): - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), "second") + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to( + datetime.datetime(2016, 6, 15, 14, 10, 50, 123), "second" + ) if settings.USE_TZ: start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) @@ -1600,9 +1615,9 @@ class DateFunctionTests(TestCase): def test_trunc_subquery_with_parameters(self): author_1 = Author.objects.create(name="J. R. R. Tolkien") author_2 = Author.objects.create(name="G. R. R. Martin") - fan_since_1 = datetime(2016, 2, 3, 15, 0, 0) - fan_since_2 = datetime(2015, 2, 3, 15, 0, 0) - fan_since_3 = datetime(2017, 2, 3, 15, 0, 0) + fan_since_1 = datetime.datetime(2016, 2, 3, 15, 0, 0) + fan_since_2 = datetime.datetime(2015, 2, 3, 15, 0, 0) + fan_since_3 = datetime.datetime(2017, 2, 3, 15, 0, 0) if settings.USE_TZ: fan_since_1 = timezone.make_aware(fan_since_1) fan_since_2 = timezone.make_aware(fan_since_2) @@ -1622,25 +1637,25 @@ class DateFunctionTests(TestCase): outer = Author.objects.annotate( newest_fan_year=TruncYear(Subquery(inner, output_field=DateTimeField())) ) - tz = datetime_timezone.utc if settings.USE_TZ else None + tz = datetime.UTC if settings.USE_TZ else None self.assertSequenceEqual( outer.order_by("name").values("name", "newest_fan_year"), [ { "name": "G. R. R. Martin", - "newest_fan_year": datetime(2017, 1, 1, 0, 0, tzinfo=tz), + "newest_fan_year": datetime.datetime(2017, 1, 1, 0, 0, tzinfo=tz), }, { "name": "J. R. R. Tolkien", - "newest_fan_year": datetime(2016, 1, 1, 0, 0, tzinfo=tz), + "newest_fan_year": datetime.datetime(2016, 1, 1, 0, 0, tzinfo=tz), }, ], ) def test_extract_outerref(self): - datetime_1 = datetime(2000, 1, 1) - datetime_2 = datetime(2001, 3, 5) - datetime_3 = datetime(2002, 1, 3) + datetime_1 = datetime.datetime(2000, 1, 1) + datetime_2 = datetime.datetime(2001, 3, 5) + datetime_3 = datetime.datetime(2002, 1, 3) if settings.USE_TZ: datetime_1 = timezone.make_aware(datetime_1) datetime_2 = timezone.make_aware(datetime_2) @@ -1669,13 +1684,13 @@ class DateFunctionTests(TestCase): @override_settings(USE_TZ=True, TIME_ZONE="UTC") class DateFunctionWithTimeZoneTests(DateFunctionTests): def test_extract_func_with_timezone(self): - start_datetime = datetime(2015, 6, 15, 23, 30, 1, 321) - end_datetime = datetime(2015, 6, 16, 13, 11, 27, 123) + start_datetime = datetime.datetime(2015, 6, 15, 23, 30, 1, 321) + end_datetime = datetime.datetime(2015, 6, 16, 13, 11, 27, 123) start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) self.create_model(start_datetime, end_datetime) - delta_tzinfo_pos = datetime_timezone(timedelta(hours=5)) - delta_tzinfo_neg = datetime_timezone(timedelta(hours=-5, minutes=17)) + delta_tzinfo_pos = datetime.timezone(datetime.timedelta(hours=5)) + delta_tzinfo_neg = datetime.timezone(datetime.timedelta(hours=-5, minutes=17)) melb = zoneinfo.ZoneInfo("Australia/Melbourne") qs = DTModel.objects.annotate( @@ -1729,8 +1744,8 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): self.assertEqual(melb_model.hour_melb, 9) def test_extract_func_with_timezone_minus_no_offset(self): - start_datetime = datetime(2015, 6, 15, 23, 30, 1, 321) - end_datetime = datetime(2015, 6, 16, 13, 11, 27, 123) + start_datetime = datetime.datetime(2015, 6, 15, 23, 30, 1, 321) + end_datetime = datetime.datetime(2015, 6, 16, 13, 11, 27, 123) start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) self.create_model(start_datetime, end_datetime) @@ -1752,8 +1767,8 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): self.assertEqual(ust_nera_model.hour_tz, 9) def test_extract_func_explicit_timezone_priority(self): - start_datetime = datetime(2015, 6, 15, 23, 30, 1, 321) - end_datetime = datetime(2015, 6, 16, 13, 11, 27, 123) + start_datetime = datetime.datetime(2015, 6, 15, 23, 30, 1, 321) + end_datetime = datetime.datetime(2015, 6, 16, 13, 11, 27, 123) start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) self.create_model(start_datetime, end_datetime) @@ -1762,9 +1777,7 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): model = ( DTModel.objects.annotate( day_melb=Extract("start_datetime", "day"), - day_utc=Extract( - "start_datetime", "day", tzinfo=datetime_timezone.utc - ), + day_utc=Extract("start_datetime", "day", tzinfo=datetime.UTC), ) .order_by("start_datetime") .get() @@ -1785,8 +1798,8 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): ).get() def test_trunc_timezone_applied_before_truncation(self): - start_datetime = datetime(2016, 1, 1, 1, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2016, 1, 1, 1, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) self.create_model(start_datetime, end_datetime) @@ -1826,8 +1839,8 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): If the truncated datetime transitions to a different offset (daylight saving) then the returned value will have that new timezone/offset. """ - start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) - end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) + start_datetime = datetime.datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = datetime.datetime(2016, 6, 15, 14, 10, 50, 123) start_datetime = timezone.make_aware(start_datetime) end_datetime = timezone.make_aware(end_datetime) self.create_model(start_datetime, end_datetime) diff --git a/tests/file_storage/tests.py b/tests/file_storage/tests.py index 70c7a4f15f..ff09f603d8 100644 --- a/tests/file_storage/tests.py +++ b/tests/file_storage/tests.py @@ -1,3 +1,4 @@ +import datetime import os import shutil import sys @@ -5,8 +6,6 @@ import tempfile import threading import time import unittest -from datetime import datetime, timedelta -from datetime import timezone as datetime_timezone from io import StringIO from pathlib import Path from urllib.request import urlopen @@ -114,7 +113,7 @@ class FileStorageTests(SimpleTestCase): # is UTC+1 and has no DST change. We can set the Django TZ to something # else so that UTC, Django's TIME_ZONE, and the system timezone are all # different. - now_in_algiers = timezone.make_aware(datetime.now()) + now_in_algiers = timezone.make_aware(datetime.datetime.now()) with timezone.override(timezone.get_fixed_timezone(-300)): # At this point the system TZ is +1 and the Django TZ @@ -131,15 +130,15 @@ class FileStorageTests(SimpleTestCase): self.assertEqual(now.tzname(), dt.tzname()) # The three timezones are indeed distinct. - naive_now = datetime.now() + naive_now = datetime.datetime.now() algiers_offset = now_in_algiers.tzinfo.utcoffset(naive_now) django_offset = timezone.get_current_timezone().utcoffset(naive_now) - utc_offset = datetime_timezone.utc.utcoffset(naive_now) + utc_offset = datetime.UTC.utcoffset(naive_now) self.assertGreater(algiers_offset, utc_offset) self.assertLess(django_offset, utc_offset) # dt and now should be the same effective time. - self.assertLess(abs(dt - now), timedelta(seconds=2)) + self.assertLess(abs(dt - now), datetime.timedelta(seconds=2)) @override_settings(USE_TZ=False, TIME_ZONE="Africa/Algiers") def _test_file_time_getter_tz_handling_off(self, getter): @@ -147,7 +146,7 @@ class FileStorageTests(SimpleTestCase): # is UTC+1 and has no DST change. We can set the Django TZ to something # else so that UTC, Django's TIME_ZONE, and the system timezone are all # different. - now_in_algiers = timezone.make_aware(datetime.now()) + now_in_algiers = timezone.make_aware(datetime.datetime.now()) with timezone.override(timezone.get_fixed_timezone(-300)): # At this point the system TZ is +1 and the Django TZ @@ -162,20 +161,20 @@ class FileStorageTests(SimpleTestCase): self.assertTrue(timezone.is_naive(dt)) # The three timezones are indeed distinct. - naive_now = datetime.now() + naive_now = datetime.datetime.now() algiers_offset = now_in_algiers.tzinfo.utcoffset(naive_now) django_offset = timezone.get_current_timezone().utcoffset(naive_now) - utc_offset = datetime_timezone.utc.utcoffset(naive_now) + utc_offset = datetime.UTC.utcoffset(naive_now) self.assertGreater(algiers_offset, utc_offset) self.assertLess(django_offset, utc_offset) # dt and naive_now should be the same effective time. - self.assertLess(abs(dt - naive_now), timedelta(seconds=2)) + self.assertLess(abs(dt - naive_now), datetime.timedelta(seconds=2)) # If we convert dt to an aware object using the Algiers # timezone then it should be the same effective time to # now_in_algiers. _dt = timezone.make_aware(dt, now_in_algiers.tzinfo) - self.assertLess(abs(_dt - now_in_algiers), timedelta(seconds=2)) + self.assertLess(abs(_dt - now_in_algiers), datetime.timedelta(seconds=2)) def test_file_get_accessed_time(self): """ @@ -190,11 +189,14 @@ class FileStorageTests(SimpleTestCase): atime = self.storage.get_accessed_time(f_name) self.assertEqual( - atime, datetime.fromtimestamp(os.path.getatime(self.storage.path(f_name))) + atime, + datetime.datetime.fromtimestamp( + os.path.getatime(self.storage.path(f_name)) + ), ) self.assertLess( timezone.now() - self.storage.get_accessed_time(f_name), - timedelta(seconds=2), + datetime.timedelta(seconds=2), ) @requires_tz_support @@ -213,10 +215,14 @@ class FileStorageTests(SimpleTestCase): ctime = self.storage.get_created_time(f_name) self.assertEqual( - ctime, datetime.fromtimestamp(os.path.getctime(self.storage.path(f_name))) + ctime, + datetime.datetime.fromtimestamp( + os.path.getctime(self.storage.path(f_name)) + ), ) self.assertLess( - timezone.now() - self.storage.get_created_time(f_name), timedelta(seconds=2) + timezone.now() - self.storage.get_created_time(f_name), + datetime.timedelta(seconds=2), ) @requires_tz_support @@ -235,11 +241,14 @@ class FileStorageTests(SimpleTestCase): mtime = self.storage.get_modified_time(f_name) self.assertEqual( - mtime, datetime.fromtimestamp(os.path.getmtime(self.storage.path(f_name))) + mtime, + datetime.datetime.fromtimestamp( + os.path.getmtime(self.storage.path(f_name)) + ), ) self.assertLess( timezone.now() - self.storage.get_modified_time(f_name), - timedelta(seconds=2), + datetime.timedelta(seconds=2), ) @requires_tz_support diff --git a/tests/foreign_object/tests.py b/tests/foreign_object/tests.py index a0ea43677e..de80c705ab 100644 --- a/tests/foreign_object/tests.py +++ b/tests/foreign_object/tests.py @@ -119,7 +119,7 @@ class MultiColumnFKTests(TestCase): ) def test_reverse_query_filters_correctly(self): - timemark = datetime.datetime.now(tz=datetime.timezone.utc).replace(tzinfo=None) + timemark = datetime.datetime.now(tz=datetime.UTC).replace(tzinfo=None) timedelta = datetime.timedelta(days=1) # Creating a to valid memberships diff --git a/tests/forms_tests/field_tests/test_datetimefield.py b/tests/forms_tests/field_tests/test_datetimefield.py index af303b0436..19ebf9fc13 100644 --- a/tests/forms_tests/field_tests/test_datetimefield.py +++ b/tests/forms_tests/field_tests/test_datetimefield.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, timezone +from datetime import UTC, date, datetime from django.core.exceptions import ValidationError from django.forms import DateTimeField @@ -40,7 +40,7 @@ class DateTimeFieldTest(SimpleTestCase): ("2014-09-23T22:34:41", datetime(2014, 9, 23, 22, 34, 41)), ("2014-09-23T22:34", datetime(2014, 9, 23, 22, 34)), ("2014-09-23", datetime(2014, 9, 23, 0, 0)), - ("2014-09-23T22:34Z", datetime(2014, 9, 23, 22, 34, tzinfo=timezone.utc)), + ("2014-09-23T22:34Z", datetime(2014, 9, 23, 22, 34, tzinfo=UTC)), ( "2014-09-23T22:34+07:00", datetime(2014, 9, 23, 22, 34, tzinfo=get_fixed_timezone(420)), @@ -57,7 +57,7 @@ class DateTimeFieldTest(SimpleTestCase): " 2014-09-23T22:34:41.614804 ", datetime(2014, 9, 23, 22, 34, 41, 614804), ), - (" 2014-09-23T22:34Z ", datetime(2014, 9, 23, 22, 34, tzinfo=timezone.utc)), + (" 2014-09-23T22:34Z ", datetime(2014, 9, 23, 22, 34, tzinfo=UTC)), ] f = DateTimeField() for value, expected_datetime in tests: diff --git a/tests/generic_views/test_dates.py b/tests/generic_views/test_dates.py index fc680f4209..cfed82a586 100644 --- a/tests/generic_views/test_dates.py +++ b/tests/generic_views/test_dates.py @@ -156,9 +156,7 @@ class ArchiveIndexViewTests(TestDataMixin, TestCase): @override_settings(USE_TZ=True, TIME_ZONE="Africa/Nairobi") def test_aware_datetime_archive_view(self): BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 4, 2, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 4, 2, 12, 0, tzinfo=datetime.UTC) ) res = self.client.get("/dates/booksignings/") self.assertEqual(res.status_code, 200) @@ -345,9 +343,7 @@ class YearArchiveViewTests(TestDataMixin, TestCase): @override_settings(USE_TZ=True, TIME_ZONE="Africa/Nairobi") def test_aware_datetime_year_view(self): BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 4, 2, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 4, 2, 12, 0, tzinfo=datetime.UTC) ) res = self.client.get("/dates/booksignings/2008/") self.assertEqual(res.status_code, 200) @@ -520,19 +516,13 @@ class MonthArchiveViewTests(TestDataMixin, TestCase): @override_settings(USE_TZ=True, TIME_ZONE="Africa/Nairobi") def test_aware_datetime_month_view(self): BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 2, 1, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 2, 1, 12, 0, tzinfo=datetime.UTC) ) BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 4, 2, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 4, 2, 12, 0, tzinfo=datetime.UTC) ) BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 6, 3, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 6, 3, 12, 0, tzinfo=datetime.UTC) ) res = self.client.get("/dates/booksignings/2008/apr/") self.assertEqual(res.status_code, 200) @@ -673,9 +663,7 @@ class WeekArchiveViewTests(TestDataMixin, TestCase): @override_settings(USE_TZ=True, TIME_ZONE="Africa/Nairobi") def test_aware_datetime_week_view(self): BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 4, 2, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 4, 2, 12, 0, tzinfo=datetime.UTC) ) res = self.client.get("/dates/booksignings/2008/week/13/") self.assertEqual(res.status_code, 200) @@ -805,25 +793,19 @@ class DayArchiveViewTests(TestDataMixin, TestCase): @override_settings(USE_TZ=True, TIME_ZONE="Africa/Nairobi") def test_aware_datetime_day_view(self): bs = BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 4, 2, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 4, 2, 12, 0, tzinfo=datetime.UTC) ) res = self.client.get("/dates/booksignings/2008/apr/2/") self.assertEqual(res.status_code, 200) # 2008-04-02T00:00:00+03:00 (beginning of day) > # 2008-04-01T22:00:00+00:00 (book signing event date). - bs.event_date = datetime.datetime( - 2008, 4, 1, 22, 0, tzinfo=datetime.timezone.utc - ) + bs.event_date = datetime.datetime(2008, 4, 1, 22, 0, tzinfo=datetime.UTC) bs.save() res = self.client.get("/dates/booksignings/2008/apr/2/") self.assertEqual(res.status_code, 200) # 2008-04-03T00:00:00+03:00 (end of day) > 2008-04-02T22:00:00+00:00 # (book signing event date). - bs.event_date = datetime.datetime( - 2008, 4, 2, 22, 0, tzinfo=datetime.timezone.utc - ) + bs.event_date = datetime.datetime(2008, 4, 2, 22, 0, tzinfo=datetime.UTC) bs.save() res = self.client.get("/dates/booksignings/2008/apr/2/") self.assertEqual(res.status_code, 404) @@ -914,25 +896,19 @@ class DateDetailViewTests(TestDataMixin, TestCase): @override_settings(USE_TZ=True, TIME_ZONE="Africa/Nairobi") def test_aware_datetime_date_detail(self): bs = BookSigning.objects.create( - event_date=datetime.datetime( - 2008, 4, 2, 12, 0, tzinfo=datetime.timezone.utc - ) + event_date=datetime.datetime(2008, 4, 2, 12, 0, tzinfo=datetime.UTC) ) res = self.client.get("/dates/booksignings/2008/apr/2/%d/" % bs.pk) self.assertEqual(res.status_code, 200) # 2008-04-02T00:00:00+03:00 (beginning of day) > # 2008-04-01T22:00:00+00:00 (book signing event date). - bs.event_date = datetime.datetime( - 2008, 4, 1, 22, 0, tzinfo=datetime.timezone.utc - ) + bs.event_date = datetime.datetime(2008, 4, 1, 22, 0, tzinfo=datetime.UTC) bs.save() res = self.client.get("/dates/booksignings/2008/apr/2/%d/" % bs.pk) self.assertEqual(res.status_code, 200) # 2008-04-03T00:00:00+03:00 (end of day) > 2008-04-02T22:00:00+00:00 # (book signing event date). - bs.event_date = datetime.datetime( - 2008, 4, 2, 22, 0, tzinfo=datetime.timezone.utc - ) + bs.event_date = datetime.datetime(2008, 4, 2, 22, 0, tzinfo=datetime.UTC) bs.save() res = self.client.get("/dates/booksignings/2008/apr/2/%d/" % bs.pk) self.assertEqual(res.status_code, 404) diff --git a/tests/humanize_tests/tests.py b/tests/humanize_tests/tests.py index ab967e2874..19393b590e 100644 --- a/tests/humanize_tests/tests.py +++ b/tests/humanize_tests/tests.py @@ -441,7 +441,7 @@ class HumanizeTests(SimpleTestCase): def test_naturalday_uses_localtime(self): # Regression for #18504 # This is 2012-03-08HT19:30:00-06:00 in America/Chicago - dt = datetime.datetime(2012, 3, 9, 1, 30, tzinfo=datetime.timezone.utc) + dt = datetime.datetime(2012, 3, 9, 1, 30, tzinfo=datetime.UTC) orig_humanize_datetime, humanize.datetime = humanize.datetime, MockDateTime try: @@ -478,7 +478,7 @@ class HumanizeTests(SimpleTestCase): now + datetime.timedelta(days=2, hours=6), now + datetime.timedelta(days=500), now.replace(tzinfo=naive()), - now.replace(tzinfo=datetime.timezone.utc), + now.replace(tzinfo=datetime.UTC), ] result_list = [ "test", diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py index 953a3cdb6c..3a070f4d45 100644 --- a/tests/migrations/test_writer.py +++ b/tests/migrations/test_writer.py @@ -643,6 +643,13 @@ class WriterTests(SimpleTestCase): datetime.datetime(2014, 1, 1, 1, 1), ("datetime.datetime(2014, 1, 1, 1, 1)", {"import datetime"}), ) + self.assertSerializedResultEqual( + datetime.datetime(2012, 1, 1, 1, 1, tzinfo=datetime.UTC), + ( + "datetime.datetime(2012, 1, 1, 1, 1, tzinfo=datetime.timezone.utc)", + {"import datetime"}, + ), + ) self.assertSerializedResultEqual( datetime.datetime(2012, 1, 1, 1, 1, tzinfo=datetime.timezone.utc), ( @@ -1042,7 +1049,7 @@ class WriterTests(SimpleTestCase): "myfield", models.DateTimeField( default=datetime.datetime( - 2012, 1, 1, 1, 1, tzinfo=datetime.timezone.utc + 2012, 1, 1, 1, 1, tzinfo=datetime.UTC ), ), ), @@ -1066,7 +1073,7 @@ class WriterTests(SimpleTestCase): Test comments at top of file. """ migration = type("Migration", (migrations.Migration,), {"operations": []}) - dt = datetime.datetime(2015, 7, 31, 4, 40, 0, 0, tzinfo=datetime.timezone.utc) + dt = datetime.datetime(2015, 7, 31, 4, 40, 0, 0, tzinfo=datetime.UTC) with mock.patch("django.db.migrations.writer.now", lambda: dt): for include_header in (True, False): with self.subTest(include_header=include_header): diff --git a/tests/postgres_tests/test_ranges.py b/tests/postgres_tests/test_ranges.py index 038e0233c4..859eb0da79 100644 --- a/tests/postgres_tests/test_ranges.py +++ b/tests/postgres_tests/test_ranges.py @@ -566,8 +566,8 @@ class TestSerialization(PostgreSQLSimpleTestCase): lower_date = datetime.date(2014, 1, 1) upper_date = datetime.date(2014, 2, 2) - lower_dt = datetime.datetime(2014, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc) - upper_dt = datetime.datetime(2014, 2, 2, 12, 12, 12, tzinfo=datetime.timezone.utc) + lower_dt = datetime.datetime(2014, 1, 1, 0, 0, 0, tzinfo=datetime.UTC) + upper_dt = datetime.datetime(2014, 2, 2, 12, 12, 12, tzinfo=datetime.UTC) def test_dumping(self): instance = RangesModel( @@ -992,7 +992,7 @@ class TestFormField(PostgreSQLSimpleTestCase): field = pg_forms.DateTimeRangeField() value = field.prepare_value( DateTimeTZRange( - datetime.datetime(2015, 5, 22, 16, 6, 33, tzinfo=datetime.timezone.utc), + datetime.datetime(2015, 5, 22, 16, 6, 33, tzinfo=datetime.UTC), None, ) ) diff --git a/tests/responses/test_cookie.py b/tests/responses/test_cookie.py index 7e7f356deb..df9782739e 100644 --- a/tests/responses/test_cookie.py +++ b/tests/responses/test_cookie.py @@ -1,5 +1,5 @@ import time -from datetime import date, datetime, timedelta, timezone +from datetime import UTC, date, datetime, timedelta from email.utils import format_datetime as format_datetime_rfc5322 from http import cookies @@ -18,9 +18,7 @@ class SetCookieTests(SimpleTestCase): # evaluated expiration time and the time evaluated in set_cookie(). If # this difference doesn't exist, the cookie time will be 1 second # larger. The sleep guarantees that there will be a time difference. - expires = datetime.now(tz=timezone.utc).replace(tzinfo=None) + timedelta( - seconds=10 - ) + expires = datetime.now(tz=UTC).replace(tzinfo=None) + timedelta(seconds=10) time.sleep(0.001) response.set_cookie("datetime", expires=expires) datetime_cookie = response.cookies["datetime"] @@ -29,7 +27,7 @@ class SetCookieTests(SimpleTestCase): def test_aware_expiration(self): """set_cookie() accepts an aware datetime as expiration time.""" response = HttpResponse() - expires = datetime.now(tz=timezone.utc) + timedelta(seconds=10) + expires = datetime.now(tz=UTC) + timedelta(seconds=10) time.sleep(0.001) response.set_cookie("datetime", expires=expires) datetime_cookie = response.cookies["datetime"] @@ -50,9 +48,7 @@ class SetCookieTests(SimpleTestCase): def test_far_expiration(self): """Cookie will expire when a distant expiration time is provided.""" response = HttpResponse() - future_datetime = datetime( - date.today().year + 2, 1, 1, 4, 5, 6, tzinfo=timezone.utc - ) + future_datetime = datetime(date.today().year + 2, 1, 1, 4, 5, 6, tzinfo=UTC) response.set_cookie("datetime", expires=future_datetime) datetime_cookie = response.cookies["datetime"] self.assertIn( diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 935267c2d6..c0c284672b 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -2428,7 +2428,7 @@ class SchemaTests(TransactionTestCase): data = JSONField( encoder=DjangoJSONEncoder, db_default={ - "epoch": datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc) + "epoch": datetime.datetime(1970, 1, 1, tzinfo=datetime.UTC) }, ) @@ -5315,7 +5315,7 @@ class SchemaTests(TransactionTestCase): """ now = datetime.datetime(month=1, day=1, year=2000, hour=1, minute=1) now_tz = datetime.datetime( - month=1, day=1, year=2000, hour=1, minute=1, tzinfo=datetime.timezone.utc + month=1, day=1, year=2000, hour=1, minute=1, tzinfo=datetime.UTC ) mocked_datetime.now = mock.MagicMock(return_value=now) mocked_tz.now = mock.MagicMock(return_value=now_tz) diff --git a/tests/staticfiles_tests/storage.py b/tests/staticfiles_tests/storage.py index 51614fbb18..d57883eed8 100644 --- a/tests/staticfiles_tests/storage.py +++ b/tests/staticfiles_tests/storage.py @@ -1,5 +1,5 @@ import os -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from django.conf import settings from django.contrib.staticfiles.storage import ManifestStaticFilesStorage @@ -22,7 +22,7 @@ class DummyStorage(storage.Storage): pass def get_modified_time(self, name): - return datetime(1970, 1, 1, tzinfo=timezone.utc) + return datetime(1970, 1, 1, tzinfo=UTC) class PathNotImplementedStorage(storage.Storage): diff --git a/tests/staticfiles_tests/test_management.py b/tests/staticfiles_tests/test_management.py index 1b9179af49..a3226f5aa1 100644 --- a/tests/staticfiles_tests/test_management.py +++ b/tests/staticfiles_tests/test_management.py @@ -568,7 +568,7 @@ class TestCollectionNonLocalStorage(TestNoFilesCreated, CollectionTestCase): storage = DummyStorage() self.assertEqual( storage.get_modified_time("name"), - datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc), + datetime.datetime(1970, 1, 1, tzinfo=datetime.UTC), ) with self.assertRaisesMessage( NotImplementedError, "This backend doesn't support absolute paths." diff --git a/tests/timezones/tests.py b/tests/timezones/tests.py index c45f078ef6..815da17026 100644 --- a/tests/timezones/tests.py +++ b/tests/timezones/tests.py @@ -65,7 +65,7 @@ except ImportError: # datetime.datetime(2011, 9, 1, 13, 20, 30), which translates to # 10:20:30 in UTC and 17:20:30 in ICT. -UTC = datetime.timezone.utc +UTC = datetime.UTC EAT = timezone.get_fixed_timezone(180) # Africa/Nairobi ICT = timezone.get_fixed_timezone(420) # Asia/Bangkok @@ -618,7 +618,7 @@ class NewDatabaseTests(TestCase): @skipIfDBFeature("supports_timezones") def test_cursor_execute_accepts_naive_datetime(self): dt = datetime.datetime(2011, 9, 1, 13, 20, 30, tzinfo=EAT) - utc_naive_dt = timezone.make_naive(dt, datetime.timezone.utc) + utc_naive_dt = timezone.make_naive(dt, UTC) with connection.cursor() as cursor: cursor.execute( "INSERT INTO timezones_event (dt) VALUES (%s)", [utc_naive_dt] @@ -637,7 +637,7 @@ class NewDatabaseTests(TestCase): @skipIfDBFeature("supports_timezones") def test_cursor_execute_returns_naive_datetime(self): dt = datetime.datetime(2011, 9, 1, 13, 20, 30, tzinfo=EAT) - utc_naive_dt = timezone.make_naive(dt, datetime.timezone.utc) + utc_naive_dt = timezone.make_naive(dt, UTC) Event.objects.create(dt=dt) with connection.cursor() as cursor: cursor.execute( diff --git a/tests/utils_tests/test_dateformat.py b/tests/utils_tests/test_dateformat.py index dc330a710b..9604b0cef4 100644 --- a/tests/utils_tests/test_dateformat.py +++ b/tests/utils_tests/test_dateformat.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, time, timezone, tzinfo +from datetime import UTC, date, datetime, time, tzinfo from django.test import SimpleTestCase, override_settings from django.test.utils import TZ_SUPPORT, requires_tz_support @@ -63,7 +63,7 @@ class DateFormatTests(SimpleTestCase): ) def test_epoch(self): - udt = datetime(1970, 1, 1, tzinfo=timezone.utc) + udt = datetime(1970, 1, 1, tzinfo=UTC) self.assertEqual(format(udt, "U"), "0") def test_empty_format(self): @@ -208,7 +208,7 @@ class DateFormatTests(SimpleTestCase): @requires_tz_support def test_e_format_with_named_time_zone(self): - dt = datetime(1970, 1, 1, tzinfo=timezone.utc) + dt = datetime(1970, 1, 1, tzinfo=UTC) self.assertEqual(dateformat.format(dt, "e"), "UTC") @requires_tz_support diff --git a/tests/utils_tests/test_feedgenerator.py b/tests/utils_tests/test_feedgenerator.py index e5ceafb8fa..28a1afc96e 100644 --- a/tests/utils_tests/test_feedgenerator.py +++ b/tests/utils_tests/test_feedgenerator.py @@ -148,7 +148,7 @@ class FeedgeneratorTests(SimpleTestCase): rss_feed = feedgenerator.Rss201rev2Feed("title", "link", "description") self.assertEqual( rss_feed.latest_post_date().tzinfo, - datetime.timezone.utc, + datetime.UTC, ) def test_stylesheet_keeps_lazy_urls(self): diff --git a/tests/utils_tests/test_http.py b/tests/utils_tests/test_http.py index c04f0a03d7..d18fb63c0c 100644 --- a/tests/utils_tests/test_http.py +++ b/tests/utils_tests/test_http.py @@ -1,6 +1,6 @@ import platform import unittest -from datetime import datetime, timezone +from datetime import UTC, datetime from unittest import mock from django.test import SimpleTestCase @@ -329,61 +329,61 @@ class HttpDateProcessingTests(unittest.TestCase): def test_parsing_rfc1123(self): parsed = parse_http_date("Sun, 06 Nov 1994 08:49:37 GMT") self.assertEqual( - datetime.fromtimestamp(parsed, timezone.utc), - datetime(1994, 11, 6, 8, 49, 37, tzinfo=timezone.utc), + datetime.fromtimestamp(parsed, UTC), + datetime(1994, 11, 6, 8, 49, 37, tzinfo=UTC), ) @unittest.skipIf(platform.architecture()[0] == "32bit", "The Year 2038 problem.") @mock.patch("django.utils.http.datetime") def test_parsing_rfc850(self, mocked_datetime): mocked_datetime.side_effect = datetime - now_1 = datetime(2019, 11, 6, 8, 49, 37, tzinfo=timezone.utc) - now_2 = datetime(2020, 11, 6, 8, 49, 37, tzinfo=timezone.utc) - now_3 = datetime(2048, 11, 6, 8, 49, 37, tzinfo=timezone.utc) + now_1 = datetime(2019, 11, 6, 8, 49, 37, tzinfo=UTC) + now_2 = datetime(2020, 11, 6, 8, 49, 37, tzinfo=UTC) + now_3 = datetime(2048, 11, 6, 8, 49, 37, tzinfo=UTC) tests = ( ( now_1, "Tuesday, 31-Dec-69 08:49:37 GMT", - datetime(2069, 12, 31, 8, 49, 37, tzinfo=timezone.utc), + datetime(2069, 12, 31, 8, 49, 37, tzinfo=UTC), ), ( now_1, "Tuesday, 10-Nov-70 08:49:37 GMT", - datetime(1970, 11, 10, 8, 49, 37, tzinfo=timezone.utc), + datetime(1970, 11, 10, 8, 49, 37, tzinfo=UTC), ), ( now_1, "Sunday, 06-Nov-94 08:49:37 GMT", - datetime(1994, 11, 6, 8, 49, 37, tzinfo=timezone.utc), + datetime(1994, 11, 6, 8, 49, 37, tzinfo=UTC), ), ( now_2, "Wednesday, 31-Dec-70 08:49:37 GMT", - datetime(2070, 12, 31, 8, 49, 37, tzinfo=timezone.utc), + datetime(2070, 12, 31, 8, 49, 37, tzinfo=UTC), ), ( now_2, "Friday, 31-Dec-71 08:49:37 GMT", - datetime(1971, 12, 31, 8, 49, 37, tzinfo=timezone.utc), + datetime(1971, 12, 31, 8, 49, 37, tzinfo=UTC), ), ( now_3, "Sunday, 31-Dec-00 08:49:37 GMT", - datetime(2000, 12, 31, 8, 49, 37, tzinfo=timezone.utc), + datetime(2000, 12, 31, 8, 49, 37, tzinfo=UTC), ), ( now_3, "Friday, 31-Dec-99 08:49:37 GMT", - datetime(1999, 12, 31, 8, 49, 37, tzinfo=timezone.utc), + datetime(1999, 12, 31, 8, 49, 37, tzinfo=UTC), ), ) for now, rfc850str, expected_date in tests: with self.subTest(rfc850str=rfc850str): mocked_datetime.now.return_value = now parsed = parse_http_date(rfc850str) - mocked_datetime.now.assert_called_once_with(tz=timezone.utc) + mocked_datetime.now.assert_called_once_with(tz=UTC) self.assertEqual( - datetime.fromtimestamp(parsed, timezone.utc), + datetime.fromtimestamp(parsed, UTC), expected_date, ) mocked_datetime.reset_mock() @@ -391,8 +391,8 @@ class HttpDateProcessingTests(unittest.TestCase): def test_parsing_asctime(self): parsed = parse_http_date("Sun Nov 6 08:49:37 1994") self.assertEqual( - datetime.fromtimestamp(parsed, timezone.utc), - datetime(1994, 11, 6, 8, 49, 37, tzinfo=timezone.utc), + datetime.fromtimestamp(parsed, UTC), + datetime(1994, 11, 6, 8, 49, 37, tzinfo=UTC), ) def test_parsing_asctime_nonascii_digits(self): @@ -405,8 +405,8 @@ class HttpDateProcessingTests(unittest.TestCase): def test_parsing_year_less_than_70(self): parsed = parse_http_date("Sun Nov 6 08:49:37 0037") self.assertEqual( - datetime.fromtimestamp(parsed, timezone.utc), - datetime(2037, 11, 6, 8, 49, 37, tzinfo=timezone.utc), + datetime.fromtimestamp(parsed, UTC), + datetime(2037, 11, 6, 8, 49, 37, tzinfo=UTC), ) diff --git a/tests/utils_tests/test_timesince.py b/tests/utils_tests/test_timesince.py index 0727e65af4..fdcfa4b281 100644 --- a/tests/utils_tests/test_timesince.py +++ b/tests/utils_tests/test_timesince.py @@ -264,7 +264,7 @@ class TimesinceTests(TestCase): datetime.datetime(2023, 4, 14, 1, 30, 30), zoneinfo.ZoneInfo(key="Asia/Kathmandu"), # UTC+05:45 ) - now_utc = now_with_zoneinfo.astimezone(datetime.timezone.utc) + now_utc = now_with_zoneinfo.astimezone(datetime.UTC) tests = [ (now_with_zoneinfo, "0\xa0minutes"), (now_with_zoneinfo - self.onemicrosecond, "0\xa0minutes"), diff --git a/tests/utils_tests/test_timezone.py b/tests/utils_tests/test_timezone.py index 43bb2bc7a3..01e47aa08a 100644 --- a/tests/utils_tests/test_timezone.py +++ b/tests/utils_tests/test_timezone.py @@ -8,7 +8,7 @@ from django.utils import timezone PARIS_ZI = zoneinfo.ZoneInfo("Europe/Paris") EAT = timezone.get_fixed_timezone(180) # Africa/Nairobi ICT = timezone.get_fixed_timezone(420) # Asia/Bangkok -UTC = datetime.timezone.utc +UTC = datetime.UTC class TimezoneTests(SimpleTestCase):