Skip to content

Commit 66ce395

Browse files
philogicaeMHHukiewitz
authored andcommitted
Fix msgTypes + Add sort_by/sort_order args to MessageFilter/PostFilter
1 parent b6c3714 commit 66ce395

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/aleph/sdk/query/filters.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
from datetime import datetime
22
from typing import Dict, Iterable, Optional, Union
3-
43
from aleph_message.models import MessageType
4+
from ..utils import _date_field_to_timestamp, serialize_list, enum_as_str
5+
from enum import Enum, IntEnum
6+
7+
8+
class SortBy(str, Enum):
9+
"""Supported SortBy types"""
10+
11+
TIME = "time"
12+
TX_TIME = "tx-time"
13+
14+
15+
class SortOrder(str, Enum):
16+
"""Supported SortOrder types"""
517

6-
from ..utils import _date_field_to_timestamp, serialize_list
18+
ASCENDING = "1"
19+
DESCENDING = "-1"
720

821

922
class MessageFilter:
@@ -20,6 +33,8 @@ class MessageFilter:
2033
:param chains: Filter by sender address chain
2134
:param start_date: Earliest date to fetch messages from
2235
:param end_date: Latest date to fetch messages from
36+
:param sort_by: Sort by time or tx-time
37+
:param sort_order: Sort by ascending or descending order
2338
"""
2439

2540
message_types: Optional[Iterable[MessageType]]
@@ -33,6 +48,8 @@ class MessageFilter:
3348
chains: Optional[Iterable[str]]
3449
start_date: Optional[Union[datetime, float]]
3550
end_date: Optional[Union[datetime, float]]
51+
sort_by: Optional[SortBy]
52+
sort_order: Optional[SortOrder]
3653

3754
def __init__(
3855
self,
@@ -47,6 +64,8 @@ def __init__(
4764
chains: Optional[Iterable[str]] = None,
4865
start_date: Optional[Union[datetime, float]] = None,
4966
end_date: Optional[Union[datetime, float]] = None,
67+
sort_by: Optional[SortBy] = None,
68+
sort_order: Optional[SortOrder] = None,
5069
):
5170
self.message_types = message_types
5271
self.content_types = content_types
@@ -59,14 +78,16 @@ def __init__(
5978
self.chains = chains
6079
self.start_date = start_date
6180
self.end_date = end_date
81+
self.sort_by = sort_by
82+
self.sort_order = sort_order
6283

6384
def as_http_params(self) -> Dict[str, str]:
6485
"""Convert the filters into a dict that can be used by an `aiohttp` client
6586
as `params` to build the HTTP query string.
6687
"""
6788

6889
partial_result = {
69-
"msgType": serialize_list(
90+
"msgTypes": serialize_list(
7091
[type.value for type in self.message_types]
7192
if self.message_types
7293
else None
@@ -81,6 +102,8 @@ def as_http_params(self) -> Dict[str, str]:
81102
"chains": serialize_list(self.chains),
82103
"startDate": _date_field_to_timestamp(self.start_date),
83104
"endDate": _date_field_to_timestamp(self.end_date),
105+
"sortBy": enum_as_str(self.sort_by),
106+
"sortOrder": enum_as_str(self.sort_order),
84107
}
85108

86109
# Ensure all values are strings.
@@ -110,6 +133,8 @@ class PostFilter:
110133
chains: Optional[Iterable[str]]
111134
start_date: Optional[Union[datetime, float]]
112135
end_date: Optional[Union[datetime, float]]
136+
sort_by: Optional[SortBy]
137+
sort_order: Optional[SortOrder]
113138

114139
def __init__(
115140
self,
@@ -122,6 +147,8 @@ def __init__(
122147
chains: Optional[Iterable[str]] = None,
123148
start_date: Optional[Union[datetime, float]] = None,
124149
end_date: Optional[Union[datetime, float]] = None,
150+
sort_by: Optional[SortBy] = None,
151+
sort_order: Optional[SortOrder] = None,
125152
):
126153
self.types = types
127154
self.refs = refs
@@ -132,6 +159,8 @@ def __init__(
132159
self.chains = chains
133160
self.start_date = start_date
134161
self.end_date = end_date
162+
self.sort_by = sort_by
163+
self.sort_order = sort_order
135164

136165
def as_http_params(self) -> Dict[str, str]:
137166
"""Convert the filters into a dict that can be used by an `aiohttp` client
@@ -148,6 +177,8 @@ def as_http_params(self) -> Dict[str, str]:
148177
"chains": serialize_list(self.chains),
149178
"startDate": _date_field_to_timestamp(self.start_date),
150179
"endDate": _date_field_to_timestamp(self.end_date),
180+
"sortBy": enum_as_str(self.sort_by),
181+
"sortOrder": enum_as_str(self.sort_order),
151182
}
152183

153184
# Ensure all values are strings.

src/aleph/sdk/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,14 @@ async def copy_async_readable_to_buffer(
115115
buffer.write(chunk)
116116

117117

118-
def enum_as_str(obj: Union[str, Enum]) -> str:
118+
def enum_as_str(obj: Optional[Union[str, Enum]]) -> Optional[str]:
119119
"""Returns the value of an Enum, or the string itself when passing a string.
120120
121121
Python 3.11 adds a new formatting of string enums.
122122
`str(MyEnum.value)` becomes `MyEnum.value` instead of `value`.
123123
"""
124+
if obj is None:
125+
return None
124126
if not isinstance(obj, str):
125127
raise TypeError(f"Unsupported enum type: {type(obj)}")
126128

0 commit comments

Comments
 (0)