plexus-python-pulse-demeter 1.1.126__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plexus/pulse/demeter/__init__.py +6 -0
- plexus/pulse/demeter/app/__init__.py +0 -0
- plexus/pulse/demeter/app/api/__init__.py +44 -0
- plexus/pulse/demeter/app/api/archive_internal_endpoints.py +316 -0
- plexus/pulse/demeter/app/api/archive_public_endpoints.py +255 -0
- plexus/pulse/demeter/app/api/dataset_internal_endpoints.py +1043 -0
- plexus/pulse/demeter/app/api/dataset_public_endpoints.py +2161 -0
- plexus/pulse/demeter/app/api/dataset_workflow_endpoints.py +532 -0
- plexus/pulse/demeter/app/api/tagging_endpoints.py +323 -0
- plexus/pulse/demeter/app/api/user_endpoints.py +78 -0
- plexus/pulse/demeter/app/core/__init__.py +0 -0
- plexus/pulse/demeter/app/core/database.py +43 -0
- plexus/pulse/demeter/app/core/vault.py +29 -0
- plexus/pulse/demeter/app/main.py +16 -0
- plexus/pulse/demeter/app/models/__init__.py +33 -0
- plexus/pulse/demeter/app/models/local.py +249 -0
- plexus/pulse/demeter/app/models/registry/__init__.py +112 -0
- plexus/pulse/demeter/app/models/registry/archive.py +529 -0
- plexus/pulse/demeter/app/models/registry/dataset.py +1531 -0
- plexus/pulse/demeter/app/models/registry/tagging.py +478 -0
- plexus/pulse/demeter/app/models/registry/user.py +79 -0
- plexus/pulse/demeter/tools/__init__.py +0 -0
- plexus/pulse/demeter/tools/main.py +306 -0
- plexus/pulse/demeter/utils/__init__.py +0 -0
- plexus/pulse/demeter/utils/config.py +25 -0
- plexus/pulse/demeter/utils/datautils.py +436 -0
- plexus_python_pulse_demeter-1.1.126.dist-info/METADATA +36 -0
- plexus_python_pulse_demeter-1.1.126.dist-info/RECORD +31 -0
- plexus_python_pulse_demeter-1.1.126.dist-info/WHEEL +5 -0
- plexus_python_pulse_demeter-1.1.126.dist-info/entry_points.txt +2 -0
- plexus_python_pulse_demeter-1.1.126.dist-info/top_level.txt +1 -0
|
File without changes
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
from collections.abc import Generator
|
|
3
|
+
|
|
4
|
+
from fastapi import FastAPI
|
|
5
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
6
|
+
from plexus.common.utils.dtutils import dt_utc_now
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"current_dt_clock",
|
|
10
|
+
"make_api"
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def current_dt_clock() -> Generator[datetime.datetime, None, None]:
|
|
15
|
+
yield dt_utc_now()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def make_api() -> FastAPI:
|
|
19
|
+
from plexus.pulse.demeter.app.api.dataset_internal_endpoints import router as dataset_internal_router
|
|
20
|
+
from plexus.pulse.demeter.app.api.dataset_public_endpoints import router as dataset_public_router
|
|
21
|
+
from plexus.pulse.demeter.app.api.dataset_workflow_endpoints import router as dataset_workflow_router
|
|
22
|
+
from plexus.pulse.demeter.app.api.archive_internal_endpoints import router as archive_internal_router
|
|
23
|
+
from plexus.pulse.demeter.app.api.archive_public_endpoints import router as archive_public_router
|
|
24
|
+
from plexus.pulse.demeter.app.api.tagging_endpoints import router as tagging_router
|
|
25
|
+
from plexus.pulse.demeter.app.api.user_endpoints import router as user_router
|
|
26
|
+
|
|
27
|
+
api = FastAPI(title="Pulse Demeter API", description="API for Pulse Demeter")
|
|
28
|
+
api.add_middleware(
|
|
29
|
+
CORSMiddleware,
|
|
30
|
+
allow_origins=["*"],
|
|
31
|
+
allow_credentials=True,
|
|
32
|
+
allow_methods=["*"],
|
|
33
|
+
allow_headers=["*"],
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
api.include_router(dataset_internal_router)
|
|
37
|
+
api.include_router(dataset_public_router)
|
|
38
|
+
api.include_router(dataset_workflow_router)
|
|
39
|
+
api.include_router(archive_internal_router)
|
|
40
|
+
api.include_router(archive_public_router)
|
|
41
|
+
api.include_router(tagging_router)
|
|
42
|
+
api.include_router(user_router)
|
|
43
|
+
|
|
44
|
+
return api
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
|
|
3
|
+
import sqlalchemy.orm as sa_orm
|
|
4
|
+
from fastapi import APIRouter, Depends
|
|
5
|
+
from fastapi.params import Query
|
|
6
|
+
from plexus.common.utils.dtutils import dt_utc_now
|
|
7
|
+
from plexus.pulse.common.utils.apiutils import managed_db_session
|
|
8
|
+
from plexus.pulse.common.utils.ormutils import (
|
|
9
|
+
db_create_revision_model,
|
|
10
|
+
db_create_revision_models,
|
|
11
|
+
db_expire_revision_model,
|
|
12
|
+
db_read_active_revision_model_of_record,
|
|
13
|
+
db_read_active_revision_models,
|
|
14
|
+
db_update_revision_model,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from plexus.pulse.demeter.app.core.database import make_session
|
|
18
|
+
from plexus.pulse.demeter.app.models.registry.archive import (
|
|
19
|
+
RegisteredBag as Bag,
|
|
20
|
+
RegisteredBagTable as BagTable,
|
|
21
|
+
Sensor,
|
|
22
|
+
SensorTable,
|
|
23
|
+
SensorTemplate,
|
|
24
|
+
SensorTemplateTable,
|
|
25
|
+
Vehicle,
|
|
26
|
+
VehicleTable,
|
|
27
|
+
VehicleTemplate,
|
|
28
|
+
VehicleTemplateTable,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
router = APIRouter(prefix="/pulse_demeter/archive_internal", tags=["archive_internal"])
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@router.post("/vehicle_template/", response_model=VehicleTemplateTable)
|
|
35
|
+
def create_vehicle_template(
|
|
36
|
+
vehicle_template: VehicleTemplate,
|
|
37
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
38
|
+
db: sa_orm.Session = Depends(make_session),
|
|
39
|
+
) -> VehicleTemplateTable:
|
|
40
|
+
with managed_db_session(db):
|
|
41
|
+
return db_create_revision_model(db, VehicleTemplateTable, vehicle_template, created_at)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@router.post("/vehicle_templates/", response_model=list[VehicleTemplateTable])
|
|
45
|
+
def create_vehicle_templates(
|
|
46
|
+
vehicle_templates: list[VehicleTemplate],
|
|
47
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
48
|
+
db: sa_orm.Session = Depends(make_session),
|
|
49
|
+
) -> list[VehicleTemplateTable]:
|
|
50
|
+
with managed_db_session(db):
|
|
51
|
+
return db_create_revision_models(db, VehicleTemplateTable, vehicle_templates, created_at)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@router.get("/vehicle_template/{record_sqn}", response_model=VehicleTemplateTable)
|
|
55
|
+
def read_vehicle_template(record_sqn: int, db: sa_orm.Session = Depends(make_session)) -> VehicleTemplateTable:
|
|
56
|
+
with managed_db_session(db):
|
|
57
|
+
return db_read_active_revision_model_of_record(db, VehicleTemplateTable, record_sqn)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@router.get("/vehicle_templates/", response_model=list[VehicleTemplateTable])
|
|
61
|
+
def read_vehicle_templates(
|
|
62
|
+
skip: int = Query(0),
|
|
63
|
+
limit: int = Query(100),
|
|
64
|
+
db: sa_orm.Session = Depends(make_session),
|
|
65
|
+
) -> list[VehicleTemplateTable]:
|
|
66
|
+
with managed_db_session(db):
|
|
67
|
+
return db_read_active_revision_models(db, VehicleTemplateTable, skip, limit)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@router.put("/vehicle_template/{record_sqn}", response_model=VehicleTemplateTable)
|
|
71
|
+
def update_vehicle_template(
|
|
72
|
+
record_sqn: int,
|
|
73
|
+
vehicle_template: VehicleTemplate,
|
|
74
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
75
|
+
db: sa_orm.Session = Depends(make_session),
|
|
76
|
+
) -> VehicleTemplateTable:
|
|
77
|
+
with managed_db_session(db):
|
|
78
|
+
return db_update_revision_model(db, VehicleTemplateTable, vehicle_template, record_sqn, updated_at)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@router.delete("/vehicle_template/{record_sqn}", response_model=VehicleTemplateTable)
|
|
82
|
+
def delete_vehicle_template(
|
|
83
|
+
record_sqn: int,
|
|
84
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
85
|
+
db: sa_orm.Session = Depends(make_session),
|
|
86
|
+
) -> VehicleTemplateTable:
|
|
87
|
+
with managed_db_session(db):
|
|
88
|
+
return db_expire_revision_model(db, VehicleTemplateTable, record_sqn, updated_at)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@router.post("/sensor_template/", response_model=SensorTemplateTable)
|
|
92
|
+
def create_sensor_template(
|
|
93
|
+
sensor_template: SensorTemplate,
|
|
94
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
95
|
+
db: sa_orm.Session = Depends(make_session),
|
|
96
|
+
) -> SensorTemplateTable:
|
|
97
|
+
with managed_db_session(db):
|
|
98
|
+
return db_create_revision_model(db, SensorTemplateTable, sensor_template, created_at)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@router.post("/sensor_templates/", response_model=list[SensorTemplateTable])
|
|
102
|
+
def create_sensor_templates(
|
|
103
|
+
sensor_templates: list[SensorTemplate],
|
|
104
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
105
|
+
db: sa_orm.Session = Depends(make_session),
|
|
106
|
+
) -> list[SensorTemplateTable]:
|
|
107
|
+
with managed_db_session(db):
|
|
108
|
+
return db_create_revision_models(db, SensorTemplateTable, sensor_templates, created_at)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@router.get("/sensor_template/{record_sqn}", response_model=SensorTemplateTable)
|
|
112
|
+
def read_sensor_template(record_sqn: int, db: sa_orm.Session = Depends(make_session)) -> SensorTemplateTable:
|
|
113
|
+
with managed_db_session(db):
|
|
114
|
+
return db_read_active_revision_model_of_record(db, SensorTemplateTable, record_sqn)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@router.get("/sensor_templates/", response_model=list[SensorTemplateTable])
|
|
118
|
+
def read_sensor_templates(
|
|
119
|
+
skip: int = Query(0),
|
|
120
|
+
limit: int = Query(100),
|
|
121
|
+
db: sa_orm.Session = Depends(make_session),
|
|
122
|
+
) -> list[SensorTemplateTable]:
|
|
123
|
+
with managed_db_session(db):
|
|
124
|
+
return db_read_active_revision_models(db, SensorTemplateTable, skip, limit)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@router.put("/sensor_template/{record_sqn}", response_model=SensorTemplateTable)
|
|
128
|
+
def update_sensor_template(
|
|
129
|
+
record_sqn: int,
|
|
130
|
+
sensor_template: SensorTemplate,
|
|
131
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
132
|
+
db: sa_orm.Session = Depends(make_session),
|
|
133
|
+
) -> SensorTemplateTable:
|
|
134
|
+
with managed_db_session(db):
|
|
135
|
+
return db_update_revision_model(db, SensorTemplateTable, sensor_template, record_sqn, updated_at)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@router.delete("/sensor_template/{record_sqn}", response_model=SensorTemplateTable)
|
|
139
|
+
def delete_sensor_template(
|
|
140
|
+
record_sqn: int,
|
|
141
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
142
|
+
db: sa_orm.Session = Depends(make_session),
|
|
143
|
+
) -> SensorTemplateTable:
|
|
144
|
+
with managed_db_session(db):
|
|
145
|
+
return db_expire_revision_model(db, SensorTemplateTable, record_sqn, updated_at)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@router.post("/vehicle/", response_model=VehicleTable)
|
|
149
|
+
def create_vehicle(
|
|
150
|
+
vehicle: Vehicle,
|
|
151
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
152
|
+
db: sa_orm.Session = Depends(make_session),
|
|
153
|
+
) -> VehicleTable:
|
|
154
|
+
with managed_db_session(db):
|
|
155
|
+
return db_create_revision_model(db, VehicleTable, vehicle, created_at)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@router.post("/vehicles/", response_model=list[VehicleTable])
|
|
159
|
+
def create_vehicles(
|
|
160
|
+
vehicles: list[Vehicle],
|
|
161
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
162
|
+
db: sa_orm.Session = Depends(make_session),
|
|
163
|
+
) -> list[VehicleTable]:
|
|
164
|
+
with managed_db_session(db):
|
|
165
|
+
return db_create_revision_models(db, VehicleTable, vehicles, created_at)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@router.get("/vehicle/{record_sqn}", response_model=VehicleTable)
|
|
169
|
+
def read_vehicle(record_sqn: int, db: sa_orm.Session = Depends(make_session)) -> VehicleTable:
|
|
170
|
+
with managed_db_session(db):
|
|
171
|
+
return db_read_active_revision_model_of_record(db, VehicleTable, record_sqn)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@router.get("/vehicles/", response_model=list[VehicleTable])
|
|
175
|
+
def read_vehicles(
|
|
176
|
+
skip: int = Query(0),
|
|
177
|
+
limit: int = Query(100),
|
|
178
|
+
db: sa_orm.Session = Depends(make_session),
|
|
179
|
+
) -> list[VehicleTable]:
|
|
180
|
+
with managed_db_session(db):
|
|
181
|
+
return db_read_active_revision_models(db, VehicleTable, skip, limit)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
@router.put("/vehicle/{record_sqn}", response_model=VehicleTable)
|
|
185
|
+
def update_vehicle(
|
|
186
|
+
record_sqn: int,
|
|
187
|
+
vehicle: Vehicle,
|
|
188
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
189
|
+
db: sa_orm.Session = Depends(make_session),
|
|
190
|
+
) -> VehicleTable:
|
|
191
|
+
with managed_db_session(db):
|
|
192
|
+
return db_update_revision_model(db, VehicleTable, vehicle, record_sqn, updated_at)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@router.delete("/vehicle/{record_sqn}", response_model=VehicleTable)
|
|
196
|
+
def delete_vehicle(
|
|
197
|
+
record_sqn: int,
|
|
198
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
199
|
+
db: sa_orm.Session = Depends(make_session),
|
|
200
|
+
) -> VehicleTable:
|
|
201
|
+
with managed_db_session(db):
|
|
202
|
+
return db_expire_revision_model(db, VehicleTable, record_sqn, updated_at)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@router.post("/sensor/", response_model=SensorTable)
|
|
206
|
+
def create_sensor(
|
|
207
|
+
sensor: Sensor,
|
|
208
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
209
|
+
db: sa_orm.Session = Depends(make_session),
|
|
210
|
+
) -> SensorTable:
|
|
211
|
+
with managed_db_session(db):
|
|
212
|
+
return db_create_revision_model(db, SensorTable, sensor, created_at)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@router.post("/sensors/", response_model=list[SensorTable])
|
|
216
|
+
def create_sensors(
|
|
217
|
+
sensors: list[Sensor],
|
|
218
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
219
|
+
db: sa_orm.Session = Depends(make_session),
|
|
220
|
+
) -> list[SensorTable]:
|
|
221
|
+
with managed_db_session(db):
|
|
222
|
+
return db_create_revision_models(db, SensorTable, sensors, created_at)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@router.get("/sensor/{record_sqn}", response_model=SensorTable)
|
|
226
|
+
def read_sensor(record_sqn: int, db: sa_orm.Session = Depends(make_session)) -> SensorTable:
|
|
227
|
+
with managed_db_session(db):
|
|
228
|
+
return db_read_active_revision_model_of_record(db, SensorTable, record_sqn)
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
@router.get("/sensors/", response_model=list[SensorTable])
|
|
232
|
+
def read_sensors(
|
|
233
|
+
skip: int = Query(0),
|
|
234
|
+
limit: int = Query(100),
|
|
235
|
+
db: sa_orm.Session = Depends(make_session),
|
|
236
|
+
) -> list[SensorTable]:
|
|
237
|
+
with managed_db_session(db):
|
|
238
|
+
return db_read_active_revision_models(db, SensorTable, skip, limit)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
@router.put("/sensor/{record_sqn}", response_model=SensorTable)
|
|
242
|
+
def update_sensor(
|
|
243
|
+
record_sqn: int,
|
|
244
|
+
sensor: Sensor,
|
|
245
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
246
|
+
db: sa_orm.Session = Depends(make_session),
|
|
247
|
+
) -> SensorTable:
|
|
248
|
+
with managed_db_session(db):
|
|
249
|
+
return db_update_revision_model(db, SensorTable, sensor, record_sqn, updated_at)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@router.delete("/sensor/{record_sqn}", response_model=SensorTable)
|
|
253
|
+
def delete_sensor(
|
|
254
|
+
record_sqn: int,
|
|
255
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
256
|
+
db: sa_orm.Session = Depends(make_session),
|
|
257
|
+
) -> SensorTable:
|
|
258
|
+
with managed_db_session(db):
|
|
259
|
+
return db_expire_revision_model(db, SensorTable, record_sqn, updated_at)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
@router.post("/bag/", response_model=BagTable)
|
|
263
|
+
def create_bag(
|
|
264
|
+
bag: Bag,
|
|
265
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
266
|
+
db: sa_orm.Session = Depends(make_session),
|
|
267
|
+
) -> BagTable:
|
|
268
|
+
with managed_db_session(db):
|
|
269
|
+
return db_create_revision_model(db, BagTable, bag, created_at)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
@router.post("/bags/", response_model=list[BagTable])
|
|
273
|
+
def create_bags(
|
|
274
|
+
bags: list[Bag],
|
|
275
|
+
created_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
276
|
+
db: sa_orm.Session = Depends(make_session),
|
|
277
|
+
) -> list[BagTable]:
|
|
278
|
+
with managed_db_session(db):
|
|
279
|
+
return db_create_revision_models(db, BagTable, bags, created_at)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
@router.get("/bag/{record_sqn}", response_model=BagTable)
|
|
283
|
+
def read_bag(record_sqn: int, db: sa_orm.Session = Depends(make_session)) -> BagTable:
|
|
284
|
+
with managed_db_session(db):
|
|
285
|
+
return db_read_active_revision_model_of_record(db, BagTable, record_sqn)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
@router.get("/bags/", response_model=list[BagTable])
|
|
289
|
+
def read_bags(
|
|
290
|
+
skip: int = Query(0),
|
|
291
|
+
limit: int = Query(100),
|
|
292
|
+
db: sa_orm.Session = Depends(make_session),
|
|
293
|
+
) -> list[BagTable]:
|
|
294
|
+
with managed_db_session(db):
|
|
295
|
+
return db_read_active_revision_models(db, BagTable, skip, limit)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
@router.put("/bag/{record_sqn}", response_model=BagTable)
|
|
299
|
+
def update_bag(
|
|
300
|
+
record_sqn: int,
|
|
301
|
+
bag: Bag,
|
|
302
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
303
|
+
db: sa_orm.Session = Depends(make_session),
|
|
304
|
+
) -> BagTable:
|
|
305
|
+
with managed_db_session(db):
|
|
306
|
+
return db_update_revision_model(db, BagTable, bag, record_sqn, updated_at)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
@router.delete("/bag/{record_sqn}", response_model=BagTable)
|
|
310
|
+
def delete_bag(
|
|
311
|
+
record_sqn: int,
|
|
312
|
+
updated_at: datetime.datetime = Query(default_factory=dt_utc_now),
|
|
313
|
+
db: sa_orm.Session = Depends(make_session),
|
|
314
|
+
) -> BagTable:
|
|
315
|
+
with managed_db_session(db):
|
|
316
|
+
return db_expire_revision_model(db, BagTable, record_sqn, updated_at)
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
|
|
3
|
+
import pydantic as pdt
|
|
4
|
+
import sqlalchemy as sa
|
|
5
|
+
import sqlalchemy.exc as sa_exc
|
|
6
|
+
import sqlalchemy.orm as sa_orm
|
|
7
|
+
from fastapi import APIRouter, Body, Depends, Query
|
|
8
|
+
from plexus.pulse.common.utils.apiutils import managed_db_session
|
|
9
|
+
from plexus.pulse.common.utils.ormutils import model_name_of
|
|
10
|
+
from plexus.pulse.common.utils.sqlutils import escape_sql_like
|
|
11
|
+
|
|
12
|
+
from plexus.pulse.demeter.app.api import current_dt_clock
|
|
13
|
+
from plexus.pulse.demeter.app.api.archive_internal_endpoints import (
|
|
14
|
+
create_bag,
|
|
15
|
+
create_sensor,
|
|
16
|
+
create_vehicle,
|
|
17
|
+
update_bag,
|
|
18
|
+
update_sensor,
|
|
19
|
+
update_vehicle,
|
|
20
|
+
)
|
|
21
|
+
from plexus.pulse.demeter.app.core.database import make_session
|
|
22
|
+
from plexus.pulse.demeter.app.models import Pagination
|
|
23
|
+
from plexus.pulse.demeter.app.models.registry.archive import (
|
|
24
|
+
RegisteredBag as Bag,
|
|
25
|
+
RegisteredBagTable as BagTable,
|
|
26
|
+
Sensor,
|
|
27
|
+
SensorTable,
|
|
28
|
+
Vehicle,
|
|
29
|
+
VehicleTable,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
router = APIRouter(prefix="/pulse_demeter/archive_public", tags=["archive_public"])
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@router.post("/create_or_update_sensor/", response_model=SensorTable)
|
|
36
|
+
def create_or_update_sensor(
|
|
37
|
+
sensor: Sensor = Body(),
|
|
38
|
+
current_dt: datetime.datetime = Depends(current_dt_clock),
|
|
39
|
+
db: sa_orm.Session = Depends(make_session),
|
|
40
|
+
) -> SensorTable:
|
|
41
|
+
with managed_db_session(db):
|
|
42
|
+
db_sensor = (
|
|
43
|
+
db
|
|
44
|
+
.query(SensorTable)
|
|
45
|
+
.where(SensorTable.expired_at.is_(None),
|
|
46
|
+
SensorTable.uuid == sensor.uuid,
|
|
47
|
+
SensorTable.serial_number == sensor.serial_number)
|
|
48
|
+
.one_or_none()
|
|
49
|
+
)
|
|
50
|
+
if db_sensor is None:
|
|
51
|
+
return create_sensor(sensor, current_dt, db)
|
|
52
|
+
else:
|
|
53
|
+
return update_sensor(db_sensor.record_sqn, sensor, current_dt, db)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@router.post("/create_or_update_vehicle/", response_model=VehicleTable)
|
|
57
|
+
def create_or_update_vehicle(
|
|
58
|
+
vehicle: Vehicle = Body(),
|
|
59
|
+
current_dt: datetime.datetime = Depends(current_dt_clock),
|
|
60
|
+
db: sa_orm.Session = Depends(make_session),
|
|
61
|
+
) -> VehicleTable:
|
|
62
|
+
with managed_db_session(db):
|
|
63
|
+
db_vehicle = (
|
|
64
|
+
db
|
|
65
|
+
.query(VehicleTable)
|
|
66
|
+
.where(VehicleTable.expired_at.is_(None),
|
|
67
|
+
VehicleTable.vin_code == vehicle.vin_code,
|
|
68
|
+
VehicleTable.name == vehicle.name)
|
|
69
|
+
.one_or_none()
|
|
70
|
+
)
|
|
71
|
+
if db_vehicle is None:
|
|
72
|
+
return create_vehicle(vehicle, current_dt, db)
|
|
73
|
+
else:
|
|
74
|
+
return update_vehicle(db_vehicle.record_sqn, vehicle, current_dt, db)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@router.post("/create_or_update_bag/", response_model=BagTable)
|
|
78
|
+
def create_or_update_bag(
|
|
79
|
+
bag: Bag = Body(),
|
|
80
|
+
current_dt: datetime.datetime = Depends(current_dt_clock),
|
|
81
|
+
db: sa_orm.Session = Depends(make_session),
|
|
82
|
+
) -> BagTable:
|
|
83
|
+
with managed_db_session(db):
|
|
84
|
+
db_bag = (
|
|
85
|
+
db
|
|
86
|
+
.query(BagTable)
|
|
87
|
+
.where(BagTable.expired_at.is_(None),
|
|
88
|
+
BagTable.name == bag.name)
|
|
89
|
+
.one_or_none()
|
|
90
|
+
)
|
|
91
|
+
if db_bag is None:
|
|
92
|
+
return create_bag(bag, current_dt, db)
|
|
93
|
+
else:
|
|
94
|
+
return update_bag(db_bag.record_sqn, bag, current_dt, db)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class VehicleTablesAndPagination(pdt.BaseModel):
|
|
98
|
+
vehicles: list[VehicleTable]
|
|
99
|
+
pagination: Pagination
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@router.get("/query_vehicles/", response_model=VehicleTablesAndPagination)
|
|
103
|
+
def query_vehicles(
|
|
104
|
+
effective_at: datetime.datetime | None = Query(None),
|
|
105
|
+
skip: int = Query(0),
|
|
106
|
+
limit: int = Query(100),
|
|
107
|
+
db: sa_orm.Session = Depends(make_session),
|
|
108
|
+
) -> VehicleTablesAndPagination:
|
|
109
|
+
with managed_db_session(db):
|
|
110
|
+
query_stmt = (
|
|
111
|
+
db
|
|
112
|
+
.query(VehicleTable)
|
|
113
|
+
.where(VehicleTable.updated_at <= effective_at,
|
|
114
|
+
sa.or_(VehicleTable.expired_at.is_(None), VehicleTable.expired_at > effective_at))
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
total = query_stmt.count()
|
|
118
|
+
db_vehicles = query_stmt.order_by(VehicleTable.sqn.asc()).offset(skip).limit(limit).all()
|
|
119
|
+
|
|
120
|
+
return VehicleTablesAndPagination(vehicles=db_vehicles, pagination=Pagination(skip=skip, limit=limit, total=total))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@router.get("/retrieve_vehicles/", response_model=VehicleTablesAndPagination)
|
|
124
|
+
def retrieve_vehicles(
|
|
125
|
+
name_match: str | None = Query(None),
|
|
126
|
+
skip: int = Query(0),
|
|
127
|
+
limit: int = Query(100),
|
|
128
|
+
db: sa_orm.Session = Depends(make_session),
|
|
129
|
+
) -> VehicleTablesAndPagination:
|
|
130
|
+
with managed_db_session(db):
|
|
131
|
+
query_stmt = db.query(VehicleTable).where(VehicleTable.expired_at.is_(None))
|
|
132
|
+
if name_match:
|
|
133
|
+
query_stmt = query_stmt.where(
|
|
134
|
+
VehicleTable.name.ilike(f"%{escape_sql_like(name_match)}%", escape="\\"),
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
total = query_stmt.count()
|
|
138
|
+
db_vehicles = query_stmt.order_by(VehicleTable.sqn.asc()).offset(skip).limit(limit).all()
|
|
139
|
+
|
|
140
|
+
return VehicleTablesAndPagination(vehicles=db_vehicles, pagination=Pagination(skip=skip, limit=limit, total=total))
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class SensorTablesAndPagination(pdt.BaseModel):
|
|
144
|
+
sensors: list[SensorTable]
|
|
145
|
+
pagination: Pagination
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@router.get("/query_sensors/", response_model=SensorTablesAndPagination)
|
|
149
|
+
def query_sensors(
|
|
150
|
+
effective_at: datetime.datetime = Query(),
|
|
151
|
+
skip: int = Query(0),
|
|
152
|
+
limit: int = Query(100),
|
|
153
|
+
db: sa_orm.Session = Depends(make_session),
|
|
154
|
+
) -> SensorTablesAndPagination:
|
|
155
|
+
with managed_db_session(db):
|
|
156
|
+
query_stmt = (
|
|
157
|
+
db
|
|
158
|
+
.query(SensorTable)
|
|
159
|
+
.where(SensorTable.updated_at <= effective_at,
|
|
160
|
+
sa.or_(SensorTable.expired_at.is_(None), SensorTable.expired_at > effective_at))
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
total = query_stmt.count()
|
|
164
|
+
db_sensors = query_stmt.order_by(SensorTable.sqn.asc()).offset(skip).limit(limit).all()
|
|
165
|
+
|
|
166
|
+
return SensorTablesAndPagination(sensors=db_sensors, pagination=Pagination(skip=skip, limit=limit, total=total))
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@router.get("/retrieve_sensors/", response_model=SensorTablesAndPagination)
|
|
170
|
+
def retrieve_sensors(
|
|
171
|
+
serial_number_match: str | None = Query(None),
|
|
172
|
+
skip: int = Query(0),
|
|
173
|
+
limit: int = Query(100),
|
|
174
|
+
db: sa_orm.Session = Depends(make_session),
|
|
175
|
+
) -> SensorTablesAndPagination:
|
|
176
|
+
with managed_db_session(db):
|
|
177
|
+
query_stmt = db.query(SensorTable).where(SensorTable.expired_at.is_(None))
|
|
178
|
+
if serial_number_match:
|
|
179
|
+
query_stmt = query_stmt.where(
|
|
180
|
+
SensorTable.serial_number.ilike(f"%{escape_sql_like(serial_number_match)}%", escape="\\"),
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
total = query_stmt.count()
|
|
184
|
+
db_sensors = query_stmt.order_by(SensorTable.sqn.asc()).offset(skip).limit(limit).all()
|
|
185
|
+
|
|
186
|
+
return SensorTablesAndPagination(sensors=db_sensors, pagination=Pagination(skip=skip, limit=limit, total=total))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class BagTablesAndPagination(pdt.BaseModel):
|
|
190
|
+
bags: list[BagTable]
|
|
191
|
+
pagination: Pagination
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
@router.get("/query_bags/", response_model=BagTablesAndPagination)
|
|
195
|
+
def query_bags(
|
|
196
|
+
effective_at: datetime.datetime = Query(),
|
|
197
|
+
skip: int = Query(0),
|
|
198
|
+
limit: int = Query(100),
|
|
199
|
+
db: sa_orm.Session = Depends(make_session),
|
|
200
|
+
) -> BagTablesAndPagination:
|
|
201
|
+
with managed_db_session(db):
|
|
202
|
+
query_stmt = (
|
|
203
|
+
db
|
|
204
|
+
.query(BagTable)
|
|
205
|
+
.where(BagTable.updated_at <= effective_at,
|
|
206
|
+
sa.or_(BagTable.expired_at.is_(None), BagTable.expired_at > effective_at))
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
total = query_stmt.count()
|
|
210
|
+
db_bags = query_stmt.order_by(BagTable.sqn.asc()).offset(skip).limit(limit).all()
|
|
211
|
+
|
|
212
|
+
return BagTablesAndPagination(bags=db_bags, pagination=Pagination(skip=skip, limit=limit, total=total))
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@router.get("/retrieve_bags/", response_model=BagTablesAndPagination)
|
|
216
|
+
def retrieve_bags(
|
|
217
|
+
begin_at: datetime.datetime | None = Query(None),
|
|
218
|
+
end_at: datetime.datetime | None = Query(None),
|
|
219
|
+
vehicle_names: list[str] | None = Query(None),
|
|
220
|
+
name_match: str | None = Query(None),
|
|
221
|
+
skip: int = Query(0),
|
|
222
|
+
limit: int = Query(100),
|
|
223
|
+
db: sa_orm.Session = Depends(make_session),
|
|
224
|
+
) -> BagTablesAndPagination:
|
|
225
|
+
with managed_db_session(db):
|
|
226
|
+
query_stmt = db.query(BagTable).where(BagTable.expired_at.is_(None))
|
|
227
|
+
if begin_at is not None:
|
|
228
|
+
query_stmt = query_stmt.where(BagTable.begin_at >= begin_at)
|
|
229
|
+
if end_at is not None:
|
|
230
|
+
query_stmt = query_stmt.where(BagTable.end_at < end_at)
|
|
231
|
+
if vehicle_names:
|
|
232
|
+
query_stmt = query_stmt.where(BagTable.vehicle_name.in_(vehicle_names))
|
|
233
|
+
if name_match:
|
|
234
|
+
query_stmt = query_stmt.where(BagTable.name.ilike(f"%{escape_sql_like(name_match)}%", escape="\\"))
|
|
235
|
+
|
|
236
|
+
total = query_stmt.count()
|
|
237
|
+
db_bags = query_stmt.order_by(BagTable.sqn.asc()).offset(skip).limit(limit).all()
|
|
238
|
+
|
|
239
|
+
return BagTablesAndPagination(bags=db_bags, pagination=Pagination(skip=skip, limit=limit, total=total))
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
@router.get("/query_bag/", response_model=BagTable)
|
|
243
|
+
def query_bag(
|
|
244
|
+
name: str | None = Query(None),
|
|
245
|
+
db: sa_orm.Session = Depends(make_session),
|
|
246
|
+
) -> BagTable:
|
|
247
|
+
with managed_db_session(db):
|
|
248
|
+
query_stmt = db.query(BagTable).where(BagTable.expired_at.is_(None))
|
|
249
|
+
if name is not None:
|
|
250
|
+
query_stmt = query_stmt.where(BagTable.name == name)
|
|
251
|
+
db_bag = query_stmt.one_or_none()
|
|
252
|
+
if db_bag is None:
|
|
253
|
+
raise sa_exc.NoResultFound(f"'{model_name_of(BagTable)}' with name '{name}' not found")
|
|
254
|
+
|
|
255
|
+
return db_bag
|