Skip to content

Commit 9383f0c

Browse files
committed
Add sort capability to list adapter.
1 parent 7c9c7f9 commit 9383f0c

File tree

4 files changed

+48
-10
lines changed

4 files changed

+48
-10
lines changed

ieee_2030_5/adapters/__init__.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,14 +249,38 @@ def get_resource_list(self,
249249
list_uri: str,
250250
start: int = 0,
251251
after: int = 0,
252-
limit: int = 0) -> Union[m.List_type, m.SubscribableList]:
252+
limit: int = 0,
253+
sort_by: List[str] = [],
254+
reverse: bool = False) -> Union[m.List_type, m.SubscribableList]:
255+
if isinstance(sort_by, str):
256+
sort_by = [sort_by]
253257
cls = self.get_type(list_uri)
254258
if cls is None:
255259
raise KeyError(f"Resource list {list_uri} not found in adapter")
256260

257261
thelist = eval(f"m.{cls.__name__}List()")
258262
try:
259263
thecontainerlist = list(self._container_dict[list_uri].values())
264+
for sort in sort_by:
265+
subobj = sort.split('.')
266+
if len(subobj) == 2:
267+
try:
268+
thecontainerlist = sorted(
269+
thecontainerlist,
270+
key=lambda o: getattr(getattr(o, subobj[0]), subobj[1]),
271+
reverse=reverse)
272+
except AttributeError:
273+
# happens when value is none
274+
pass
275+
elif len(subobj) == 1:
276+
thecontainerlist = sorted(thecontainerlist,
277+
key=lambda o: getattr(o, sort),
278+
reverse=reverse)
279+
else:
280+
raise ValueError("Can only sort through single nested properties.")
281+
# if "." in sort:
282+
283+
# thecontainerlist = sorted(thecontainerlist, key=sort)
260284
thelist.href = list_uri
261285
thelist.all = len(thecontainerlist)
262286
if start == after == limit == 0:

ieee_2030_5/adapters/adapters.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,32 +89,33 @@ def create_mirror_meter_reading(
8989
location = mr_list_href
9090

9191
# Current instantanious values.
92-
if mmr.Reading is not None:
92+
if mmr_input.Reading is not None:
9393
mmr.Reading.href = hrefs.SEP.join([mmr.href, "r"])
9494
mmr.Reading.href = mmr.Reading.href.replace("mup", "upt")
9595
add_href(mmr.Reading.href, mmr.Reading)
9696
mr.ReadingLink = m.ReadingLink(mmr.Reading.href)
9797

9898
# Mirror reading sets
99-
if mmr.MirrorReadingSet:
99+
if mmr_input.MirrorReadingSet:
100100

101101
mrs_list_href = hrefs.SEP.join([mmr.href, "rs"])
102102
rs_list_href = hrefs.SEP.join([mmr.href, "rs"]).replace("mup", "upt")
103103
mr.ReadingSetListLink = m.ReadingSetListLink(href=rs_list_href)
104104
ListAdapter.initialize_uri(mr.ReadingSetListLink.href, m.ReadingSet)
105105

106-
for mrs in mmr.MirrorReadingSet:
106+
for mrs in mmr_input.MirrorReadingSet:
107+
found_rs = False
107108
try:
108109
mrs_item = ListAdapter.get_by_mrid(mrs_list_href, mrs.mRID)
109110
mrs_item_index = ListAdapter.get_list(mrs_list_href).index(mrs_item)
110-
was_updated = True
111+
found_rs = True
111112
except NotFoundError:
112113
mrs_item = mrs
113114
mrs_item_index = ListAdapter.list_size(mrs_list_href)
114115
mrs_item.href = hrefs.SEP.join([mrs_list_href, str(mrs_item_index)])
115116
ListAdapter.append(mrs_list_href, mrs_item)
116117

117-
if was_updated:
118+
if found_rs:
118119
rs_item = ListAdapter.get(rs_list_href, mrs_item_index)
119120
rs_item.description = mrs_item.description
120121
rs_item.timePeriod = mrs_item.timePeriod

ieee_2030_5/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ class ServerConfiguration:
185185

186186
log_event_list_poll_rate: int = 900
187187
device_capability_poll_rate: int = 900
188-
usage_point_post_rate: int = 300
188+
mirror_usage_point_post_rate: int = 300
189189
end_device_list_poll_rate: int = 86400 # daily check-in
190190

191191
generate_admin_cert: bool = False

ieee_2030_5/server/meteringfs.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,19 @@ def get(self) -> Response:
3939
parsed = hrefs.ParsedUsagePointHref(request.path)
4040

4141
handled = False
42+
sort_by = []
43+
reversed = True
4244

4345
if parsed.has_reading_list():
46+
sort_by = "timePeriod.start"
4447
if handled := parsed.reading_index is not None:
4548
obj = adpt.ListAdapter.get(parsed.last_list(), parsed.reading_index)
4649

4750
elif parsed.has_reading_set_list():
51+
sort_by = "timePeriod.start"
4852
if handled := parsed.reading_set_index is not None:
4953
obj = adpt.ListAdapter.get(parsed.last_list(), parsed.reading_set_index)
54+
obj = sorted(obj, key="timePeriod.start")
5055
elif parsed.has_meter_reading_list():
5156
if handled := parsed.has_reading_type():
5257
obj = get_href(request.path)
@@ -56,13 +61,16 @@ def get(self) -> Response:
5661
obj = adpt.ListAdapter.get_resource_list(request.path,
5762
start=start,
5863
limit=limit,
59-
after=after)
64+
after=after,
65+
reverse=reversed)
6066

6167
if not handled:
6268
obj = adpt.ListAdapter.get_resource_list(request.path,
6369
start=start,
6470
limit=limit,
65-
after=after)
71+
after=after,
72+
sort_by=sort_by,
73+
reverse=reversed)
6674
# # /upt
6775
# if not parsed.has_usage_point_index():
6876
# obj = adpt.UsagePointAdapter.fetch_all(m.UsagePointList(request.path),
@@ -99,7 +107,10 @@ def get(self) -> Response:
99107

100108
if not mup_href.has_usage_point_index():
101109
# /mup
102-
mup = adpt.ListAdapter.get_resource_list(request.path)
110+
mup: m.MirrorUsagePointList = adpt.ListAdapter.get_resource_list(request.path)
111+
# Because our resource_list doesn't include other properties than the list we set
112+
# them here before returning.
113+
mup.pollRate = self.server_config.mirror_usage_point_post_rate
103114
else:
104115
# /mup_0
105116
mup = adpt.ListAdapter.get(hrefs.DEFAULT_MUP_ROOT, mup_href.usage_point_index)
@@ -121,6 +132,8 @@ def post(self) -> Response:
121132

122133
# Creating a new mup
123134
if data_type == m.MirrorUsagePoint:
135+
if data.postRate is None:
136+
data.postRate = self.server_config.mirror_usage_point_post_rate
124137
result = adpt.create_mirror_usage_point(mup=data)
125138
#result = adpt.MirrorUsagePointAdapter.create(mup=data)
126139
else:

0 commit comments

Comments
 (0)