Skip to content

Commit 55b5096

Browse files
Replace delivery_period with delivery_time_filter for flexible time filtering
This change updates the filtering mechanism for gridpool orders and trades to use a more flexible `DeliveryTimeFilter` instead of the restrictive `DeliveryPeriod`. The new filter supports: - Time interval filtering with optional start/end times - Multiple delivery duration filters - More granular control over time-based queries Key changes: - Added `Interval` and `DeliveryTimeFilter` types to support the new filtering API - Replaced `delivery_period` parameter with `delivery_time_filter` across all client methods - Updated CLI to construct `DeliveryTimeFilter` from delivery_start parameter - Migrated tests to use the new filtering types - Updated API imports from v1 to v1alpha8 for common types - Removed dependency on frequenz.client.common.pagination in favor of direct protobuf usage This change maintains backward compatibility by keeping the `delivery_period` parameter in the `create_gridpool_order` method while adding the new `delivery_time_filter` parameter. Signed-off-by: Phillip Wenig <[email protected]>
1 parent f64ff51 commit 55b5096

File tree

6 files changed

+281
-66
lines changed

6 files changed

+281
-66
lines changed

RELEASE_NOTES.md

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,28 @@
22

33
## Summary
44

5-
<!-- Here goes a general summary of what this release is about -->
5+
This release adds enhanced filtering capabilities for gridpool orders and trades, with support for tag-based filtering and more flexible time-based queries.
66

7-
## Upgrading
7+
## New Features
88

9-
<!-- Here goes notes on how to upgrade from previous versions, including deprecations and what they should be replaced with -->
9+
* **Tag filtering for gridpool trades**: The `gridpool_trades()` method now accepts a `tag` parameter to filter trades by tag. The `GridpoolTradeFilter` dataclass has been updated accordingly.
1010

11-
## New Features
11+
* **Flexible time filtering with `DeliveryTimeFilter`**: Replaced the restrictive `delivery_period` parameter with a more flexible `delivery_time_filter` across gridpool orders and trades methods. The new `DeliveryTimeFilter` supports:
12+
- Time interval filtering with optional start/end times
13+
- Multiple delivery duration filters
14+
- More granular control over time-based queries
15+
16+
* **New types for time filtering**: Added `Interval` and `DeliveryTimeFilter` types to support the enhanced filtering API.
1217

1318
* Support tags in CLI create-order command.
1419

15-
## Bug Fixes
20+
## Breaking Changes
21+
22+
* The `delivery_period` parameter has been replaced with `delivery_time_filter` in the following methods:
23+
- `list_gridpool_orders()`
24+
- `stream_gridpool_orders()`
25+
- `gridpool_trades()`
26+
27+
Note: The `create_gridpool_order()` method maintains backward compatibility by keeping both parameters.
1628

17-
<!-- Here goes notable bug fixes that are worth a special mention or explanation -->
29+
* Updated API imports from v1 to v1alpha8 for common types.

src/frequenz/client/electricity_trading/_client.py

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
from zoneinfo import ZoneInfo
1616

1717
import grpc
18-
from frequenz.api.common.v1alpha8.pagination.pagination_params_pb2 import PaginationParams
18+
from frequenz.api.common.v1alpha8.pagination.pagination_params_pb2 import (
19+
PaginationParams,
20+
)
1921

