Skip to content

Commit 897dd66

Browse files
Ken LippoldKen Lippold
authored andcommitted
Updated observations endpoint for testing
1 parent 6693019 commit 897dd66

File tree

7 files changed

+79
-16
lines changed

7 files changed

+79
-16
lines changed

etl/services/hydroshare_archival.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,5 @@ def run(self, user: Optional[User], uid: uuid.UUID, make_public=False):
295295
"thing_id": str(uid),
296296
"link": str(thing_archive.settings["link"]),
297297
"path": thing_archive.settings["path"],
298-
"datastreamIds": thing_archive.settings[
299-
"datastreamIds"
300-
],
298+
"datastreamIds": thing_archive.settings["datastreamIds"],
301299
}

hydroserver/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
"max_size": config("DB_POOL_MAX_SIZE", default=10, cast=int),
141141
"timeout": config("DB_POOL_TIMEOUT", default=60, cast=int),
142142
},
143-
**dj_database_config.get("OPTIONS", {})
143+
**dj_database_config.get("OPTIONS", {}),
144144
},
145145
}
146146
}

sta/models/observation.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def escape_pg_copy(value):
9696
) as copy:
9797
buffer = io.StringIO()
9898
for i in range(0, len(observations), batch_size):
99-
batch = observations[i: i + batch_size]
99+
batch = observations[i : i + batch_size]
100100
buffer.write(
101101
"\n".join(
102102
"\t".join(
@@ -152,6 +152,4 @@ def get_user_permissions(
152152
return user_permissions
153153

154154
class Meta:
155-
indexes = [
156-
models.Index(fields=["id"])
157-
]
155+
indexes = [models.Index(fields=["id"])]

sta/schemas/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,9 @@
1818
)
1919
from .sensor import SensorGetResponse, SensorPostBody, SensorPatchBody
2020
from .unit import UnitGetResponse, UnitPostBody, UnitPatchBody
21-
from .datastream import DatastreamGetResponse, DatastreamPostBody, DatastreamPatchBody
21+
from .datastream import (
22+
DatastreamGetResponse,
23+
DatastreamPostBody,
24+
DatastreamPatchBody,
25+
ObservationsGetResponse,
26+
)

sta/schemas/datastream.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ class DatastreamPostBody(BasePostBody, DatastreamFields):
4848

4949
class DatastreamPatchBody(BasePatchBody, DatastreamFields):
5050
pass
51+
52+
53+
class ObservationsGetResponse(BaseGetResponse):
54+
phenomenon_time: list
55+
result: list

sta/services/datastream.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import uuid
22
from typing import Optional, Literal
33
from ninja.errors import HttpError
4+
from datetime import datetime
45
from django.contrib.auth import get_user_model
56
from django.utils import timezone
67
from django.http import StreamingHttpResponse
@@ -358,7 +359,43 @@ def get_csv(self, user: User, uid: uuid.UUID):
358359

359360
return response
360361

361-
def list_observations(self, user: User, uid: uuid.UUID, ):
362+
def list_observations(
363+
self,
364+
user: User,
365+
uid: uuid.UUID,
366+
phenomenon_start_time: Optional[datetime] = None,
367+
phenomenon_end_time: Optional[datetime] = None,
368+
page: int = 1,
369+
page_size: Optional[int] = None,
370+
order: Literal["asc", "desc"] = "desc",
371+
):
362372
datastream = self.get_datastream_for_action(user=user, uid=uid, action="view")
363373

364-
return Observation.objects.filter(datastream=datastream).values_list("phenomenon_time", "result")
374+
fields = ["phenomenon_time", "result"]
375+
376+
queryset = Observation.objects.filter(datastream=datastream)
377+
ordering = "phenomenon_time" if order == "asc" else "-phenomenon_time"
378+
379+
if phenomenon_start_time:
380+
queryset = queryset.filter(phenomenon_time__gte=phenomenon_start_time)
381+
if phenomenon_end_time:
382+
queryset = queryset.filter(phenomenon_time__lte=phenomenon_end_time)
383+
384+
queryset = queryset.order_by(ordering)
385+
386+
if page_size is not None:
387+
page = max(1, page)
388+
page_size = max(0, page_size)
389+
start = (page - 1) * page_size
390+
end = start + page_size
391+
392+
queryset = queryset[start:end]
393+
394+
observations = list(queryset.values_list(*fields))
395+
396+
if observations:
397+
response = dict(zip(fields, zip(*observations)))
398+
else:
399+
response = {field: [] for field in fields}
400+
401+
return response

sta/views/datastream.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import uuid
22
from ninja import Router, Path
3-
from typing import Optional
3+
from typing import Optional, Literal
4+
from datetime import datetime
45
from django.db import transaction
56
from hydroserver.security import bearer_auth, session_auth, anonymous_auth
67
from hydroserver.http import HydroServerHttpRequest
7-
from sta.schemas import DatastreamGetResponse, DatastreamPostBody, DatastreamPatchBody
8+
from sta.schemas import (
9+
DatastreamGetResponse,
10+
DatastreamPostBody,
11+
DatastreamPatchBody,
12+
ObservationsGetResponse,
13+
)
814
from sta.services import DatastreamService
915

1016
datastream_router = Router(tags=["Datastreams"])
@@ -142,13 +148,27 @@ def get_datastream_csv(request: HydroServerHttpRequest, datastream_id: Path[uuid
142148
@datastream_router.get(
143149
"/{datastream_id}/observations",
144150
auth=[session_auth, bearer_auth, anonymous_auth],
145-
response={200: list[list], 403: str, 404: str},
151+
response={200: ObservationsGetResponse, 403: str, 404: str},
146152
)
147-
def get_datastream_observations(request: HydroServerHttpRequest, datastream_id: Path[uuid.UUID]):
153+
def get_datastream_observations(
154+
request: HydroServerHttpRequest,
155+
datastream_id: Path[uuid.UUID],
156+
phenomenon_start_time: Optional[datetime] = None,
157+
phenomenon_end_time: Optional[datetime] = None,
158+
page: int = 1,
159+
page_size: Optional[int] = None,
160+
order: Literal["asc", "desc"] = "desc",
161+
):
148162
"""
149163
Get Datastream Observations
150164
"""
151165

152166
return datastream_service.list_observations(
153-
user=request.authenticated_user, uid=datastream_id
167+
user=request.authenticated_user,
168+
uid=datastream_id,
169+
phenomenon_start_time=phenomenon_start_time,
170+
phenomenon_end_time=phenomenon_end_time,
171+
page=page,
172+
page_size=page_size,
173+
order=order,
154174
)

0 commit comments

Comments
 (0)