From 7bf4a5b2b5464f048a34e5ec50258bd83db37814 Mon Sep 17 00:00:00 2001 From: wh1te909 Date: Mon, 8 May 2023 21:12:08 +0000 Subject: [PATCH] begin pytz removal --- api/tacticalrmm/agents/tests/test_agents.py | 4 ++-- api/tacticalrmm/autotasks/models.py | 3 +-- api/tacticalrmm/core/views.py | 4 ++-- api/tacticalrmm/tacticalrmm/helpers.py | 12 +++++------- api/tacticalrmm/tacticalrmm/utils.py | 4 ++-- api/tacticalrmm/winupdate/baker_recipes.py | 4 ++-- api/tacticalrmm/winupdate/tasks.py | 4 ++-- 7 files changed, 16 insertions(+), 19 deletions(-) diff --git a/api/tacticalrmm/agents/tests/test_agents.py b/api/tacticalrmm/agents/tests/test_agents.py index 2bf6ea32..0a5a89c6 100644 --- a/api/tacticalrmm/agents/tests/test_agents.py +++ b/api/tacticalrmm/agents/tests/test_agents.py @@ -3,8 +3,8 @@ import os from itertools import cycle from typing import TYPE_CHECKING from unittest.mock import patch +from zoneinfo import ZoneInfo -import pytz from django.conf import settings from django.utils import timezone as djangotime from model_bakery import baker @@ -866,7 +866,7 @@ class TestAgentViews(TacticalTestCase): # test pulling data r = self.client.get(url, format="json") - ctx = {"default_tz": pytz.timezone("America/Los_Angeles")} + ctx = {"default_tz": ZoneInfo("America/Los_Angeles")} data = AgentHistorySerializer(history, many=True, context=ctx).data self.assertEqual(r.status_code, 200) self.assertEqual(r.data, data) # type:ignore diff --git a/api/tacticalrmm/autotasks/models.py b/api/tacticalrmm/autotasks/models.py index 4682259e..0389d9a4 100644 --- a/api/tacticalrmm/autotasks/models.py +++ b/api/tacticalrmm/autotasks/models.py @@ -5,7 +5,6 @@ from contextlib import suppress from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union from zoneinfo import ZoneInfo -import pytz from django.core.cache import cache from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models @@ -276,7 +275,7 @@ class AutomatedTask(BaseAuditModel): ): self.run_time_date = ( djangotime.now() + djangotime.timedelta(minutes=5) - ).astimezone(pytz.timezone(agent.timezone)) + ).astimezone(ZoneInfo(agent.timezone)) task["start_year"] = int(self.run_time_date.strftime("%Y")) task["start_month"] = int(self.run_time_date.strftime("%-m")) diff --git a/api/tacticalrmm/core/views.py b/api/tacticalrmm/core/views.py index cd9728ab..7f4ddff2 100644 --- a/api/tacticalrmm/core/views.py +++ b/api/tacticalrmm/core/views.py @@ -1,9 +1,9 @@ import json import re from pathlib import Path +from zoneinfo import ZoneInfo import psutil -import pytz import requests from cryptography import x509 from django.conf import settings @@ -421,7 +421,7 @@ def status(request): cert_bytes = Path(cert_file).read_bytes() cert = x509.load_pem_x509_certificate(cert_bytes) - expires = pytz.utc.localize(cert.not_valid_after) + expires = cert.not_valid_after.replace(tzinfo=ZoneInfo("UTC")) now = djangotime.now() delta = expires - now diff --git a/api/tacticalrmm/tacticalrmm/helpers.py b/api/tacticalrmm/tacticalrmm/helpers.py index d19674e4..b9ec8220 100644 --- a/api/tacticalrmm/tacticalrmm/helpers.py +++ b/api/tacticalrmm/tacticalrmm/helpers.py @@ -1,8 +1,8 @@ +import random from typing import TYPE_CHECKING, Any from urllib.parse import urlparse +from zoneinfo import ZoneInfo -import pytz -import random from django.conf import settings from django.utils import timezone as djangotime from rest_framework import status @@ -42,12 +42,10 @@ def date_is_in_past(*, datetime_obj: "datetime", agent_tz: str) -> bool: """ datetime_obj must be a naive datetime """ - now = djangotime.now() # convert agent tz to UTC to compare - agent_pytz = pytz.timezone(agent_tz) - localized = agent_pytz.localize(datetime_obj) - utc_time = localized.astimezone(pytz.utc) - return now > utc_time + localized = datetime_obj.replace(tzinfo=ZoneInfo(agent_tz)) + utc_time = localized.astimezone(ZoneInfo("UTC")) + return djangotime.now() > utc_time def get_webdomain() -> str: diff --git a/api/tacticalrmm/tacticalrmm/utils.py b/api/tacticalrmm/tacticalrmm/utils.py index 8e8f2877..6c9c2f46 100644 --- a/api/tacticalrmm/tacticalrmm/utils.py +++ b/api/tacticalrmm/tacticalrmm/utils.py @@ -7,8 +7,8 @@ from concurrent.futures import ThreadPoolExecutor from contextlib import contextmanager from functools import wraps from typing import List, Optional, Union +from zoneinfo import ZoneInfo -import pytz import requests from channels.auth import AuthMiddlewareStack from channels.db import database_sync_to_async @@ -100,7 +100,7 @@ def generate_winagent_exe( def get_default_timezone(): - return pytz.timezone(get_core_settings().default_time_zone) + return ZoneInfo(get_core_settings().default_time_zone) def get_bit_days(days: list[str]) -> int: diff --git a/api/tacticalrmm/winupdate/baker_recipes.py b/api/tacticalrmm/winupdate/baker_recipes.py index d0669729..b597d129 100644 --- a/api/tacticalrmm/winupdate/baker_recipes.py +++ b/api/tacticalrmm/winupdate/baker_recipes.py @@ -1,12 +1,12 @@ from datetime import datetime as dt from itertools import cycle +from zoneinfo import ZoneInfo -import pytz from model_bakery.recipe import Recipe, seq from .models import WinUpdate, WinUpdatePolicy -timezone = pytz.timezone("America/Los_Angeles") +timezone = ZoneInfo("America/Los_Angeles") severity = ["Critical", "Important", "Moderate", "Low", ""] winupdate = Recipe( diff --git a/api/tacticalrmm/winupdate/tasks.py b/api/tacticalrmm/winupdate/tasks.py index 8876d907..e9de2e0e 100644 --- a/api/tacticalrmm/winupdate/tasks.py +++ b/api/tacticalrmm/winupdate/tasks.py @@ -2,8 +2,8 @@ import asyncio import datetime as dt import time from contextlib import suppress +from zoneinfo import ZoneInfo -import pytz from django.utils import timezone as djangotime from packaging import version as pyver @@ -58,7 +58,7 @@ def check_agent_update_schedule_task() -> None: or patch_policy.other == "approve" ): # get current time in agent local time - timezone = pytz.timezone(agent.timezone) + timezone = ZoneInfo(agent.timezone) agent_localtime_now = dt.datetime.now(timezone) weekday = agent_localtime_now.weekday() hour = agent_localtime_now.hour