feat: Upgrade to Python 3.12 (#4675)

Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
This commit is contained in:
Michael Genson
2024-12-04 22:31:26 -06:00
committed by GitHub
parent 0e6a40e210
commit 87504fbb05
43 changed files with 128 additions and 163 deletions

View File

@@ -3,7 +3,7 @@ From Pydantic V1: https://github.com/pydantic/pydantic/blob/abcf81ec104d2da70894
"""
import re
from datetime import date, datetime, time, timedelta, timezone
from datetime import UTC, date, datetime, time, timedelta, timezone
date_expr = r"(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})"
time_expr = (
@@ -39,7 +39,7 @@ iso8601_duration_re = re.compile(
r"$"
)
EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc)
EPOCH = datetime(1970, 1, 1, tzinfo=UTC)
# if greater than this, the number is in ms, if less than or equal it's in seconds
# (in seconds this is 11th October 2603, in ms it's 20th August 1970)
MS_WATERSHED = int(2e10)
@@ -87,12 +87,12 @@ def from_unix_seconds(seconds: int | float) -> datetime:
while abs(seconds) > MS_WATERSHED:
seconds /= 1000
dt = EPOCH + timedelta(seconds=seconds)
return dt.replace(tzinfo=timezone.utc)
return dt.replace(tzinfo=UTC)
def _parse_timezone(value: str | None, error: type[Exception]) -> None | int | timezone:
if value == "Z":
return timezone.utc
return UTC
elif value is not None:
offset_mins = int(value[-2:]) if len(value) > 3 else 0
offset = 60 * int(value[1:3]) + offset_mins

View File

@@ -2,16 +2,15 @@ from __future__ import annotations
import re
from collections.abc import Sequence
from datetime import datetime, timezone
from datetime import UTC, datetime
from enum import Enum
from typing import ClassVar, Protocol, TypeVar
from typing import ClassVar, Protocol, Self, TypeVar
from humps.main import camelize
from pydantic import UUID4, AliasChoices, BaseModel, ConfigDict, Field, model_validator
from sqlalchemy import Select, desc, func, or_, text
from sqlalchemy.orm import InstrumentedAttribute, Session
from sqlalchemy.orm.interfaces import LoaderOption
from typing_extensions import Self
from mealie.db.models._model_base import SqlAlchemyBase
@@ -88,7 +87,7 @@ class MealieModel(BaseModel):
if not isinstance(val, datetime):
continue
if not val.tzinfo:
setattr(self, field, val.replace(tzinfo=timezone.utc))
setattr(self, field, val.replace(tzinfo=UTC))
return self

View File

@@ -32,7 +32,7 @@ class CreateWebhook(MealieModel):
type: datetime is treated as a value with a timezone
"""
parser_funcs = [
lambda x: parse_datetime(x).astimezone(datetime.timezone.utc).time(),
lambda x: parse_datetime(x).astimezone(datetime.UTC).time(),
parse_time,
]

View File

@@ -1,4 +1,4 @@
from datetime import datetime, timedelta, timezone
from datetime import UTC, datetime, timedelta
from pydantic import UUID4, ConfigDict, Field
from sqlalchemy.orm import selectinload
@@ -11,7 +11,7 @@ from .recipe import Recipe
def defaut_expires_at_time() -> datetime:
return datetime.now(timezone.utc) + timedelta(days=30)
return datetime.now(UTC) + timedelta(days=30)
class RecipeShareTokenCreate(MealieModel):

View File

@@ -1,4 +1,4 @@
from datetime import datetime, timezone
from datetime import UTC, datetime
from enum import Enum
from pathlib import Path
from typing import Annotated
@@ -40,7 +40,7 @@ class RecipeTimelineEventIn(MealieModel):
message: str | None = Field(None, alias="eventMessage")
image: Annotated[TimelineEventImage | None, Field(validate_default=True)] = TimelineEventImage.does_not_have_image
timestamp: datetime = datetime.now(timezone.utc)
timestamp: datetime = datetime.now(UTC)
model_config = ConfigDict(use_enum_values=True)

View File

@@ -1,4 +1,4 @@
from datetime import datetime, timedelta, timezone
from datetime import UTC, datetime, timedelta
from pathlib import Path
from typing import Annotated, Any, Generic, TypeVar
from uuid import UUID
@@ -218,7 +218,7 @@ class PrivateUser(UserOut):
return False
lockout_expires_at = self.locked_at + timedelta(hours=get_app_settings().SECURITY_USER_LOCKOUT_TIME)
return lockout_expires_at > datetime.now(timezone.utc)
return lockout_expires_at > datetime.now(UTC)
def directory(self) -> Path:
return PrivateUser.get_directory(self.id)