Skip to content

Commit 29ed2fa

Browse files
Enhance filtering capabilities (#204)
* **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. * **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: - Time interval filtering with optional start/end times - Multiple delivery duration filters - More granular control over time-based queries * **New types for time filtering**: Added `Interval` and `DeliveryTimeFilter` types to support the enhanced filtering API.
2 parents fd04aa9 + 5913665 commit 29ed2fa

File tree

7 files changed

+297
-68
lines changed

7 files changed

+297
-68
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.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ dependencies = [
4141
"click >= 8.1.8, < 9",
4242
# Stick to a version without a polluting `tests` package: https://github.com/EnergieID/entsoe-py/pull/447
4343
"entsoe-py >= 0.6.16, < 0.7.1",
44-
"frequenz-api-common >= 0.6.5, < 0.9.0",
44+
"frequenz-api-common >= 0.8.1, < 0.9.0",
4545
"grpcio >= 1.72.1, < 2",
4646
"frequenz-channels >= 1.6.1, < 2",
4747
"frequenz-client-base >= 0.11.0, < 0.12.0",
4848
"frequenz-client-common >= 0.1.0, < 0.4.0",
49-
"frequenz-api-electricity-trading >= 0.8.0, < 0.9.0",
49+
"frequenz-api-electricity-trading >= 0.9.0, < 0.10.0",
5050
"protobuf >= 6.31.1, < 8", # Do not widen beyond 8!
5151
]
5252
dynamic = ["version"]

src/frequenz/client/electricity_trading/_client.py

Lines changed: 42 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.v1.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,8 +343,9 @@ 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,
348+
tag: str | None = None,
346349
) -> GrpcStreamBroadcaster[
347350
electricity_trading_pb2.ReceiveGridpoolTradesStreamResponse, Trade
348351
]:
@@ -354,23 +357,25 @@ def gridpool_trades_stream(
354357
trade_states: List of trade states to filter for.
355358
trade_ids: List of trade IDs to filter for.
356359
market_side: The market side to filter for.
357-
delivery_period: The delivery period to filter for.
360+
delivery_time_filter: The delivery time filter of the trade.
358361
delivery_area: The delivery area to filter for.
362+
tag: The tag to filter for.
359363
360364
Returns:
361365
The gridpool trades streamer.
362366
363367
Raises:
364368
grpc.RpcError: If an error occurs while streaming gridpool trades.
365369
"""
366-
self.validate_params(delivery_period=delivery_period)
370+
self.validate_params(delivery_time_filter=delivery_time_filter)
367371

368372
gridpool_trade_filter = GridpoolTradeFilter(
369373
trade_states=trade_states,
370374
trade_ids=trade_ids,
371375
side=market_side,
372-
delivery_period=delivery_period,
376+
delivery_time_filter=delivery_time_filter,
373377
delivery_area=delivery_area,
378+
tag=tag,
374379
)
375380

376381
stream_key = (gridpool_id, gridpool_trade_filter)
@@ -407,6 +412,7 @@ def validate_params(
407412
peak_price_delta: Price | None | _NoValue = NO_VALUE,
408413
display_quantity: Power | None | _NoValue = NO_VALUE,
409414
delivery_period: DeliveryPeriod | None = None,
415+
delivery_time_filter: DeliveryTimeFilter | None = None,
410416
valid_until: datetime | None | _NoValue = NO_VALUE,
411417
execution_option: OrderExecutionOption | None | _NoValue = NO_VALUE,
412418
order_type: OrderType | None = None,
@@ -425,6 +431,7 @@ def validate_params(
425431
peak_price_delta: The peak price delta of the order.
426432
display_quantity: The display quantity of the order.
427433
delivery_period: The delivery period of the order.
434+
delivery_time_filter: The delivery time filter of the order.
428435
valid_until: The valid until of the order.
429436
execution_option: The execution option of the order.
430437
order_type: The order type.
@@ -458,6 +465,23 @@ def validate_params(
458465
if delivery_period is not None:
459466
if delivery_period.start < datetime.now(timezone.utc):
460467
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+
)
461485
if not isinstance(valid_until, _NoValue) and valid_until is not None:
462486
if (
463487
not isinstance(execution_option, _NoValue)
@@ -804,7 +828,7 @@ async def list_gridpool_orders(
804828
*,
805829
order_states: list[OrderState] | None = None,
806830
side: MarketSide | None = None,
807-
delivery_period: DeliveryPeriod | None = None,
831+
delivery_time_filter: DeliveryTimeFilter | None = None,
808832
delivery_area: DeliveryArea | None = None,
809833
tag: str | None = None,
810834
page_size: int | None = None,
@@ -817,7 +841,7 @@ async def list_gridpool_orders(
817841
gridpool_id: The Gridpool to retrieve the orders for.
818842
order_states: List of order states to filter by.
819843
side: The side of the market to filter by.
820-
delivery_period: The delivery period to filter by.
844+
delivery_time_filter: The delivery time filter of the order.
821845
delivery_area: The delivery area to filter by.
822846
tag: The tag to filter by.
823847
page_size: The number of orders to return per page.
@@ -832,7 +856,7 @@ async def list_gridpool_orders(
832856
gridpool_order_filter = GridpoolOrderFilter(
833857
order_states=order_states,
834858
side=side,
835-
delivery_period=delivery_period,
859+
delivery_time_filter=delivery_time_filter,
836860
delivery_area=delivery_area,
837861
tag=tag,
838862
)
@@ -841,7 +865,7 @@ async def list_gridpool_orders(
841865
gridpool_id=gridpool_id,
842866
filter=gridpool_order_filter.to_pb(),
843867
pagination_params=(
844-
Params(page_size=page_size, page_token="").to_proto()
868+
PaginationParams(page_size=page_size, page_token="")
845869
if page_size
846870
else None
847871
),
@@ -881,7 +905,7 @@ async def list_gridpool_trades(
881905
trade_states: list[TradeState] | None = None,
882906
trade_ids: list[int] | None = None,
883907
market_side: MarketSide | None = None,
884-
delivery_period: DeliveryPeriod | None = None,
908+
delivery_time_filter: DeliveryTimeFilter | None = None,
885909
delivery_area: DeliveryArea | None = None,
886910
page_size: int | None = None,
887911
timeout: timedelta | None = None,
@@ -894,7 +918,7 @@ async def list_gridpool_trades(
894918
trade_states: List of trade states to filter by.
895919
trade_ids: List of trade IDs to filter by.
896920
market_side: The side of the market to filter by.
897-
delivery_period: The delivery period to filter by.
921+
delivery_time_filter: The delivery time filter of the order.
898922
delivery_area: The delivery area to filter by.
899923
page_size: The number of trades to return per page.
900924
timeout: Timeout duration, defaults to None.
@@ -909,15 +933,15 @@ async def list_gridpool_trades(
909933
trade_states=trade_states,
910934
trade_ids=trade_ids,
911935
side=market_side,
912-
delivery_period=delivery_period,
936+
delivery_time_filter=delivery_time_filter,
913937
delivery_area=delivery_area,
914938
)
915939

916940
request = electricity_trading_pb2.ListGridpoolTradesRequest(
917941
gridpool_id=gridpool_id,
918942
filter=gridpool_trade_filter.to_pb(),
919943
pagination_params=(
920-
Params(page_size=page_size, page_token="").to_proto()
944+
PaginationParams(page_size=page_size, page_token="")
921945
if page_size
922946
else None
923947
),

0 commit comments

Comments
 (0)