diff --git a/app/currency.py b/app/currency.py index 5dfb5d7..d964899 100644 --- a/app/currency.py +++ b/app/currency.py @@ -1,7 +1,7 @@ import requests import json import os -from datetime import datetime, date +from datetime import datetime, date, timezone from flask import current_app import xml.etree.ElementTree as ET from decimal import Decimal, getcontext, InvalidOperation @@ -60,7 +60,7 @@ def get_exchange_rates(self, base_currency: str = 'EUR', force_refresh: bool = F if not force_refresh and primary_provider: record = ExchangeRate.query.filter_by(date=date.today(), base_currency=base_currency, provider=primary_provider).first() if record: - age_min = (datetime.utcnow() - record.created_at).total_seconds() / 60.0 + age_min = (datetime.now(timezone.utc) - record.created_at).total_seconds() / 60.0 if age_min <= refresh_minutes: try: self.last_provider = primary_provider @@ -79,7 +79,7 @@ def get_exchange_rates(self, base_currency: str = 'EUR', force_refresh: bool = F if not force_refresh: cached = ExchangeRate.query.filter_by(date=date.today(), base_currency=base_currency, provider=provider).first() if cached: - age_min = (datetime.utcnow() - cached.created_at).total_seconds() / 60.0 + age_min = (datetime.now(timezone.utc) - cached.created_at).total_seconds() / 60.0 if age_min <= refresh_minutes: try: self.last_provider = provider diff --git a/app/models.py b/app/models.py index 60e3d17..c5a16a3 100644 --- a/app/models.py +++ b/app/models.py @@ -1,4 +1,4 @@ -from datetime import datetime, date +from datetime import datetime, date, timezone from flask_login import UserMixin from werkzeug.security import generate_password_hash, check_password_hash from app import db, login_manager @@ -62,7 +62,7 @@ class Webhook(db.Model): custom_headers = db.Column(db.Text) # JSON string for custom headers is_active = db.Column(db.Boolean, default=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) - created_at = db.Column(db.DateTime, default=datetime.utcnow) + created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) last_used = db.Column(db.DateTime) # Relationship @@ -106,7 +106,7 @@ class ExchangeRate(db.Model): base_currency = db.Column(db.String(3), nullable=False, default='EUR') provider = db.Column(db.String(40), nullable=False, default='legacy') # data source identifier rates_json = db.Column(db.Text, nullable=False) # JSON string of exchange rates - created_at = db.Column(db.DateTime, default=datetime.utcnow) + created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) __table_args__ = ( db.UniqueConstraint('date', 'base_currency', 'provider', name='uq_rate_date_base_provider'), @@ -136,7 +136,7 @@ def save_rates(cls, rates, base_currency='EUR', provider='unknown'): existing_rate = cls.query.filter_by(date=today, base_currency=base_currency, provider=provider).first() if existing_rate: existing_rate.rates_json = json.dumps(rates) - existing_rate.created_at = datetime.utcnow() + existing_rate.created_at = datetime.now(timezone.utc) else: new_rate = cls( date=today, @@ -154,7 +154,7 @@ class PaymentMethod(db.Model): last_four = db.Column(db.String(4), nullable=True) notes = db.Column(db.Text, nullable=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) - created_at = db.Column(db.DateTime, default=datetime.utcnow) + created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc)) # Relationship back to user user = db.relationship('User', backref=db.backref('payment_methods', lazy=True)) diff --git a/app/webhooks.py b/app/webhooks.py index c125c49..3aabbc2 100644 --- a/app/webhooks.py +++ b/app/webhooks.py @@ -15,7 +15,7 @@ import requests import json import logging -from datetime import datetime +from datetime import datetime, timezone from typing import Dict, List, Optional, Any from flask import current_app @@ -58,7 +58,7 @@ def send(self, message: str, title: str = None, color: str = None) -> Dict[str, response.raise_for_status() # Update last_used timestamp - self.webhook.last_used = datetime.utcnow() + self.webhook.last_used = datetime.now(timezone.utc) from app import db db.session.commit() @@ -111,7 +111,7 @@ def prepare_payload(self, message: str, title: str = None, color: str = None) -> embed = { "description": message, - "timestamp": datetime.utcnow().isoformat(), + "timestamp": datetime.now(timezone.utc).isoformat(), "footer": { "text": "Subscription Tracker" } @@ -151,7 +151,7 @@ def prepare_payload(self, message: str, title: str = None, color: str = None) -> attachment = { "text": message, - "ts": int(datetime.utcnow().timestamp()), + "ts": int(datetime.now(timezone.utc).timestamp()), "footer": "Subscription Tracker" } @@ -239,7 +239,7 @@ class GenericWebhookSender(WebhookSender): def prepare_payload(self, message: str, title: str = None, color: str = None) -> Dict[str, Any]: payload = { "text": message, - "timestamp": datetime.utcnow().isoformat() + "timestamp": datetime.now(timezone.utc).isoformat() } if title: