From ee96ba53115eab3cae5ff96b291afc5104b99ce6 Mon Sep 17 00:00:00 2001 From: TEC Date: Sun, 28 Sep 2025 00:44:19 +0800 Subject: [PATCH] Update deprecated utcnow() usage DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). --- backend/auth_routes.py | 14 +++++++------- backend/auth_utils.py | 6 +++--- backend/notifications.py | 6 +++--- backend/oidc_handler.py | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backend/auth_routes.py b/backend/auth_routes.py index 6d54b73..b5d2916 100644 --- a/backend/auth_routes.py +++ b/backend/auth_routes.py @@ -1,7 +1,7 @@ # backend/auth_routes.py # Updated: 2025-01-24 - Fixed API endpoints for notifications from flask import Blueprint, request, jsonify, current_app -from datetime import datetime, timedelta +from datetime import datetime, UTC, timedelta import uuid import smtplib from email.mime.multipart import MIMEMultipart @@ -117,13 +117,13 @@ def register(): token = generate_token(user_id) # Update last login - cur.execute('UPDATE users SET last_login = %s WHERE id = %s', (datetime.utcnow(), user_id)) + cur.execute('UPDATE users SET last_login = %s WHERE id = %s', (datetime.now(UTC), user_id)) # Store session info ip_address = request.remote_addr user_agent = request.headers.get('User-Agent', '') session_token = str(uuid.uuid4()) - expires_at = datetime.utcnow() + current_app.config['JWT_EXPIRATION_DELTA'] + expires_at = datetime.now(UTC) + current_app.config['JWT_EXPIRATION_DELTA'] cur.execute( 'INSERT INTO user_sessions (user_id, session_token, expires_at, ip_address, user_agent, login_method) VALUES (%s, %s, %s, %s, %s, %s)', @@ -182,13 +182,13 @@ def login(): token = generate_token(user_id) # Update last login - cur.execute('UPDATE users SET last_login = %s WHERE id = %s', (datetime.utcnow(), user_id)) + cur.execute('UPDATE users SET last_login = %s WHERE id = %s', (datetime.now(UTC), user_id)) # Store session info ip_address = request.remote_addr user_agent = request.headers.get('User-Agent', '') session_token = str(uuid.uuid4()) - expires_at = datetime.utcnow() + current_app.config['JWT_EXPIRATION_DELTA'] + expires_at = datetime.now(UTC) + current_app.config['JWT_EXPIRATION_DELTA'] cur.execute( 'INSERT INTO user_sessions (user_id, session_token, expires_at, ip_address, user_agent, login_method) VALUES (%s, %s, %s, %s, %s, %s)', @@ -347,7 +347,7 @@ def request_password_reset(): # Generate reset token reset_token = str(uuid.uuid4()) - expires_at = datetime.utcnow() + timedelta(hours=24) + expires_at = datetime.now(UTC) + timedelta(hours=24) # Delete any existing tokens for this user cur.execute('DELETE FROM password_reset_tokens WHERE user_id = %s', (user_id,)) @@ -656,7 +656,7 @@ def reset_password(): cur.execute('SELECT user_id, expires_at FROM password_reset_tokens WHERE token = %s', (token,)) token_info = cur.fetchone() - if not token_info or token_info[1] < datetime.utcnow(): + if not token_info or token_info[1] < datetime.now(UTC): return jsonify({'message': 'Invalid or expired token!'}), 400 user_id = token_info[0] diff --git a/backend/auth_utils.py b/backend/auth_utils.py index 421bc4c..af9be13 100644 --- a/backend/auth_utils.py +++ b/backend/auth_utils.py @@ -1,6 +1,6 @@ # backend/auth_utils.py import jwt -from datetime import datetime, timedelta +from datetime import datetime, UTC, timedelta from flask import current_app, request, jsonify from functools import wraps import re @@ -14,8 +14,8 @@ except ImportError: def generate_token(user_id): """Generate a JWT token for the user""" payload = { - 'exp': datetime.utcnow() + current_app.config['JWT_EXPIRATION_DELTA'], - 'iat': datetime.utcnow(), + 'exp': datetime.now(UTC) + current_app.config['JWT_EXPIRATION_DELTA'], + 'iat': datetime.now(UTC), 'sub': str(user_id) } return jwt.encode(payload, current_app.config['SECRET_KEY'], algorithm='HS256') diff --git a/backend/notifications.py b/backend/notifications.py index 5a72648..e45eef6 100644 --- a/backend/notifications.py +++ b/backend/notifications.py @@ -12,7 +12,7 @@ import time import atexit import smtplib import logging -from datetime import datetime, date, timedelta +from datetime import datetime, date, UTC, timedelta from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from threading import Lock @@ -353,7 +353,7 @@ def process_email_notifications(all_warranties, eligible_user_ids, is_manual, ge server.login(smtp_username, smtp_password) emails_sent = 0 - utc_now = datetime.utcnow() + utc_now = datetime.now(UTC) timestamp = int(utc_now.timestamp()) for email, user_data in users_warranties.items(): @@ -535,7 +535,7 @@ def send_expiration_notifications(manual_trigger=False, get_db_connection=None, if not manual_trigger: with conn.cursor() as cur: - utc_now = datetime.utcnow() + utc_now = datetime.now(UTC) # Check if required columns exist for dynamic query building cur.execute(""" diff --git a/backend/oidc_handler.py b/backend/oidc_handler.py index 26f6c24..6dc9efd 100644 --- a/backend/oidc_handler.py +++ b/backend/oidc_handler.py @@ -1,7 +1,7 @@ # backend/oidc_handler.py import os import uuid -from datetime import datetime # Ensure timedelta is imported if used, though not in this snippet +from datetime import datetime, UTC # Ensure timedelta is imported if used, though not in this snippet from flask import Blueprint, jsonify, redirect, url_for, current_app, request, session # Import shared extensions and utilities @@ -193,14 +193,14 @@ def oidc_callback_route(): app_session_token = generate_token(user_id) # Generate app-specific JWT # Update last login timestamp - cur.execute('UPDATE users SET last_login = %s WHERE id = %s', (datetime.utcnow(), user_id)) + cur.execute('UPDATE users SET last_login = %s WHERE id = %s', (datetime.now(UTC), user_id)) # Log OIDC session in user_sessions table ip_address = request.remote_addr user_agent = request.headers.get('User-Agent', '') # Use a different UUID for session_token in DB if needed, or re-use app_session_token if appropriate for your session model db_session_token = str(uuid.uuid4()) - expires_at = datetime.utcnow() + current_app.config['JWT_EXPIRATION_DELTA'] + expires_at = datetime.now(UTC) + current_app.config['JWT_EXPIRATION_DELTA'] cur.execute( 'INSERT INTO user_sessions (user_id, session_token, expires_at, ip_address, user_agent, login_method) VALUES (%s, %s, %s, %s, %s, %s)',