irie 0.0.56__py3-none-any.whl → 0.0.58__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.
Potentially problematic release.
This version of irie might be problematic. Click here for more details.
- irie/apps/evaluation/identification.py +1 -6
- irie/apps/inventory/models.py +46 -1
- irie/apps/inventory/services/maps/__init__.py +0 -0
- irie/apps/inventory/views.py +213 -302
- irie/apps/prediction/models.py +3 -0
- irie/apps/prediction/runners/opensees/__init__.py +5 -4
- irie/apps/prediction/urls.py +4 -4
- irie/apps/prediction/views.py +41 -49
- irie/apps/site/views.py +1 -0
- irie/apps/templates/inventory/asset-on-map.html +3 -410
- irie/apps/templates/inventory/asset-on-map.js +388 -0
- irie/apps/templates/inventory/sensor-upload.html +1 -0
- irie/apps/templates/layouts/base.html +10 -6
- irie/apps/templates/prediction/create-model.html +11 -1
- irie/maps.py +101 -0
- {irie-0.0.56.dist-info → irie-0.0.58.dist-info}/METADATA +6 -7
- {irie-0.0.56.dist-info → irie-0.0.58.dist-info}/RECORD +20 -17
- {irie-0.0.56.dist-info → irie-0.0.58.dist-info}/WHEEL +0 -0
- {irie-0.0.56.dist-info → irie-0.0.58.dist-info}/entry_points.txt +0 -0
- {irie-0.0.56.dist-info → irie-0.0.58.dist-info}/top_level.txt +0 -0
irie/apps/inventory/views.py
CHANGED
|
@@ -12,37 +12,38 @@ import os
|
|
|
12
12
|
import re
|
|
13
13
|
import json
|
|
14
14
|
import base64
|
|
15
|
-
import numpy as np
|
|
16
15
|
from django.core.paginator import Paginator
|
|
17
16
|
from django.template import loader
|
|
18
17
|
from django.http import HttpResponse
|
|
19
18
|
from django.contrib.auth.decorators import login_required
|
|
20
19
|
from django.shortcuts import render, redirect, get_object_or_404
|
|
21
|
-
from django.forms import formset_factory
|
|
20
|
+
from django.forms import formset_factory, modelformset_factory
|
|
22
21
|
|
|
23
22
|
from irie.apps.events.models import EventRecord
|
|
24
|
-
|
|
23
|
+
# Inventory
|
|
25
24
|
from irie.apps.inventory.models import Asset, SensorGroup, Sensor, Datum
|
|
26
25
|
from irie.apps.inventory.forms import SensorGroupForm, SensorForm, SensorFormSet
|
|
27
|
-
from irie.apps.prediction.models import PredictorModel
|
|
28
26
|
from .filters import AssetFilter
|
|
29
27
|
# Predictors
|
|
28
|
+
from irie.apps.prediction.models import PredictorModel
|
|
30
29
|
from irie.apps.prediction.runners.hazus import hazus_fragility
|
|
31
30
|
from irie.apps.prediction.runners.ssid import make_mountains, ssid_stats, ssid_event_plot
|
|
32
31
|
# Evaluations
|
|
33
32
|
from irie.apps.evaluation.models import Evaluation
|
|
34
33
|
|
|
34
|
+
# Helpers
|
|
35
|
+
from irie.maps import AssetMap
|
|
36
|
+
|
|
35
37
|
|
|
36
38
|
@login_required(login_url="/login/")
|
|
37
39
|
def _fetch_rendering(request):
|
|
38
40
|
asset_id = request.GET.get('asset')
|
|
39
|
-
asset = Asset
|
|
41
|
+
asset = get_object_or_404(Asset, id=asset_id)
|
|
40
42
|
|
|
41
43
|
if asset.cesmd == "CE58658":
|
|
42
44
|
template = loader.get_template(f"bridges/InteractiveTwin-{asset.cesmd}.html")
|
|
43
45
|
return HttpResponse(template.render({}, request))
|
|
44
46
|
|
|
45
|
-
from irie.apps.prediction.models import PredictorModel
|
|
46
47
|
for p in PredictorModel.objects.filter(asset=asset):
|
|
47
48
|
if p.protocol == "IRIE_PREDICTOR_V1":
|
|
48
49
|
return HttpResponse("html")
|
|
@@ -50,27 +51,126 @@ def _fetch_rendering(request):
|
|
|
50
51
|
return HttpResponse("No rendering available for this asset.")
|
|
51
52
|
|
|
52
53
|
|
|
54
|
+
# @login_required(login_url="/login/")
|
|
55
|
+
def asset_profile(request, calid):
|
|
56
|
+
"""
|
|
57
|
+
Build the main profile page for a specific asset.
|
|
58
|
+
"""
|
|
59
|
+
html_template = loader.get_template("inventory/asset-profile.html")
|
|
60
|
+
|
|
61
|
+
context = {
|
|
62
|
+
"segment": "assets",
|
|
63
|
+
"nce_version": True,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
asset = get_object_or_404(Asset, calid=calid)
|
|
67
|
+
|
|
68
|
+
context["asset"] = asset
|
|
69
|
+
|
|
70
|
+
# Compute Hazus fragility probabilities and curve
|
|
71
|
+
try:
|
|
72
|
+
hazus_results = hazus_fragility(asset.nbi_data)
|
|
73
|
+
|
|
74
|
+
# Add fragility probabilities and plot to the context
|
|
75
|
+
context["hazus"] = {
|
|
76
|
+
"sa_range": json.dumps(hazus_results["sa_range"]),
|
|
77
|
+
"curves": json.dumps(hazus_results["curves"])
|
|
78
|
+
}
|
|
79
|
+
except Exception as e:
|
|
80
|
+
print(e)
|
|
81
|
+
pass
|
|
82
|
+
|
|
83
|
+
context["tables"] = _make_tables(asset)
|
|
84
|
+
|
|
85
|
+
if asset.cesmd:
|
|
86
|
+
cesmd = asset.cesmd
|
|
87
|
+
|
|
88
|
+
events = list(sorted(
|
|
89
|
+
(e.event for e in Evaluation.objects.exclude(status=Evaluation.Status.Invalid).filter(asset=asset)),
|
|
90
|
+
key=lambda x: x.motion_data["event_date"], reverse=True))
|
|
91
|
+
|
|
92
|
+
evals = [
|
|
93
|
+
{"event": event,
|
|
94
|
+
"pga": event.pga, #abs(event.motion_data["peak_accel"])/980.,
|
|
95
|
+
"evaluation": ssid,
|
|
96
|
+
}
|
|
97
|
+
for i, (event, ssid) in enumerate(zip(events, ssid_stats(events, "period")))
|
|
98
|
+
]
|
|
99
|
+
context["evaluations"] = Paginator(evals, 5).get_page(1)
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
return HttpResponse(html_template.render(context, request))
|
|
103
|
+
|
|
104
|
+
except Exception as e:
|
|
105
|
+
if "DEBUG" in os.environ and os.environ["DEBUG"]:
|
|
106
|
+
raise e
|
|
107
|
+
import sys
|
|
108
|
+
print(e, file=sys.stderr)
|
|
109
|
+
html_template = loader.get_template("site/page-500.html")
|
|
110
|
+
return HttpResponse(html_template.render(context, request))
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# @login_required(login_url="/login/")
|
|
114
|
+
def asset_evals(request, calid):
|
|
115
|
+
html_template = loader.get_template("inventory/asset-evals.html")
|
|
116
|
+
|
|
117
|
+
context = {
|
|
118
|
+
"segment": "assets",
|
|
119
|
+
"nce_version": True,
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
page = _page_from_query(request)
|
|
123
|
+
|
|
124
|
+
asset = get_object_or_404(Asset, calid=calid)
|
|
53
125
|
|
|
126
|
+
context["asset"] = asset
|
|
127
|
+
|
|
128
|
+
if asset.cesmd:
|
|
129
|
+
events = list(sorted(
|
|
130
|
+
(e.event for e in Evaluation.objects.exclude(status=Evaluation.Status.Invalid).filter(asset=asset)),
|
|
131
|
+
key=lambda x: x.motion_data["event_date"], reverse=True))
|
|
132
|
+
|
|
133
|
+
evals = [
|
|
134
|
+
{"event": event,
|
|
135
|
+
"pga": event.pga, #abs(event.motion_data["peak_accel"])/980.,
|
|
136
|
+
"evaluation": ssid,
|
|
137
|
+
}
|
|
138
|
+
for event, ssid in zip(events, ssid_stats(events, "period"))
|
|
139
|
+
]
|
|
140
|
+
context["evaluations"] = Paginator(evals, 10).get_page(page)
|
|
141
|
+
|
|
142
|
+
try:
|
|
143
|
+
return HttpResponse(html_template.render(context, request))
|
|
144
|
+
|
|
145
|
+
except Exception as e:
|
|
146
|
+
if "DEBUG" in os.environ and os.environ["DEBUG"]:
|
|
147
|
+
raise e
|
|
148
|
+
html_template = loader.get_template("site/page-500.html")
|
|
149
|
+
return HttpResponse(html_template.render(context, request))
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
#
|
|
153
|
+
# Events
|
|
154
|
+
#
|
|
54
155
|
@login_required(login_url="/login/")
|
|
55
156
|
def asset_event_summary(request, cesmd, event):
|
|
56
|
-
|
|
57
|
-
context = {}
|
|
58
|
-
context["segment"] = "events"
|
|
59
157
|
html_template = loader.get_template("inventory/asset-event-summary.html")
|
|
60
158
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
159
|
+
context = {
|
|
160
|
+
"segment": "events",
|
|
161
|
+
"nce_version": False,
|
|
162
|
+
}
|
|
64
163
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
164
|
+
try:
|
|
165
|
+
evaluation = Evaluation.objects.filter(event_id=int(event))[0]
|
|
166
|
+
evaluation_data = evaluation.evaluation_data
|
|
68
167
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
168
|
+
except Exception as e:
|
|
169
|
+
# TODO: Handle case where evaluation cant be found
|
|
170
|
+
evaluation_data = {}
|
|
171
|
+
evaluation = None
|
|
73
172
|
|
|
173
|
+
try:
|
|
74
174
|
for metric in evaluation_data.values():
|
|
75
175
|
metric["completion"] = (
|
|
76
176
|
100 * len(metric["summary"])/len(metric["predictors"])
|
|
@@ -90,69 +190,30 @@ def asset_event_summary(request, cesmd, event):
|
|
|
90
190
|
for metric, predictors in sorted(evaluation_data.items(), key=lambda i: i[0])
|
|
91
191
|
}
|
|
92
192
|
context["asset"] = evaluation and evaluation.event.asset or None
|
|
93
|
-
context["nce_version"] =
|
|
193
|
+
context["nce_version"] = False
|
|
94
194
|
context["event"] = EventRecord.objects.get(pk=int(event))
|
|
95
195
|
context["event_data"] = context["event"].motion_data
|
|
96
196
|
|
|
97
197
|
|
|
98
|
-
resp = html_template.render(context, request)
|
|
99
|
-
|
|
100
|
-
return HttpResponse(resp)
|
|
101
|
-
|
|
102
|
-
except Exception as e:
|
|
103
|
-
if "DEBUG" in os.environ and os.environ["DEBUG"]:
|
|
104
|
-
raise e
|
|
105
|
-
html_template = loader.get_template("site/page-500.html")
|
|
106
|
-
return HttpResponse(html_template.render(context, request))
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
@login_required(login_url="/login/")
|
|
110
|
-
def dashboard(request):
|
|
111
|
-
from irie.apps.inventory.models import Asset
|
|
112
|
-
from irie.apps.evaluation.models import Evaluation
|
|
113
|
-
|
|
114
|
-
context = {}
|
|
115
|
-
context["segment"] = "dashboard"
|
|
116
|
-
try:
|
|
117
|
-
if "demo" in request.path:
|
|
118
|
-
context["demo_version"] = True
|
|
119
|
-
|
|
120
|
-
context["recent_evaluations"] = [
|
|
121
|
-
(Evaluation.objects.exclude(status=Evaluation.Status.Invalid).get(event_id=event.id), event)
|
|
122
|
-
for event in sorted(EventRecord.objects.all(),
|
|
123
|
-
key=lambda x: x.motion_data["event_date"], reverse=True)[:6]
|
|
124
|
-
]
|
|
125
|
-
assets = list(set(
|
|
126
|
-
Asset.objects.get(cesmd=event[1].cesmd) for event in context["recent_evaluations"]
|
|
127
|
-
))
|
|
128
|
-
colors = {
|
|
129
|
-
asset.id: max(event[1].pga for event in context["recent_evaluations"] if event[1].cesmd == asset.cesmd)
|
|
130
|
-
for asset in assets
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
context["asset_map"] = AssetMap(assets, colors=colors, color_name="Peak Station Accel.").get_html()
|
|
134
|
-
context["calid"] = {b.cesmd: b.calid for b in assets}
|
|
135
|
-
|
|
136
|
-
html_template = loader.get_template("inventory/dashboard.html")
|
|
137
198
|
return HttpResponse(html_template.render(context, request))
|
|
138
199
|
|
|
139
200
|
except Exception as e:
|
|
140
201
|
if "DEBUG" in os.environ and os.environ["DEBUG"]:
|
|
141
202
|
raise e
|
|
142
|
-
else:
|
|
143
|
-
print(e)
|
|
144
203
|
html_template = loader.get_template("site/page-500.html")
|
|
145
204
|
return HttpResponse(html_template.render(context, request))
|
|
146
205
|
|
|
147
206
|
|
|
207
|
+
|
|
148
208
|
@login_required(login_url="/login/")
|
|
149
209
|
def asset_event_report(request):
|
|
150
210
|
from irie.apps.evaluation.models import Evaluation
|
|
151
|
-
|
|
152
|
-
context = {}
|
|
153
|
-
context["segment"] = "events"
|
|
154
211
|
html_template = loader.get_template("inventory/report.tex")
|
|
155
212
|
|
|
213
|
+
context = {
|
|
214
|
+
"segment": "events",
|
|
215
|
+
}
|
|
216
|
+
|
|
156
217
|
events = [
|
|
157
218
|
EventRecord.objects.get(pk=evaluation.event_id)
|
|
158
219
|
for evaluation in reversed(list(Evaluation.objects.all())[-6:])
|
|
@@ -161,8 +222,7 @@ def asset_event_report(request):
|
|
|
161
222
|
Asset.objects.get(cesmd=event.cesmd) for event in events
|
|
162
223
|
))
|
|
163
224
|
context["events"] = events
|
|
164
|
-
context["assets"] = assets
|
|
165
|
-
|
|
225
|
+
context["assets"] = assets
|
|
166
226
|
context["mountains"] = []
|
|
167
227
|
|
|
168
228
|
if request.method == 'POST' and request.FILES.get('map_image'):
|
|
@@ -176,52 +236,47 @@ def asset_event_report(request):
|
|
|
176
236
|
return HttpResponse(resp)
|
|
177
237
|
|
|
178
238
|
|
|
179
|
-
|
|
180
|
-
def
|
|
181
|
-
|
|
182
|
-
html_template = loader.get_template("inventory/asset-evals.html")
|
|
183
|
-
context["segment"] = "assets"
|
|
239
|
+
@login_required(login_url="/login/")
|
|
240
|
+
def dashboard(request):
|
|
241
|
+
from irie.apps.inventory.models import Asset
|
|
184
242
|
|
|
185
|
-
context
|
|
243
|
+
context = {
|
|
244
|
+
"segment": "dashboard",
|
|
245
|
+
}
|
|
186
246
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
page = int(page)
|
|
190
|
-
except:
|
|
191
|
-
page = 1
|
|
247
|
+
if "demo" in request.path:
|
|
248
|
+
context["demo_version"] = True
|
|
192
249
|
|
|
193
250
|
try:
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
context["asset"] = asset
|
|
200
|
-
|
|
201
|
-
if asset.cesmd:
|
|
202
|
-
events = list(sorted(
|
|
203
|
-
(e.event for e in Evaluation.objects.exclude(status=Evaluation.Status.Invalid).filter(asset=asset)),
|
|
204
|
-
key=lambda x: x.motion_data["event_date"], reverse=True))
|
|
205
|
-
|
|
206
|
-
evals = [
|
|
207
|
-
{"event": event,
|
|
208
|
-
"pga": event.pga, #abs(event.motion_data["peak_accel"])/980.,
|
|
209
|
-
"evaluation": ssid,
|
|
210
|
-
}
|
|
211
|
-
for event, ssid in zip(events, ssid_stats(events, "period"))
|
|
251
|
+
context["recent_evaluations"] = [
|
|
252
|
+
(Evaluation.objects.exclude(status=Evaluation.Status.Invalid).get(event_id=event.id), event)
|
|
253
|
+
for event in sorted(EventRecord.objects.all(),
|
|
254
|
+
key=lambda x: x.motion_data["event_date"], reverse=True)[:6]
|
|
212
255
|
]
|
|
213
|
-
|
|
256
|
+
assets = list(set(
|
|
257
|
+
Asset.objects.get(cesmd=event[1].cesmd) for event in context["recent_evaluations"]
|
|
258
|
+
))
|
|
259
|
+
colors = {
|
|
260
|
+
asset.id: max(event[1].pga for event in context["recent_evaluations"] if event[1].cesmd == asset.cesmd)
|
|
261
|
+
for asset in assets
|
|
262
|
+
}
|
|
214
263
|
|
|
215
|
-
|
|
264
|
+
context["asset_map"] = AssetMap(assets, colors=colors, color_name="Peak Station Accel.").get_html()
|
|
265
|
+
context["calid"] = {b.cesmd: b.calid for b in assets}
|
|
266
|
+
|
|
267
|
+
html_template = loader.get_template("inventory/dashboard.html")
|
|
216
268
|
return HttpResponse(html_template.render(context, request))
|
|
217
269
|
|
|
218
270
|
except Exception as e:
|
|
219
271
|
if "DEBUG" in os.environ and os.environ["DEBUG"]:
|
|
220
272
|
raise e
|
|
273
|
+
else:
|
|
274
|
+
print(e)
|
|
221
275
|
html_template = loader.get_template("site/page-500.html")
|
|
222
276
|
return HttpResponse(html_template.render(context, request))
|
|
223
277
|
|
|
224
278
|
|
|
279
|
+
|
|
225
280
|
def california_json(request):
|
|
226
281
|
with open("ca.json") as f:
|
|
227
282
|
return HttpResponse(f.read(), content_type="application/json")
|
|
@@ -229,9 +284,11 @@ def california_json(request):
|
|
|
229
284
|
cal = [s for s in json.load(f)["features"] if s["id"] == "CA"][0]
|
|
230
285
|
return HttpResponse(json.dumps({"type": "FeatureCollection", "features": [cal]}), content_type="application/json")
|
|
231
286
|
|
|
287
|
+
|
|
232
288
|
def map_inventory(request):
|
|
289
|
+
html_template = loader.get_template("inventory/map-inventory.html")
|
|
290
|
+
|
|
233
291
|
import json
|
|
234
|
-
from irie.apps.inventory.models import Asset
|
|
235
292
|
|
|
236
293
|
consumed = {
|
|
237
294
|
"Partial": set(),
|
|
@@ -245,13 +302,12 @@ def map_inventory(request):
|
|
|
245
302
|
"Instrumented": []
|
|
246
303
|
}
|
|
247
304
|
|
|
248
|
-
for asset in Asset.objects.
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
})
|
|
305
|
+
for asset in Asset.objects.filter(is_complete=True):
|
|
306
|
+
consumed["Complete"].add(asset.calid)
|
|
307
|
+
lat, lon = asset.coordinates
|
|
308
|
+
data["Complete"].append({
|
|
309
|
+
"lat": lat, "lon": lon
|
|
310
|
+
})
|
|
255
311
|
|
|
256
312
|
from irie.init.calid import CESMD, CESMD_LONG_LAT
|
|
257
313
|
for calid in CESMD:
|
|
@@ -266,85 +322,20 @@ def map_inventory(request):
|
|
|
266
322
|
"lat": lat, "lon": lon
|
|
267
323
|
})
|
|
268
324
|
|
|
269
|
-
for asset in Asset.objects.
|
|
270
|
-
if asset.calid not in consumed["Instrumented"]
|
|
325
|
+
for asset in Asset.objects.filter(is_complete=False):
|
|
326
|
+
if asset.calid not in consumed["Instrumented"]:
|
|
271
327
|
lat, lon = asset.coordinates
|
|
272
328
|
data["Partial"].append({
|
|
273
329
|
"lat": lat, "lon": lon
|
|
274
330
|
})
|
|
275
331
|
|
|
276
|
-
|
|
277
|
-
html_template = loader.get_template("inventory/map-inventory.html")
|
|
278
332
|
return HttpResponse(html_template.render({"data": json.dumps(data)}, request))
|
|
279
333
|
|
|
280
|
-
# @login_required(login_url="/login/")
|
|
281
|
-
def asset_profile(request, calid):
|
|
282
|
-
|
|
283
|
-
context = {}
|
|
284
|
-
html_template = loader.get_template("inventory/asset-profile.html")
|
|
285
|
-
context["segment"] = "assets"
|
|
286
|
-
|
|
287
|
-
context["nce_version"] = True
|
|
288
|
-
|
|
289
|
-
try:
|
|
290
|
-
asset = Asset.objects.get(calid=calid)
|
|
291
|
-
|
|
292
|
-
except Asset.DoesNotExist:
|
|
293
|
-
return raise404(request, context)
|
|
294
|
-
|
|
295
|
-
page = request.GET.get("page", 1)
|
|
296
|
-
try:
|
|
297
|
-
page = int(page)
|
|
298
|
-
except:
|
|
299
|
-
page = 1
|
|
300
|
-
|
|
301
|
-
context["asset"] = asset
|
|
302
|
-
|
|
303
|
-
# Compute Hazus fragility probabilities and curve
|
|
304
|
-
try:
|
|
305
|
-
hazus_results = hazus_fragility(asset.nbi_data)
|
|
306
|
-
|
|
307
|
-
# Add fragility probabilities and plot to the context
|
|
308
|
-
context["hazus"] = {
|
|
309
|
-
"sa_range": json.dumps(hazus_results["sa_range"]),
|
|
310
|
-
"curves": json.dumps(hazus_results["curves"])
|
|
311
|
-
}
|
|
312
|
-
except Exception as e:
|
|
313
|
-
print(e)
|
|
314
|
-
pass
|
|
315
|
-
|
|
316
|
-
context["tables"] = _make_tables(asset)
|
|
317
|
-
|
|
318
|
-
if asset.cesmd:
|
|
319
|
-
cesmd = asset.cesmd
|
|
320
|
-
|
|
321
|
-
events = list(sorted(
|
|
322
|
-
(e.event for e in Evaluation.objects.exclude(status=Evaluation.Status.Invalid).filter(asset=asset)),
|
|
323
|
-
key=lambda x: x.motion_data["event_date"], reverse=True))
|
|
324
|
-
|
|
325
|
-
evals = [
|
|
326
|
-
{"event": event,
|
|
327
|
-
"pga": event.pga, #abs(event.motion_data["peak_accel"])/980.,
|
|
328
|
-
"evaluation": ssid,
|
|
329
|
-
}
|
|
330
|
-
for i, (event, ssid) in enumerate(zip(events, ssid_stats(events, "period")))
|
|
331
|
-
]
|
|
332
|
-
context["evaluations"] = Paginator(evals, 5).get_page(1)
|
|
333
|
-
|
|
334
|
-
try:
|
|
335
|
-
return HttpResponse(html_template.render(context, request))
|
|
336
|
-
|
|
337
|
-
except Exception as e:
|
|
338
|
-
if "DEBUG" in os.environ and os.environ["DEBUG"]:
|
|
339
|
-
raise e
|
|
340
|
-
import sys
|
|
341
|
-
print(e, file=sys.stderr)
|
|
342
|
-
html_template = loader.get_template("site/page-500.html")
|
|
343
|
-
return HttpResponse(html_template.render(context, request))
|
|
344
|
-
|
|
345
334
|
def _make_tables(asset):
|
|
335
|
+
tables = []
|
|
336
|
+
|
|
346
337
|
if asset.cesmd and isinstance(asset.cgs_data, list):
|
|
347
|
-
tables
|
|
338
|
+
tables.extend([
|
|
348
339
|
{k: v for k,v in group.items()
|
|
349
340
|
if k not in {
|
|
350
341
|
"Remarks",
|
|
@@ -353,9 +344,7 @@ def _make_tables(asset):
|
|
|
353
344
|
"Construction Date"
|
|
354
345
|
}
|
|
355
346
|
} for group in asset.cgs_data[1:]
|
|
356
|
-
]
|
|
357
|
-
else:
|
|
358
|
-
tables = []
|
|
347
|
+
])
|
|
359
348
|
|
|
360
349
|
# Filter out un-interesting information
|
|
361
350
|
nbi_data = [
|
|
@@ -375,6 +364,7 @@ def _make_tables(asset):
|
|
|
375
364
|
}
|
|
376
365
|
} for group in asset.nbi_data.values()
|
|
377
366
|
]
|
|
367
|
+
|
|
378
368
|
tables.extend(nbi_data)
|
|
379
369
|
try:
|
|
380
370
|
tables = [tables[2], *tables[:2], *tables[3:]]
|
|
@@ -405,19 +395,32 @@ def _make_tables(asset):
|
|
|
405
395
|
|
|
406
396
|
@login_required(login_url="/login/")
|
|
407
397
|
def asset_sensors(request, calid):
|
|
408
|
-
|
|
398
|
+
# Template
|
|
399
|
+
html_template = loader.get_template("inventory/asset-sensors.html")
|
|
400
|
+
|
|
401
|
+
# General Context
|
|
409
402
|
context = {
|
|
410
403
|
"asset": asset,
|
|
411
404
|
"segment": "assets",
|
|
412
405
|
"groups": SensorGroup.objects.filter(asset=asset)
|
|
413
406
|
}
|
|
414
|
-
|
|
407
|
+
|
|
408
|
+
# Database
|
|
409
|
+
asset = get_object_or_404(Asset, calid=calid)
|
|
410
|
+
|
|
415
411
|
return HttpResponse(html_template.render(context, request))
|
|
416
412
|
|
|
417
413
|
|
|
418
414
|
@login_required(login_url="/login/")
|
|
419
415
|
def sensor_upload(request, calid):
|
|
416
|
+
html_template = "inventory/sensor-upload.html"
|
|
417
|
+
|
|
418
|
+
context = {
|
|
419
|
+
"segment": "assets",
|
|
420
|
+
}
|
|
421
|
+
|
|
420
422
|
asset = get_object_or_404(Asset, calid=calid)
|
|
423
|
+
|
|
421
424
|
datums = Datum.objects.filter(asset=asset).values(
|
|
422
425
|
'id', 'orient_x', 'locate_x', 'orient_y', 'locate_y', 'orient_z', 'locate_z'
|
|
423
426
|
)
|
|
@@ -437,26 +440,25 @@ def sensor_upload(request, calid):
|
|
|
437
440
|
sensor = form.save(commit=False)
|
|
438
441
|
sensor.group = sensor_group
|
|
439
442
|
sensor.save()
|
|
440
|
-
|
|
441
|
-
return redirect('asset_sensors', calid=calid)
|
|
443
|
+
# Redirect after successful submission
|
|
444
|
+
return redirect('asset_sensors', calid=calid)
|
|
442
445
|
|
|
443
446
|
else:
|
|
444
447
|
group_form = SensorGroupForm(asset=asset)
|
|
445
448
|
formset = SensorFormSet()
|
|
446
449
|
|
|
447
|
-
context
|
|
450
|
+
context.update({
|
|
448
451
|
"group_form": group_form,
|
|
449
|
-
"segment": "assets",
|
|
450
452
|
"formset": formset,
|
|
451
453
|
"renderings": [
|
|
452
454
|
{"name": predictor.name, "glb": predictor.render_file.url}
|
|
453
|
-
for predictor in
|
|
455
|
+
for predictor in PredictorModel.objects.filter(asset=asset, protocol="IRIE_PREDICTOR_V1")
|
|
454
456
|
if predictor.render_file and predictor.render_file.url
|
|
455
457
|
],
|
|
456
458
|
"asset": asset,
|
|
457
459
|
"datums": list(datums)
|
|
458
|
-
}
|
|
459
|
-
return render(request,
|
|
460
|
+
})
|
|
461
|
+
return render(request, html_template, context)
|
|
460
462
|
|
|
461
463
|
|
|
462
464
|
@login_required(login_url="/login/")
|
|
@@ -465,7 +467,11 @@ def sensor_edit(request, calid, group_id):
|
|
|
465
467
|
Edit an existing SensorGroup + its Sensors while re-using the
|
|
466
468
|
sensor-upload.html template.
|
|
467
469
|
"""
|
|
468
|
-
|
|
470
|
+
html_template = "inventory/sensor-upload.html"
|
|
471
|
+
|
|
472
|
+
context = {
|
|
473
|
+
"segment": "assets",
|
|
474
|
+
}
|
|
469
475
|
|
|
470
476
|
asset = get_object_or_404(Asset, calid=calid)
|
|
471
477
|
sensor_group = get_object_or_404(SensorGroup, pk=group_id, asset=asset)
|
|
@@ -501,11 +507,11 @@ def sensor_edit(request, calid, group_id):
|
|
|
501
507
|
group_form = SensorGroupForm(instance=sensor_group, asset=asset)
|
|
502
508
|
formset = SensorFormSet(queryset=sensor_group.sensors.all())
|
|
503
509
|
|
|
504
|
-
|
|
510
|
+
|
|
511
|
+
context.update({
|
|
505
512
|
"group_form": group_form,
|
|
506
|
-
"segment": "assets",
|
|
507
513
|
"formset": formset,
|
|
508
|
-
"is_edit": True,
|
|
514
|
+
"is_edit": True,
|
|
509
515
|
"renderings": [
|
|
510
516
|
{"name": p.name, "glb": p.render_file.url}
|
|
511
517
|
for p in PredictorModel.objects.filter(asset=asset, protocol="IRIE_PREDICTOR_V1")
|
|
@@ -517,9 +523,18 @@ def sensor_edit(request, calid, group_id):
|
|
|
517
523
|
"id", "orient_x", "locate_x", "orient_y", "locate_y", "orient_z", "locate_z"
|
|
518
524
|
)
|
|
519
525
|
),
|
|
520
|
-
}
|
|
521
|
-
return render(request,
|
|
526
|
+
})
|
|
527
|
+
return render(request, html_template, context)
|
|
522
528
|
|
|
529
|
+
def _page_from_query(request)->int:
|
|
530
|
+
"""
|
|
531
|
+
Extracts the page number from a query dictionary.
|
|
532
|
+
"""
|
|
533
|
+
page = request.GET.get("page", 1)
|
|
534
|
+
try:
|
|
535
|
+
return int(page)
|
|
536
|
+
except ValueError:
|
|
537
|
+
return 1
|
|
523
538
|
|
|
524
539
|
def _filter_asset_table(request):
|
|
525
540
|
# Copy the GET parameters and remove the 'page' parameter
|
|
@@ -537,6 +552,7 @@ def _filter_asset_table(request):
|
|
|
537
552
|
assets = filter_set.qs
|
|
538
553
|
return assets, (order_query, page_query, filter_set)
|
|
539
554
|
|
|
555
|
+
|
|
540
556
|
# @login_required(login_url="/login/")
|
|
541
557
|
def asset_table_export(request):
|
|
542
558
|
"""
|
|
@@ -573,15 +589,12 @@ def asset_table(request):
|
|
|
573
589
|
Returns a table of all assets in the database, paginated
|
|
574
590
|
"""
|
|
575
591
|
|
|
576
|
-
context = {
|
|
577
|
-
|
|
592
|
+
context = {
|
|
593
|
+
"segment": "assets",
|
|
594
|
+
}
|
|
578
595
|
|
|
579
596
|
assets, (order_query, page_query, filter_set) = _filter_asset_table(request)
|
|
580
|
-
page = request
|
|
581
|
-
try:
|
|
582
|
-
page = int(page)
|
|
583
|
-
except:
|
|
584
|
-
page = 1
|
|
597
|
+
page = _page_from_query(request)
|
|
585
598
|
|
|
586
599
|
context["page_query"] = page_query.urlencode()
|
|
587
600
|
context["order_query"] = order_query.urlencode()
|
|
@@ -601,105 +614,3 @@ def asset_table(request):
|
|
|
601
614
|
return HttpResponse(html_template.render(context, request))
|
|
602
615
|
|
|
603
616
|
|
|
604
|
-
|
|
605
|
-
import folium
|
|
606
|
-
|
|
607
|
-
class AssetMap:
|
|
608
|
-
def __init__(self, assets, name=None, colors=None, color_name=None):
|
|
609
|
-
if name is None:
|
|
610
|
-
name = "Assets"
|
|
611
|
-
|
|
612
|
-
if colors is not None and len(assets)>0 and len(colors) > 0:
|
|
613
|
-
cm = folium.branca.colormap.LinearColormap(colors=["green", "yellow", "orange", "red"],
|
|
614
|
-
vmin=0, vmax=max(colors.values()),
|
|
615
|
-
caption=color_name)
|
|
616
|
-
colors = {
|
|
617
|
-
k: cm.rgb_hex_str(v) for k,v in colors.items()
|
|
618
|
-
}
|
|
619
|
-
else:
|
|
620
|
-
colors = None
|
|
621
|
-
cm = None
|
|
622
|
-
|
|
623
|
-
markers = self.add_bridges(assets, colors=colors)
|
|
624
|
-
|
|
625
|
-
if len(markers) > 0:
|
|
626
|
-
location = sum(np.array(m.location) for m in markers) / len(markers)
|
|
627
|
-
else:
|
|
628
|
-
location = [37.7735, -122.0993] # (self._preferences.latitude, self._preferences.longitude)
|
|
629
|
-
|
|
630
|
-
# self._figure = figure = folium.Figure()
|
|
631
|
-
self._map = m = folium.Map(
|
|
632
|
-
location=location,
|
|
633
|
-
zoom_start=6,
|
|
634
|
-
tiles='cartodbpositron'
|
|
635
|
-
)
|
|
636
|
-
|
|
637
|
-
if cm is not None:
|
|
638
|
-
cm.add_to(m)
|
|
639
|
-
|
|
640
|
-
for marker in markers:
|
|
641
|
-
marker.add_to(m)
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
# CESMD
|
|
645
|
-
# Partial
|
|
646
|
-
# Full
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
def get_html(self, **kwargs):
|
|
650
|
-
return self._map._repr_html_()
|
|
651
|
-
|
|
652
|
-
def add_bridges(self, assets, colors=None):
|
|
653
|
-
if colors is None:
|
|
654
|
-
colors = {}
|
|
655
|
-
|
|
656
|
-
markers = []
|
|
657
|
-
top_markers = []
|
|
658
|
-
for b in assets:
|
|
659
|
-
lat, lon = b.coordinates
|
|
660
|
-
if lat is None or lon is None:
|
|
661
|
-
print(b)
|
|
662
|
-
continue
|
|
663
|
-
popup = folium.Popup(
|
|
664
|
-
folium.Html(
|
|
665
|
-
'<a style="display: inline;" target="_blank" href="/inventory/{calid}/">{label}</a>'.format(
|
|
666
|
-
calid=b.calid,
|
|
667
|
-
label=b.calid
|
|
668
|
-
),
|
|
669
|
-
script=True
|
|
670
|
-
),
|
|
671
|
-
min_width= 50,
|
|
672
|
-
max_width=100
|
|
673
|
-
)
|
|
674
|
-
|
|
675
|
-
marker = folium.CircleMarker(
|
|
676
|
-
location=[lat, lon],
|
|
677
|
-
popup=popup,
|
|
678
|
-
color = "blue" if b.is_complete else "black",
|
|
679
|
-
fill_color=colors.get(b.id, "blue" if b.is_complete else "gray"),
|
|
680
|
-
fill=True,
|
|
681
|
-
opacity=1,
|
|
682
|
-
fill_opacity=1,
|
|
683
|
-
radius=2,
|
|
684
|
-
weight=1,
|
|
685
|
-
z_index_offset=10 if b.is_complete else 100000
|
|
686
|
-
)
|
|
687
|
-
|
|
688
|
-
if b.is_complete:
|
|
689
|
-
marker = folium.Marker(
|
|
690
|
-
location=[lat, lon],
|
|
691
|
-
popup=popup,
|
|
692
|
-
icon=folium.Icon(icon="cloud", color="blue" if not b.is_complete else "beige"),
|
|
693
|
-
z_index_offset=1000
|
|
694
|
-
)
|
|
695
|
-
top_markers.append(marker)
|
|
696
|
-
elif b.calid in {"33-0526G", "33-0395L", "33-0525G", "33-0189L", "33-0523K", "33-0443", "33-0202F", "33-0202R", "33-0524F"}:
|
|
697
|
-
pass
|
|
698
|
-
else:
|
|
699
|
-
markers.append(marker)
|
|
700
|
-
|
|
701
|
-
markers.extend(top_markers)
|
|
702
|
-
return markers
|
|
703
|
-
|
|
704
|
-
# top_markers.extend(markers)
|
|
705
|
-
# return top_markers
|