From 64be4bb556da2210032e35baf8e05f5ce39a72e8 Mon Sep 17 00:00:00 2001 From: Damian Szumski Date: Tue, 2 Jun 2026 09:39:04 +0200 Subject: [PATCH] fix: timezone handler --- examples/basic_usage.py | 2 +- src/fr24sdk/resources/flight_summary.py | 6 +++++- tests/unit/test_flight_summary.py | 24 +++++++++++++++++------- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/examples/basic_usage.py b/examples/basic_usage.py index 51a2cca..0c2927e 100644 --- a/examples/basic_usage.py +++ b/examples/basic_usage.py @@ -32,7 +32,7 @@ def main() -> None: flight_summary = client.flight_summary.get_light(flights=["KL1316"], flight_datetime_from=datetime(2025, 5, 13, 12, 0, 0), flight_datetime_to=datetime(2025, 5, 14, 17, 10, 0)) if flight_summary.data: print(flight_summary.data[0].fr24_id) - print(client.flight_summary.get_full(operating_as=["FDX"],flight_datetime_from=datetime(2026, 1, 15, 15, 0, 0),flight_datetime_to=datetime(2026, 1, 15, 15, 5, 0),categories=[FlightCategory.CARGO])) + print(client.flight_summary.get_full(operating_as=["FDX"],flight_datetime_from=datetime(2026, 1, 15, 15, 0, 0, tzinfo=timezone.utc),flight_datetime_to=datetime(2026, 1, 15, 15, 5, 0),categories=[FlightCategory.CARGO])) print(client.live.flight_positions.get_light(flights=["SK2752"])) print(client.live.flight_positions.get_light(bounds=Boundary(north=55.6, south=55.5, west=12.5, east=12.6))) print(client.live.flight_positions.get_full(bounds="55.6,55.5,12.5,12.6")) diff --git a/src/fr24sdk/resources/flight_summary.py b/src/fr24sdk/resources/flight_summary.py index bbfb96a..992a26c 100644 --- a/src/fr24sdk/resources/flight_summary.py +++ b/src/fr24sdk/resources/flight_summary.py @@ -5,7 +5,7 @@ import warnings from typing import Optional, Any, Annotated, Union -from datetime import datetime +from datetime import datetime, timezone from pydantic import BaseModel, model_serializer, StringConstraints, Field from ..transport import HttpTransport @@ -69,6 +69,10 @@ def _to_query_dict(self) -> dict[str, Any]: continue if isinstance(value, list): query[key] = ",".join(map(str, value)) + elif isinstance(value, datetime): + if value.tzinfo is not None and value.utcoffset() is not None: + value = value.astimezone(timezone.utc).replace(tzinfo=None) + query[key] = str(value) else: query[key] = str(value) return query diff --git a/tests/unit/test_flight_summary.py b/tests/unit/test_flight_summary.py index 74f6909..3b847a8 100644 --- a/tests/unit/test_flight_summary.py +++ b/tests/unit/test_flight_summary.py @@ -3,9 +3,10 @@ # SPDX-License-Identifier: MIT """Unit tests for the flight_summary module.""" -import pytest from unittest.mock import Mock, MagicMock -from datetime import datetime, timezone +from datetime import datetime, timedelta, timezone + +import pytest from fr24sdk.resources.flight_summary import FlightSummaryResource, _FlightSummaryParams from fr24sdk.models.flight import ( @@ -40,7 +41,9 @@ class TestFlightSummaryParams: def test_serialize_params(self): """Test parameters are correctly serialized for API requests.""" # Test with various parameter types - test_datetime = datetime(2023, 1, 1, 12, 0, 0, tzinfo=timezone.utc) + test_datetime = datetime( + 2023, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=2)) + ) params = _FlightSummaryParams( flight_datetime_from=test_datetime, flight_datetime_to=test_datetime, @@ -52,8 +55,12 @@ def test_serialize_params(self): serialized = params._to_query_dict() # Check serialization results - assert serialized["flight_datetime_from"] == str(test_datetime) - assert serialized["flight_datetime_to"] == str(test_datetime) + assert serialized["flight_datetime_from"] == str( + test_datetime.astimezone(timezone.utc).replace(tzinfo=None) + ) + assert serialized["flight_datetime_to"] == str( + test_datetime.astimezone(timezone.utc).replace(tzinfo=None) + ) assert serialized["flights"] == "BA1234,LH5678" assert serialized["callsigns"] == "BAW123" assert serialized["aircraft"] == "B738,A320" @@ -145,8 +152,9 @@ def test_get_light_success_with_datetime_range( mock_transport.request.return_value = mock_response # Call with datetime parameters - from_dt = datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc) - to_dt = datetime(2023, 1, 1, 23, 59, 59, tzinfo=timezone.utc) + offset = timezone(timedelta(hours=2)) + from_dt = datetime(2023, 1, 1, 0, 0, 0, tzinfo=offset) + to_dt = datetime(2023, 1, 1, 23, 59, 59, tzinfo=offset) result = flight_summary.get_light( flight_datetime_from=from_dt, flight_datetime_to=to_dt, airports=["EGLL"] @@ -159,6 +167,8 @@ def test_get_light_success_with_datetime_range( args, kwargs = mock_transport.request.call_args assert "flight_datetime_from" in kwargs["params"] assert "flight_datetime_to" in kwargs["params"] + assert kwargs["params"]["flight_datetime_from"] == "2022-12-31 22:00:00" + assert kwargs["params"]["flight_datetime_to"] == "2023-01-01 21:59:59" assert kwargs["params"]["airports"] == "EGLL" def test_get_full_success(self, flight_summary, mock_transport):