mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-14 06:15:26 -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:
@@ -6,7 +6,7 @@ Create Date: 2024-03-18 02:28:15.896959
|
||||
|
||||
"""
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from textwrap import dedent
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
@@ -34,7 +34,7 @@ def new_user_rating(user_id: Any, recipe_id: Any, rating: float | None = None, i
|
||||
else:
|
||||
id = "%.32x" % uuid4().int # noqa: UP031
|
||||
|
||||
now = datetime.now(timezone.utc).isoformat()
|
||||
now = datetime.now(UTC).isoformat()
|
||||
return {
|
||||
"id": id,
|
||||
"user_id": user_id,
|
||||
|
||||
@@ -6,7 +6,7 @@ Create Date: 2024-07-12 16:16:29.973929
|
||||
|
||||
"""
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from textwrap import dedent
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
@@ -89,7 +89,7 @@ def dedupe_cookbook_slugs():
|
||||
def create_household(session: orm.Session, group_id: str) -> str:
|
||||
# create/insert household
|
||||
household_id = generate_id()
|
||||
timestamp = datetime.now(timezone.utc).isoformat()
|
||||
timestamp = datetime.now(UTC).isoformat()
|
||||
household_data = {
|
||||
"id": household_id,
|
||||
"name": settings.DEFAULT_HOUSEHOLD,
|
||||
|
||||
@@ -3,7 +3,7 @@ from functools import lru_cache
|
||||
|
||||
import requests
|
||||
|
||||
_LAST_RESET = None
|
||||
_LAST_RESET: datetime.datetime | None = None
|
||||
|
||||
|
||||
@lru_cache(maxsize=1)
|
||||
@@ -32,7 +32,7 @@ def get_latest_version() -> str:
|
||||
|
||||
global _LAST_RESET
|
||||
|
||||
now = datetime.datetime.now(datetime.timezone.utc)
|
||||
now = datetime.datetime.now(datetime.UTC)
|
||||
|
||||
if not _LAST_RESET or now - _LAST_RESET > datetime.timedelta(days=MAX_DAYS_OLD):
|
||||
_LAST_RESET = now
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import abc
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from datetime import UTC, datetime, timedelta
|
||||
from typing import Generic, TypeVar
|
||||
|
||||
import jwt
|
||||
@@ -45,7 +45,7 @@ class AuthProvider(Generic[T], metaclass=abc.ABCMeta):
|
||||
to_encode = data.copy()
|
||||
expires_delta = expires_delta or timedelta(hours=settings.TOKEN_TIME)
|
||||
|
||||
expire = datetime.now(timezone.utc) + expires_delta
|
||||
expire = datetime.now(UTC) + expires_delta
|
||||
|
||||
to_encode["exp"] = expire
|
||||
to_encode["iss"] = ISS
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import secrets
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from datetime import UTC, datetime, timedelta
|
||||
from pathlib import Path
|
||||
|
||||
import jwt
|
||||
@@ -34,7 +34,7 @@ def create_access_token(data: dict, expires_delta: timedelta | None = None) -> s
|
||||
to_encode = data.copy()
|
||||
expires_delta = expires_delta or timedelta(hours=settings.TOKEN_TIME)
|
||||
|
||||
expire = datetime.now(timezone.utc) + expires_delta
|
||||
expire = datetime.now(UTC) + expires_delta
|
||||
|
||||
to_encode["exp"] = expire
|
||||
return jwt.encode(to_encode, settings.SECRET, algorithm=ALGORITHM)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import logging
|
||||
import os
|
||||
import secrets
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from pathlib import Path
|
||||
from typing import Annotated, Any, NamedTuple
|
||||
|
||||
@@ -160,7 +160,7 @@ class AppSettings(AppLoggingSettings):
|
||||
local_tz = tzlocal()
|
||||
now = datetime.now(local_tz)
|
||||
local_time = now.replace(hour=local_hour, minute=local_minute)
|
||||
utc_time = local_time.astimezone(timezone.utc)
|
||||
utc_time = local_time.astimezone(UTC)
|
||||
|
||||
self.logger.debug(f"Local time: {local_hour}:{local_minute} | UTC time: {utc_time.hour}:{utc_time.minute}")
|
||||
return ScheduleTime(utc_time.hour, utc_time.minute)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from sqlalchemy.types import DateTime, TypeDecorator
|
||||
|
||||
@@ -7,14 +7,14 @@ def get_utc_now():
|
||||
"""
|
||||
Returns the current time in UTC.
|
||||
"""
|
||||
return datetime.now(timezone.utc)
|
||||
return datetime.now(UTC)
|
||||
|
||||
|
||||
def get_utc_today():
|
||||
"""
|
||||
Returns the current date in UTC.
|
||||
"""
|
||||
return datetime.now(timezone.utc).date()
|
||||
return datetime.now(UTC).date()
|
||||
|
||||
|
||||
class NaiveDateTime(TypeDecorator):
|
||||
@@ -35,7 +35,7 @@ class NaiveDateTime(TypeDecorator):
|
||||
|
||||
try:
|
||||
if value.tzinfo is not None:
|
||||
value = value.astimezone(timezone.utc)
|
||||
value = value.astimezone(UTC)
|
||||
return value.replace(tzinfo=None)
|
||||
except Exception:
|
||||
return value
|
||||
@@ -43,7 +43,7 @@ class NaiveDateTime(TypeDecorator):
|
||||
def process_result_value(self, value: datetime | None, dialect):
|
||||
try:
|
||||
if value is not None:
|
||||
value = value.replace(tzinfo=timezone.utc)
|
||||
value = value.replace(tzinfo=UTC)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from contextvars import ContextVar
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
from pydantic import ConfigDict
|
||||
@@ -227,7 +227,7 @@ def update_shopping_lists(session: orm.Session, _):
|
||||
if not shopping_list:
|
||||
continue
|
||||
|
||||
shopping_list.updated_at = datetime.now(timezone.utc)
|
||||
shopping_list.updated_at = datetime.now(UTC)
|
||||
local_session.commit()
|
||||
except Exception:
|
||||
local_session.rollback()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, time, timezone
|
||||
from datetime import UTC, datetime, time
|
||||
from typing import TYPE_CHECKING, Optional
|
||||
|
||||
from sqlalchemy import Boolean, ForeignKey, String, Time, orm
|
||||
@@ -30,7 +30,7 @@ class GroupWebhooksModel(SqlAlchemyBase, BaseMixins):
|
||||
|
||||
# New Fields
|
||||
webhook_type: Mapped[str | None] = mapped_column(String, default="") # Future use for different types of webhooks
|
||||
scheduled_time: Mapped[time | None] = mapped_column(Time, default=lambda: datetime.now(timezone.utc).time())
|
||||
scheduled_time: Mapped[time | None] = mapped_column(Time, default=lambda: datetime.now(UTC).time())
|
||||
|
||||
# Column is no longer used but is kept for since it's super annoying to
|
||||
# delete a column in SQLite and it's not a big deal to keep it around
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import date, datetime, timezone
|
||||
from datetime import UTC, date, datetime
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import sqlalchemy as sa
|
||||
@@ -207,7 +207,7 @@ class RecipeModel(SqlAlchemyBase, BaseMixins):
|
||||
if notes:
|
||||
self.notes = [Note(**n) for n in notes]
|
||||
|
||||
self.date_updated = datetime.now(timezone.utc)
|
||||
self.date_updated = datetime.now(UTC)
|
||||
|
||||
# SQLAlchemy events do not seem to register things that are set during auto_init
|
||||
if name is not None:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from sqlalchemy import ForeignKey, String
|
||||
@@ -48,4 +48,4 @@ class RecipeTimelineEvent(SqlAlchemyBase, BaseMixins):
|
||||
timestamp=None,
|
||||
**_,
|
||||
) -> None:
|
||||
self.timestamp = timestamp or datetime.now(timezone.utc)
|
||||
self.timestamp = timestamp or datetime.now(UTC)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from datetime import UTC, datetime, timedelta
|
||||
from typing import TYPE_CHECKING
|
||||
from uuid import uuid4
|
||||
|
||||
@@ -15,7 +15,7 @@ if TYPE_CHECKING:
|
||||
|
||||
|
||||
def defaut_expires_at_time() -> datetime:
|
||||
return datetime.now(timezone.utc) + timedelta(days=30)
|
||||
return datetime.now(UTC) + timedelta(days=30)
|
||||
|
||||
|
||||
class RecipeShareTokenModel(SqlAlchemyBase, BaseMixins):
|
||||
|
||||
@@ -2,7 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import random
|
||||
from collections.abc import Iterable
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from math import ceil
|
||||
from typing import Any, Generic, TypeVar
|
||||
|
||||
@@ -70,7 +70,7 @@ class RepositoryGeneric(Generic[Schema, Model]):
|
||||
return self._household_id
|
||||
|
||||
def _random_seed(self) -> str:
|
||||
return str(datetime.now(tz=timezone.utc))
|
||||
return str(datetime.now(tz=UTC))
|
||||
|
||||
def _log_exception(self, e: Exception) -> None:
|
||||
self.logger.error(f"Error processing query for Repo model={self.model.__name__} schema={self.schema.__name__}")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
@@ -13,7 +13,7 @@ class RepositoryMeals(HouseholdRepositoryGeneric[ReadPlanEntry, GroupMealPlan]):
|
||||
if not self.household_id:
|
||||
raise Exception("household_id not set")
|
||||
|
||||
today = datetime.now(tz=timezone.utc).date()
|
||||
today = datetime.now(tz=UTC).date()
|
||||
stmt = select(GroupMealPlan).filter(
|
||||
GroupMealPlan.date == today, GroupMealPlan.household_id == self.household_id
|
||||
)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import re as re
|
||||
from collections.abc import Sequence
|
||||
from random import randint
|
||||
from typing import cast
|
||||
from typing import Self, cast
|
||||
from uuid import UUID
|
||||
|
||||
import sqlalchemy as sa
|
||||
@@ -10,7 +10,6 @@ from pydantic import UUID4
|
||||
from slugify import slugify
|
||||
from sqlalchemy import orm
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from typing_extensions import Self
|
||||
|
||||
from mealie.db.models.household.household import Household
|
||||
from mealie.db.models.recipe.category import Category
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from functools import cached_property
|
||||
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends
|
||||
@@ -45,7 +45,7 @@ class ReadWebhookController(BaseUserController):
|
||||
"""Manually re-fires all previously scheduled webhooks for today"""
|
||||
|
||||
start_time = datetime.min.time()
|
||||
start_dt = datetime.combine(datetime.now(timezone.utc).date(), start_time)
|
||||
start_dt = datetime.combine(datetime.now(UTC).date(), start_time)
|
||||
post_group_webhooks(start_dt=start_dt, group_id=self.group.id, household_id=self.household.id)
|
||||
|
||||
@router.get("/{item_id}", response_model=ReadWebhook)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -25,7 +25,7 @@ class BackupV2(BaseService):
|
||||
db_file = self.settings.DB_URL.removeprefix("sqlite:///") # type: ignore
|
||||
|
||||
# Create a backup of the SQLite database
|
||||
timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y.%m.%d")
|
||||
timestamp = datetime.datetime.now(datetime.UTC).strftime("%Y.%m.%d")
|
||||
shutil.copy(db_file, self.directories.DATA_DIR.joinpath(f"mealie_{timestamp}.bak.db"))
|
||||
|
||||
def _postgres(self) -> None:
|
||||
@@ -37,7 +37,7 @@ class BackupV2(BaseService):
|
||||
exclude_ext = {".zip"}
|
||||
exclude_dirs = {"backups", ".temp"}
|
||||
|
||||
timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y.%m.%d.%H.%M.%S")
|
||||
timestamp = datetime.datetime.now(datetime.UTC).strftime("%Y.%m.%d.%H.%M.%S")
|
||||
|
||||
backup_name = f"mealie_{timestamp}.zip"
|
||||
backup_file = self.directories.BACKUP_DIR / backup_name
|
||||
|
||||
@@ -2,7 +2,7 @@ import contextlib
|
||||
import json
|
||||
from abc import ABC, abstractmethod
|
||||
from collections.abc import Generator
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from typing import cast
|
||||
from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
|
||||
|
||||
@@ -163,8 +163,8 @@ class WebhookEventListener(EventListenerBase):
|
||||
with self.ensure_session() as session:
|
||||
stmt = select(GroupWebhooksModel).where(
|
||||
GroupWebhooksModel.enabled == True, # noqa: E712 - required for SQLAlchemy comparison
|
||||
GroupWebhooksModel.scheduled_time > start_dt.astimezone(timezone.utc).time(),
|
||||
GroupWebhooksModel.scheduled_time <= end_dt.astimezone(timezone.utc).time(),
|
||||
GroupWebhooksModel.scheduled_time > start_dt.astimezone(UTC).time(),
|
||||
GroupWebhooksModel.scheduled_time <= end_dt.astimezone(UTC).time(),
|
||||
GroupWebhooksModel.group_id == self.group_id,
|
||||
GroupWebhooksModel.household_id == self.household_id,
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import uuid
|
||||
from datetime import date, datetime, timezone
|
||||
from datetime import UTC, date, datetime
|
||||
from enum import Enum, auto
|
||||
from typing import Any
|
||||
|
||||
@@ -193,4 +193,4 @@ class Event(MealieModel):
|
||||
def __init__(self, *args, **kwargs) -> None:
|
||||
super().__init__(*args, **kwargs)
|
||||
self.event_id = uuid.uuid4()
|
||||
self.timestamp = datetime.now(timezone.utc)
|
||||
self.timestamp = datetime.now(UTC)
|
||||
|
||||
@@ -43,7 +43,7 @@ class Exporter(BaseService):
|
||||
name="Data Export",
|
||||
size=pretty_size(export_path.stat().st_size),
|
||||
filename=export_path.name,
|
||||
expires=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=1),
|
||||
expires=datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=1),
|
||||
)
|
||||
|
||||
db.group_exports.create(group_data_export)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import tempfile
|
||||
import zipfile
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from pathlib import Path
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
@@ -35,7 +35,7 @@ class CopyMeThatMigrator(BaseMigrator):
|
||||
self.name = "copymethat"
|
||||
|
||||
self.key_aliases = [
|
||||
MigrationAlias(key="last_made", alias="made_this", func=lambda x: datetime.now(timezone.utc)),
|
||||
MigrationAlias(key="last_made", alias="made_this", func=lambda x: datetime.now(UTC)),
|
||||
MigrationAlias(key="notes", alias="recipeNotes"),
|
||||
MigrationAlias(key="orgURL", alias="original_link"),
|
||||
MigrationAlias(key="rating", alias="ratingValue"),
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
from pathlib import Path
|
||||
from shutil import copytree, rmtree
|
||||
from typing import Any
|
||||
@@ -192,7 +192,7 @@ class RecipeService(RecipeServiceBase):
|
||||
recipe_id=new_recipe.id,
|
||||
subject=self.t("recipe.recipe-created"),
|
||||
event_type=TimelineEventType.system,
|
||||
timestamp=new_recipe.created_at or datetime.now(timezone.utc),
|
||||
timestamp=new_recipe.created_at or datetime.now(UTC),
|
||||
)
|
||||
|
||||
self.repos.recipe_timeline_events.create(timeline_event_data)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import asyncio
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from datetime import UTC, datetime, timedelta
|
||||
from pathlib import Path
|
||||
|
||||
from mealie.core import root_logger
|
||||
@@ -28,7 +28,7 @@ class SchedulerService:
|
||||
|
||||
|
||||
async def schedule_daily():
|
||||
now = datetime.now(timezone.utc)
|
||||
now = datetime.now(UTC)
|
||||
daily_schedule_time = get_app_settings().DAILY_SCHEDULE_TIME_UTC
|
||||
logger.debug(f"Current time is {now} and DAILY_SCHEDULE_TIME (in UTC) is {daily_schedule_time}")
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, time, timedelta, timezone
|
||||
from datetime import UTC, datetime, time, timedelta
|
||||
|
||||
from pydantic import UUID4
|
||||
from sqlalchemy.orm import Session
|
||||
@@ -45,7 +45,7 @@ def _create_mealplan_timeline_events_for_household(
|
||||
else:
|
||||
event_subject = f"{user.full_name} made this for {mealplan.entry_type.value}"
|
||||
|
||||
query_start_time = datetime.combine(datetime.now(timezone.utc).date(), time.min)
|
||||
query_start_time = datetime.combine(datetime.now(UTC).date(), time.min)
|
||||
query_end_time = query_start_time + timedelta(days=1)
|
||||
query = PaginationQuery(
|
||||
query_filter=(
|
||||
@@ -116,7 +116,7 @@ def _create_mealplan_timeline_events_for_group(event_time: datetime, session: Se
|
||||
|
||||
|
||||
def create_mealplan_timeline_events() -> None:
|
||||
event_time = datetime.now(timezone.utc)
|
||||
event_time = datetime.now(UTC)
|
||||
|
||||
with session_context() as session:
|
||||
repos = get_repositories(session)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from pydantic import UUID4
|
||||
|
||||
@@ -18,7 +18,7 @@ from mealie.services.event_bus_service.event_types import (
|
||||
EventWebhookData,
|
||||
)
|
||||
|
||||
last_ran = datetime.now(timezone.utc)
|
||||
last_ran = datetime.now(UTC)
|
||||
|
||||
|
||||
def post_group_webhooks(
|
||||
@@ -32,7 +32,7 @@ def post_group_webhooks(
|
||||
start_dt = start_dt or last_ran
|
||||
|
||||
# end the query at the current time
|
||||
last_ran = end_dt = datetime.now(timezone.utc)
|
||||
last_ran = end_dt = datetime.now(UTC)
|
||||
|
||||
if group_id is None:
|
||||
# publish the webhook event to each group's event bus
|
||||
@@ -80,7 +80,7 @@ def post_group_webhooks(
|
||||
|
||||
|
||||
def post_single_webhook(webhook: ReadWebhook, message: str = "") -> None:
|
||||
dt = datetime.min.replace(tzinfo=timezone.utc)
|
||||
dt = datetime.min.replace(tzinfo=UTC)
|
||||
event_type = EventTypes.webhook_task
|
||||
|
||||
event_document_data = EventWebhookData(
|
||||
|
||||
@@ -17,7 +17,7 @@ def purge_group_data_exports(max_minutes_old=ONE_DAY_AS_MINUTES):
|
||||
logger = root_logger.get_logger()
|
||||
|
||||
logger.debug("purging group data exports")
|
||||
limit = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(minutes=max_minutes_old)
|
||||
limit = datetime.datetime.now(datetime.UTC) - datetime.timedelta(minutes=max_minutes_old)
|
||||
|
||||
with session_context() as session:
|
||||
stmt = select(GroupDataExportsModel).filter(cast(GroupDataExportsModel.expires, NaiveDateTime) <= limit)
|
||||
@@ -39,7 +39,7 @@ def purge_excess_files() -> None:
|
||||
directories = get_app_dirs()
|
||||
logger = root_logger.get_logger()
|
||||
|
||||
limit = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(minutes=ONE_DAY_AS_MINUTES * 2)
|
||||
limit = datetime.datetime.now(datetime.UTC) - datetime.timedelta(minutes=ONE_DAY_AS_MINUTES * 2)
|
||||
|
||||
for file in directories.GROUPS_DIR.glob("**/export/*.zip"):
|
||||
# TODO: fix comparison types
|
||||
|
||||
@@ -14,7 +14,7 @@ MAX_DAYS_OLD = 2
|
||||
def purge_password_reset_tokens():
|
||||
"""Purges all events after x days"""
|
||||
logger.debug("purging password reset tokens")
|
||||
limit = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=MAX_DAYS_OLD)
|
||||
limit = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=MAX_DAYS_OLD)
|
||||
|
||||
with session_context() as session:
|
||||
stmt = delete(PasswordResetModel).filter(PasswordResetModel.created_at <= limit)
|
||||
|
||||
@@ -14,7 +14,7 @@ MAX_DAYS_OLD = 4
|
||||
def purge_group_registration():
|
||||
"""Purges all events after x days"""
|
||||
logger.debug("purging expired registration tokens")
|
||||
limit = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=MAX_DAYS_OLD)
|
||||
limit = datetime.datetime.now(datetime.UTC) - datetime.timedelta(days=MAX_DAYS_OLD)
|
||||
|
||||
with session_context() as session:
|
||||
stmt = delete(GroupInviteToken).filter(GroupInviteToken.created_at <= limit)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from datetime import datetime, timezone
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from mealie.repos.repository_factory import AllRepositories
|
||||
from mealie.schema.user.user import PrivateUser
|
||||
@@ -30,7 +30,7 @@ class UserService(BaseService):
|
||||
return unlocked
|
||||
|
||||
def lock_user(self, user: PrivateUser) -> PrivateUser:
|
||||
user.locked_at = datetime.now(timezone.utc)
|
||||
user.locked_at = datetime.now(UTC)
|
||||
return self.repos.users.update(user.id, user)
|
||||
|
||||
def unlock_user(self, user: PrivateUser) -> PrivateUser:
|
||||
|
||||
Reference in New Issue
Block a user