2022
# pylint: disable=no-member
2123
from frequenz.api.electricity_trading.v1 import (
@@ -28,13 +30,13 @@
2830
from frequenz.client.base.client import BaseApiClient
2931
from frequenz.client.base.exception import ClientNotConnected
3032
from frequenz.client.base.streaming import GrpcStreamBroadcaster
31-
from frequenz.client.common.pagination import Params
3233
from google.protobuf import field_mask_pb2, struct_pb2
3334
from google.protobuf.timestamp_pb2 import Timestamp
3435

3536
from ._types import (
3637
DeliveryArea,
3738
DeliveryPeriod,
39+
DeliveryTimeFilter,
3840
GridpoolOrderFilter,
3941
GridpoolTradeFilter,
4042
MarketSide,
@@ -277,7 +279,7 @@ def gridpool_orders_stream(
277279
order_states: list[OrderState] | None = None,
278280
market_side: MarketSide | None = None,
279281
delivery_area: DeliveryArea | None = None,
280-
delivery_period: DeliveryPeriod | None = None,
282+
delivery_time_filter: DeliveryTimeFilter | None = None,
281283
tag: str | None = None,
282284
) -> GrpcStreamBroadcaster[
283285
electricity_trading_pb2.ReceiveGridpoolOrdersStreamResponse, OrderDetail
@@ -290,7 +292,7 @@ def gridpool_orders_stream(
290292
order_states: List of order states to filter for.
291293
market_side: Market side to filter for.
292294
delivery_area: Delivery area to filter for.
293-
delivery_period: Delivery period to filter for.
295+
delivery_time_filter: Delivery time to filter for.
294296
tag: Tag to filter for.
295297
296298
Returns:
@@ -299,13 +301,13 @@ def gridpool_orders_stream(
299301
Raises:
300302
grpc.RpcError: If an error occurs while streaming the orders.
301303
"""
302-
self.validate_params(delivery_period=delivery_period)
304+
self.validate_params(delivery_time_filter=delivery_time_filter)
303305

304306
gridpool_order_filter = GridpoolOrderFilter(
305307
order_states=order_states,
306308
side=market_side,
307309
delivery_area=delivery_area,
308-
delivery_period=delivery_period,
310+
delivery_time_filter=delivery_time_filter,
309311
tag=tag,
310312
)
311313

@@ -341,7 +343,7 @@ def gridpool_trades_stream(
341343
trade_states: list[TradeState] | None = None,
342344
trade_ids: list[int] | None = None,
343345
market_side: MarketSide | None = None,
344-
delivery_period: DeliveryPeriod | None = None,
346+
delivery_time_filter: DeliveryTimeFilter | None = None,
345347
delivery_area: DeliveryArea | None = None,
346348
tag: str | None = None,
347349
) -> GrpcStreamBroadcaster[
@@ -355,7 +357,7 @@ def gridpool_trades_stream(
355357
trade_states: List of trade states to filter for.
356358
trade_ids: List of trade IDs to filter for.
357359
market_side: The market side to filter for.
358-
delivery_period: The delivery period to filter for.
360+
delivery_time_filter: The delivery time to filter for.
359361
delivery_area: The delivery area to filter for.
360362
tag: The tag to filter for.
361363
@@ -365,13 +367,13 @@ def gridpool_trades_stream(
365367
Raises:
366368
grpc.RpcError: If an error occurs while streaming gridpool trades.
367369
"""
368-
self.validate_params(delivery_period=delivery_period)
370+
self.validate_params(delivery_time_filter=delivery_time_filter)
369371

370372
gridpool_trade_filter = GridpoolTradeFilter(
371373
trade_states=trade_states,
372374
trade_ids=trade_ids,
373375
side=market_side,
374-
delivery_period=delivery_period,
376+
delivery_time_filter=delivery_time_filter,
375377
delivery_area=delivery_area,
376378
tag=tag,
377379
)
@@ -410,6 +412,7 @@ def validate_params(
410412
peak_price_delta: Price | None | _NoValue = NO_VALUE,
411413
display_quantity: Power | None | _NoValue = NO_VALUE,
412414
delivery_period: DeliveryPeriod | None = None,
415+
delivery_time_filter: DeliveryTimeFilter | None = None,
413416
valid_until: datetime | None | _NoValue = NO_VALUE,
414417
execution_option: OrderExecutionOption | None | _NoValue = NO_VALUE,
415418
order_type: OrderType | None = None,
@@ -428,6 +431,7 @@ def validate_params(
428431
peak_price_delta: The peak price delta of the order.
429432
display_quantity: The display quantity of the order.
430433
delivery_period: The delivery period of the order.
434+
delivery_time_filter: The delivery time filter of the order.
431435
valid_until: The valid until of the order.
432436
execution_option: The execution option of the order.
433437
order_type: The order type.
@@ -461,6 +465,23 @@ def validate_params(
461465
if delivery_period is not None:
462466
if delivery_period.start < datetime.now(timezone.utc):
463467
raise ValueError("delivery_period must be in the future")
468+
if (
469+
delivery_time_filter is not None
470+
and delivery_time_filter.time_interval is not None
471+
and delivery_time_filter.time_interval.start_time is not None
472+
):
473+
if delivery_time_filter.time_interval.start_time < datetime.now(
474+
timezone.utc
475+
):
476+
raise ValueError("delivery_time_filter must be in the future")
477+
if (
478+
delivery_time_filter.time_interval.end_time is not None
479+
and delivery_time_filter.time_interval.end_time
480+
< delivery_time_filter.time_interval.start_time
481+
):
482+
raise ValueError(
483+
"delivery_time_filter end time must be after start time"
484+
)
464485
if not isinstance(valid_until, _NoValue) and valid_until is not None:
465486
if (
466487
not isinstance(execution_option, _NoValue)
@@ -807,7 +828,7 @@ async def list_gridpool_orders(
807828
*,
808829
order_states: list[OrderState] | None = None,
809830
side: MarketSide | None = None,
810-
delivery_period: DeliveryPeriod | None = None,
831+
delivery_time_filter: DeliveryTimeFilter | None = None,
811832
delivery_area: DeliveryArea | None = None,
812833
tag: str | None = None,
813834
page_size: int | None = None,
@@ -820,7 +841,7 @@ async def list_gridpool_orders(
820841
gridpool_id: The Gridpool to retrieve the orders for.
821842
order_states: List of order states to filter by.
822843
side: The side of the market to filter by.
823-
delivery_period: The delivery period to filter by.
844+
delivery_time_filter: The delivery time filter of the order.
824845
delivery_area: The delivery area to filter by.
825846
tag: The tag to filter by.
826847
page_size: The number of orders to return per page.
@@ -835,7 +856,7 @@ async def list_gridpool_orders(
835856
gridpool_order_filter = GridpoolOrderFilter(
836857
order_states=order_states,
837858
side=side,
838-
delivery_period=delivery_period,
859+
delivery_time_filter=delivery_time_filter,
839860
delivery_area=delivery_area,
840861
tag=tag,
841862
)
@@ -844,7 +865,7 @@ async def list_gridpool_orders(
844865
gridpool_id=gridpool_id,
845866
filter=gridpool_order_filter.to_pb(),
846867
pagination_params=(
847-
Params(page_size=page_size, page_token="").to_proto()
868+
PaginationParams(page_size=page_size, page_token="")
848869
if page_size
849870
else None
850871
),
@@ -884,7 +905,7 @@ async def list_gridpool_trades(
884905
trade_states: list[TradeState] | None = None,
885906
trade_ids: list[int] | None = None,
886907
market_side: MarketSide | None = None,
887-
delivery_period: DeliveryPeriod | None = None,
908+
delivery_time_filter: DeliveryTimeFilter | None = None,
888909
delivery_area: DeliveryArea | None = None,
889910
page_size: int | None = None,
890911
timeout: timedelta | None = None,
@@ -897,7 +918,7 @@ async def list_gridpool_trades(
897918
trade_states: List of trade states to filter by.
898919
trade_ids: List of trade IDs to filter by.
899920
market_side: The side of the market to filter by.
900-
delivery_period: The delivery period to filter by.
921+
delivery_time_filter: The delivery time filter of the order.
901922
delivery_area: The delivery area to filter by.
902923
page_size: The number of trades to return per page.
903924
timeout: Timeout duration, defaults to None.
@@ -912,15 +933,15 @@ async def list_gridpool_trades(
912933
trade_states=trade_states,
913934
trade_ids=trade_ids,
914935
side=market_side,
915-
delivery_period=delivery_period,
936+
delivery_time_filter=delivery_time_filter,
916937
delivery_area=delivery_area,
917938
)
918939

919940
request = electricity_trading_pb2.ListGridpoolTradesRequest(
920941
gridpool_id=gridpool_id,
921942
filter=gridpool_trade_filter.to_pb(),
922943
pagination_params=(
923-
Params(page_size=page_size, page_token="").to_proto()
944+
PaginationParams(page_size=page_size, page_token="")
924945
if page_size
925946
else None
926947
),

0 commit comments

Comments
 (0)