diff --git a/backend/app/api/routes/canvas.py b/backend/app/api/routes/canvas.py index 2d4f143..4e841f6 100644 --- a/backend/app/api/routes/canvas.py +++ b/backend/app/api/routes/canvas.py @@ -1,4 +1,4 @@ -from datetime import UTC, datetime +from datetime import datetime, timezone from typing import Any from fastapi import APIRouter, Depends @@ -71,7 +71,7 @@ async def save_canvas( state = await db.get(CanvasState, 1) if state: state.viewport = body.viewport - state.saved_at = datetime.now(UTC) + state.saved_at = datetime.now(timezone.utc) else: db.add(CanvasState(id=1, viewport=body.viewport)) diff --git a/backend/app/core/scheduler.py b/backend/app/core/scheduler.py index 40b41c4..91ba1df 100644 --- a/backend/app/core/scheduler.py +++ b/backend/app/core/scheduler.py @@ -1,6 +1,6 @@ """APScheduler setup for background scan and status check jobs.""" import logging -from datetime import UTC, datetime +from datetime import datetime, timezone from apscheduler.schedulers.asyncio import AsyncIOScheduler from sqlalchemy import select @@ -33,12 +33,12 @@ async def _run_status_checks() -> None: if n: n.status = check_result["status"] n.response_time_ms = check_result["response_time_ms"] - n.last_seen = datetime.now(UTC) if check_result["status"] == "online" else n.last_seen + n.last_seen = datetime.now(timezone.utc) if check_result["status"] == "online" else n.last_seen await db.commit() await broadcast_status( node_id=node.id, status=check_result["status"], - checked_at=datetime.now(UTC).isoformat(), + checked_at=datetime.now(timezone.utc).isoformat(), response_time_ms=check_result["response_time_ms"], ) except Exception as exc: diff --git a/backend/app/core/security.py b/backend/app/core/security.py index fba4b9b..1cf7c04 100644 --- a/backend/app/core/security.py +++ b/backend/app/core/security.py @@ -1,4 +1,4 @@ -from datetime import UTC, datetime, timedelta +from datetime import datetime, timedelta, timezone from jose import JWTError, jwt from passlib.context import CryptContext @@ -17,7 +17,7 @@ def hash_password(password: str) -> str: def create_access_token(subject: str) -> str: - expire = datetime.now(UTC) + timedelta(minutes=settings.access_token_expire_minutes) + expire = datetime.now(timezone.utc) + timedelta(minutes=settings.access_token_expire_minutes) payload = {"sub": subject, "exp": expire} return str(jwt.encode(payload, settings.secret_key, algorithm=settings.algorithm)) diff --git a/backend/app/db/models.py b/backend/app/db/models.py index a095ab0..8c749ac 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -1,5 +1,5 @@ import uuid -from datetime import UTC, datetime +from datetime import datetime, timezone from typing import Any from sqlalchemy import JSON, Boolean, DateTime, Float, ForeignKey, Integer, String, Text @@ -9,7 +9,7 @@ from app.db.database import Base def _now() -> datetime: - return datetime.now(UTC) + return datetime.now(timezone.utc) def _uuid() -> str: diff --git a/backend/app/services/scanner.py b/backend/app/services/scanner.py index 1f24a50..5d0d00c 100644 --- a/backend/app/services/scanner.py +++ b/backend/app/services/scanner.py @@ -2,7 +2,7 @@ import asyncio import logging import socket -from datetime import UTC, datetime +from datetime import datetime, timezone from typing import Any from sqlalchemy.ext.asyncio import AsyncSession @@ -159,7 +159,7 @@ async def run_scan(ranges: list[str], db: AsyncSession, run_id: str) -> None: if run: run.status = "done" run.devices_found = devices_found - run.finished_at = datetime.now(UTC) + run.finished_at = datetime.now(timezone.utc) await db.commit() except Exception as exc: @@ -168,5 +168,5 @@ async def run_scan(ranges: list[str], db: AsyncSession, run_id: str) -> None: if run: run.status = "error" run.error = str(exc) - run.finished_at = datetime.now(UTC) + run.finished_at = datetime.now(timezone.utc) await db.commit() diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 6d7c62e..3b785ca 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,5 +1,5 @@ [tool.ruff] -target-version = "py313" +target-version = "py310" line-length = 120 exclude = ["migrations", ".venv"] @@ -11,7 +11,7 @@ ignore = ["B008"] "tests/**" = ["E501"] [tool.mypy] -python_version = "3.13" +python_version = "3.10" strict = true ignore_missing_imports = true exclude = ["migrations", ".venv"]