Skip to content

Commit 474db3c

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 ccb3e9a commit 474db3c

File tree

6 files changed

+273
-66
lines changed

6 files changed

+273
-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: 31 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,15 @@ 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 delivery_time_filter is not None:
469+
if (
470+
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")
464477
if not isinstance(valid_until, _NoValue) and valid_until is not None:
465478
if (
466479
not isinstance(execution_option, _NoValue)
@@ -807,7 +820,7 @@ async def list_gridpool_orders(
807820
*,
808821
order_states: list[OrderState] | None = None,
809822
side: MarketSide | None = None,
810-
delivery_period: DeliveryPeriod | None = None,
823+
delivery_time_filter: DeliveryTimeFilter | None = None,
811824
delivery_area: DeliveryArea | None = None,
812825
tag: str | None = None,
813826
page_size: int | None = None,
@@ -820,7 +833,7 @@ async def list_gridpool_orders(
820833
gridpool_id: The Gridpool to retrieve the orders for.
821834
order_states: List of order states to filter by.
822835
side: The side of the market to filter by.
823-
delivery_period: The delivery period to filter by.
836+
delivery_time_filter: The delivery time to filter by.
824837
delivery_area: The delivery area to filter by.
825838
tag: The tag to filter by.
826839
page_size: The number of orders to return per page.
@@ -835,7 +848,7 @@ async def list_gridpool_orders(
835848
gridpool_order_filter = GridpoolOrderFilter(
836849
order_states=order_states,
837850
side=side,
838-
delivery_period=delivery_period,
851+
delivery_time_filter=delivery_time_filter,
839852
delivery_area=delivery_area,
840853
tag=tag,
841854
)
@@ -844,7 +857,7 @@ async def list_gridpool_orders(
844857
gridpool_id=gridpool_id,
845858
filter=gridpool_order_filter.to_pb(),
846859
pagination_params=(
847-
Params(page_size=page_size, page_token="").to_proto()
860+
PaginationParams(page_size=page_size, page_token="")
848861
if page_size
849862
else None
850863
),
@@ -884,7 +897,7 @@ async def list_gridpool_trades(
884897
trade_states: list[TradeState] | None = None,
885898
trade_ids: list[int] | None = None,
886899
market_side: MarketSide | None = None,
887-
delivery_period: DeliveryPeriod | None = None,
900+
delivery_time_filter: DeliveryTimeFilter | None = None,
888901
delivery_area: DeliveryArea | None = None,
889902
page_size: int | None = None,
890903
timeout: timedelta | None = None,
@@ -897,7 +910,7 @@ async def list_gridpool_trades(
897910
trade_states: List of trade states to filter by.
898911
trade_ids: List of trade IDs to filter by.
899912
market_side: The side of the market to filter by.
900-
delivery_period: The delivery period to filter by.
913+
delivery_time_filter: The delivery time to filter by.
901914
delivery_area: The delivery area to filter by.
902915
page_size: The number of trades to return per page.
903916
timeout: Timeout duration, defaults to None.
@@ -912,15 +925,15 @@ async def list_gridpool_trades(
912925
trade_states=trade_states,
913926
trade_ids=trade_ids,
914927
side=market_side,
915-
delivery_period=delivery_period,
928+
delivery_time_filter=delivery_time_filter,
916929
delivery_area=delivery_area,
917930
)
918931

919932
request = electricity_trading_pb2.ListGridpoolTradesRequest(
920933
gridpool_id=gridpool_id,
921934
filter=gridpool_trade_filter.to_pb(),
922935
pagination_params=(
923-
Params(page_size=page_size, page_token="").to_proto()
936+
PaginationParams(page_size=page_size, page_token="")
924937
if page_size
925938
else None
926939
),

0 commit comments

Comments
 (0)