diff --git a/src/backend/InvenTree/InvenTree/helpers.py b/src/backend/InvenTree/InvenTree/helpers.py index 21d20f98ad..f149a5d95f 100644 --- a/src/backend/InvenTree/InvenTree/helpers.py +++ b/src/backend/InvenTree/InvenTree/helpers.py @@ -22,9 +22,10 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ import bleach -import pytz from bleach import clean from djmoney.money import Money +from PIL import Image +from zoneinfo import ZoneInfo, ZoneInfoNotFoundError from common.currency import currency_code_default @@ -138,8 +139,6 @@ def getStaticUrl(filename): def TestIfImage(img): """Test if an image file is indeed an image.""" - from PIL import Image - try: Image.open(img).verify() return True @@ -962,15 +961,15 @@ def to_local_time(time, target_tz: Optional[str] = None): if not source_tz: # Default to UTC if not provided - source_tz = pytz.utc + source_tz = ZoneInfo('UTC') if not target_tz: target_tz = server_timezone() try: - target_tz = pytz.timezone(str(target_tz)) - except pytz.UnknownTimeZoneError: - target_tz = pytz.utc + target_tz = ZoneInfo(str(target_tz)) + except ZoneInfoNotFoundError: + target_tz = ZoneInfo('UTC') target_time = time.replace(tzinfo=source_tz).astimezone(target_tz) diff --git a/src/backend/InvenTree/InvenTree/settings.py b/src/backend/InvenTree/InvenTree/settings.py index 0d0c41bcc9..f8c53e1271 100644 --- a/src/backend/InvenTree/InvenTree/settings.py +++ b/src/backend/InvenTree/InvenTree/settings.py @@ -19,9 +19,9 @@ import django.core.exceptions from django.core.validators import URLValidator from django.http import Http404 -import pytz import structlog from dotenv import load_dotenv +from zoneinfo import ZoneInfo, ZoneInfoNotFoundError from InvenTree.cache import get_cache_config, is_global_cache_enabled from InvenTree.config import get_boolean_setting, get_custom_file, get_setting @@ -1040,8 +1040,8 @@ TIME_ZONE = get_setting('INVENTREE_TIMEZONE', 'timezone', 'UTC') # Check that the timezone is valid try: - pytz.timezone(TIME_ZONE) -except pytz.exceptions.UnknownTimeZoneError: # pragma: no cover + ZoneInfo(TIME_ZONE) +except ZoneInfoNotFoundError: # pragma: no cover raise ValueError(f"Specified timezone '{TIME_ZONE}' is not valid") USE_I18N = True diff --git a/src/backend/InvenTree/InvenTree/tests.py b/src/backend/InvenTree/InvenTree/tests.py index 9080b521ea..5ed177be40 100644 --- a/src/backend/InvenTree/InvenTree/tests.py +++ b/src/backend/InvenTree/InvenTree/tests.py @@ -16,12 +16,12 @@ from django.urls import reverse from django.utils import timezone import pint.errors -import pytz from djmoney.contrib.exchange.exceptions import MissingRate from djmoney.contrib.exchange.models import Rate, convert_money from djmoney.money import Money from maintenance_mode.core import get_maintenance_mode, set_maintenance_mode from sesame.utils import get_user +from zoneinfo import ZoneInfo import InvenTree.conversion import InvenTree.format @@ -736,14 +736,14 @@ class TestTimeFormat(TestCase): month=1, day=1, hour=0, - minute=0, + minute=1, second=0, - tzinfo=pytz.timezone('Europe/London'), + tzinfo=ZoneInfo('Europe/London'), ) tests = [ ('UTC', '2000-01-01 00:01:00+00:00'), - ('Europe/London', '2000-01-01 00:00:00-00:01'), + ('Europe/London', '2000-01-01 00:01:00+00:00'), ('America/New_York', '1999-12-31 19:01:00-05:00'), # All following tests should result in the same value ('Australia/Sydney', '2000-01-01 11:01:00+11:00'), diff --git a/src/backend/InvenTree/report/tests.py b/src/backend/InvenTree/report/tests.py index 2caf4e1206..8a8daf3ede 100644 --- a/src/backend/InvenTree/report/tests.py +++ b/src/backend/InvenTree/report/tests.py @@ -10,8 +10,8 @@ from django.urls import reverse from django.utils import timezone from django.utils.safestring import SafeString -import pytz from PIL import Image +from zoneinfo import ZoneInfo import report.models as report_models from build.models import Build @@ -182,17 +182,17 @@ class ReportTagTest(TestCase): hour=12, minute=30, second=0, - tzinfo=pytz.timezone('Australia/Sydney'), + tzinfo=ZoneInfo('Australia/Sydney'), ) # Format a set of tests: timezone, format, expected tests = [ - (None, None, '2024-03-12T22:25:00-04:00'), + (None, None, '2024-03-12T21:30:00-04:00'), (None, '%d-%m-%y', '12-03-24'), - ('UTC', None, '2024-03-13T02:25:00+00:00'), + ('UTC', None, '2024-03-13T01:30:00+00:00'), ('UTC', '%d-%B-%Y', '13-March-2024'), - ('Europe/Amsterdam', None, '2024-03-13T03:25:00+01:00'), - ('Europe/Amsterdam', '%y-%m-%d %H:%M', '24-03-13 03:25'), + ('Europe/Amsterdam', None, '2024-03-13T02:30:00+01:00'), + ('Europe/Amsterdam', '%y-%m-%d %H:%M', '24-03-13 02:30'), ] for tz, fmt, expected in tests: