mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-23 18:55:15 -05:00
feat: Upgrade to Python 3.12 (#4675)
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
]
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user