1212FLOATRATES_URL = "https://www.floatrates.com/daily/eur.json"
1313ERAPI_URL = "https://open.er-api.com/v6/latest/EUR"
1414
15+
16+ def ensure_timezone_aware (dt , default_tz = timezone .utc ):
17+ """
18+ Ensure a datetime object is timezone-aware.
19+ If naive, assume it's in the default timezone (UTC by default).
20+ """
21+ if dt .tzinfo is None :
22+ return dt .replace (tzinfo = default_tz )
23+ return dt
24+
25+
1526class CurrencyConverter :
1627 """Currency converter with multi-provider fallback and provider-specific caching."""
1728
@@ -60,7 +71,9 @@ def get_exchange_rates(self, base_currency: str = 'EUR', force_refresh: bool = F
6071 if not force_refresh and primary_provider :
6172 record = ExchangeRate .query .filter_by (date = date .today (), base_currency = base_currency , provider = primary_provider ).first ()
6273 if record :
63- age_min = (datetime .now (timezone .utc ) - record .created_at ).total_seconds () / 60.0
74+ # Handle timezone compatibility - assume database datetime is UTC if naive
75+ record_time = ensure_timezone_aware (record .created_at )
76+ age_min = (datetime .now (timezone .utc ) - record_time ).total_seconds () / 60.0
6477 if age_min <= refresh_minutes :
6578 try :
6679 self .last_provider = primary_provider
@@ -79,7 +92,9 @@ def get_exchange_rates(self, base_currency: str = 'EUR', force_refresh: bool = F
7992 if not force_refresh :
8093 cached = ExchangeRate .query .filter_by (date = date .today (), base_currency = base_currency , provider = provider ).first ()
8194 if cached :
82- age_min = (datetime .now (timezone .utc ) - cached .created_at ).total_seconds () / 60.0
95+ # Handle timezone compatibility - assume database datetime is UTC if naive
96+ cached_time = ensure_timezone_aware (cached .created_at )
97+ age_min = (datetime .now (timezone .utc ) - cached_time ).total_seconds () / 60.0
8398 if age_min <= refresh_minutes :
8499 try :
85100 self .last_provider = provider
0 commit comments