irie 0.0.57__py3-none-any.whl → 0.0.59__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.

@@ -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
- from irie.apps.site.view_utils import raise404
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.objects.get(id=asset_id)
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)
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
+
53
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
- try:
62
- segments = request.path.split("/")
63
- _, _, is_nce = segments[-3:]
159
+ context = {
160
+ "segment": "events",
161
+ "nce_version": False,
162
+ }
64
163
 
65
- try:
66
- evaluation = Evaluation.objects.filter(event_id=int(event))[0]
67
- evaluation_data = evaluation.evaluation_data
164
+ try:
165
+ evaluation = Evaluation.objects.filter(event_id=int(event))[0]
166
+ evaluation_data = evaluation.evaluation_data
68
167
 
69
- except Exception as e:
70
- # TODO: Handle case where evaluation cant be found
71
- evaluation_data = {}
72
- evaluation = None
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"] = is_nce
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
- # @login_required(login_url="/login/")
180
- def asset_evals(request, calid):
181
- context = {}
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["nce_version"] = True
243
+ context = {
244
+ "segment": "dashboard",
245
+ }
186
246
 
187
- page = request.GET.get("page", 1)
188
- try:
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
- asset = Asset.objects.get(calid=calid)
195
-
196
- except Asset.DoesNotExist:
197
- return raise404(request, context)
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
- context["evaluations"] = Paginator(evals, 10).get_page(page)
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
- try:
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.all():
249
- if asset.is_complete:
250
- consumed["Complete"].add(asset.calid)
251
- lat, lon = asset.coordinates
252
- data["Complete"].append({
253
- "lat": lat, "lon": lon
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.all():
270
- if asset.calid not in consumed["Instrumented"] and asset.calid not in consumed["Complete"]:
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
- asset = Asset.objects.get(calid=calid)
398
+ # Template
399
+ html_template = loader.get_template("inventory/asset-sensors.html")
400
+
401
+ # General Context
409
402
  context = {
410
- "asset": asset,
411
- "segment": "assets",
412
- "groups": SensorGroup.objects.filter(asset=asset)
403
+ "segment": "assets"
413
404
  }
414
- html_template = loader.get_template("inventory/asset-sensors.html")
405
+
406
+ # Database
407
+ asset = get_object_or_404(Asset, calid=calid)
408
+ context["asset"] = asset
409
+ context["groups"] = SensorGroup.objects.filter(asset=asset)
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) # Redirect after successful submission
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 PredictorModel.objects.filter(asset=asset, protocol="IRIE_PREDICTOR_V1")
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, "inventory/sensor-upload.html", context)
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
- from django.forms import modelformset_factory
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
- context = {
510
+
511
+ context.update({
505
512
  "group_form": group_form,
506
- "segment": "assets",
507
513
  "formset": formset,
508
- "is_edit": True, # optional flag so the template can tweak titles/buttons
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, "inventory/sensor-upload.html", context)
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
- context["segment"] = "assets"
592
+ context = {
593
+ "segment": "assets",
594
+ }
578
595
 
579
596
  assets, (order_query, page_query, filter_set) = _filter_asset_table(request)
580
- page = request.GET.get("page", 1)
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