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

@@ -91,7 +91,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
91
91
  el.style.color = 'url(' + el.getAttribute('data-color') + ')';
92
92
  });
93
93
 
94
- //Tooltips
94
+ // Tooltips
95
95
  var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
96
96
  var tooltipList = tooltipTriggerList.map(
97
97
  function (tooltipTriggerEl) {
@@ -681,6 +681,7 @@ window.addEventListener('resize', function(event) {
681
681
 
682
682
  }
683
683
  });
684
+
684
685
  } else {
685
686
  total.forEach(function(item, i) {
686
687
  if (item.classList.contains('on-resize')) {
@@ -2,6 +2,15 @@
2
2
  <!-- Core -->
3
3
  <script src="{{ ASSETS_ROOT }}/vendor/@popperjs/core/dist/umd/popper.min.js"></script>
4
4
  <script src="{{ ASSETS_ROOT }}/vendor/bootstrap/dist/js/bootstrap.min.js"></script>
5
+ <script>
6
+ var win = navigator.platform.indexOf('Win') > -1;
7
+ if (win && document.querySelector('#sidenav-scrollbar')) {
8
+ var options = {
9
+ damping: '0.5'
10
+ }
11
+ Scrollbar.init(document.querySelector('#sidenav-scrollbar'), options);
12
+ }
13
+ </script>
5
14
 
6
15
  {% comment %}
7
16
  <script src="{{ ASSETS_ROOT }}/vendor/onscreen/dist/on-screen.umd.min.js"></script>
@@ -18,7 +27,7 @@
18
27
  <script src="{{ ASSETS_ROOT }}/vendor/notyf/notyf.min.js"></script>
19
28
 
20
29
  <!-- Simplebar -->
21
- <script src="{{ ASSETS_ROOT }}/vendor/simplebar/dist/simplebar.min.js"></script>
30
+ <!-- <script src="{{ ASSETS_ROOT }}/vendor/simplebar/dist/simplebar.min.js"></script> -->
22
31
 
23
32
  <!-- Github buttons -->
24
33
  <script async defer src="https://buttons.github.io/buttons.js"></script>
@@ -1,9 +1,16 @@
1
1
 
2
- <nav class="navbar navbar-theme-primary navbar-dark px-4 col-12 d-lg-none">
2
+ <nav class="navbar navbar-theme-secondary navbar-dark px-4 col-12 d-lg-none">
3
3
  <a class="navbar-brand me-lg-5" href="/">
4
4
  <img class="navbar-brand-light" src="{{ ASSETS_ROOT }}/img/brace2-no_text.png" alt="BRACE2 logo" />
5
5
  </a>
6
6
  <div class="d-flex align-items-center">
7
+ <a href="javascript:;" class="nav-link text-body p-0" id="iconNavbarSidenav">
8
+ <div class="sidenav-toggler-inner">
9
+ <i class="sidenav-toggler-line"></i>
10
+ <i class="sidenav-toggler-line"></i>
11
+ <i class="sidenav-toggler-line"></i>
12
+ </div>
13
+ </a>
7
14
  <!-- <button class="navbar-toggler d-lg-none collapsed" type="button" -->
8
15
  <button class="navbar-toggler collapsed" type="button"
9
16
  data-bs-toggle="collapse"
@@ -15,16 +22,16 @@
15
22
  </nav>
16
23
 
17
24
  <!-- <nav id="sidebarMenu" class="sidebar d-lg-block bg-gray-800 text-white collapse" data-simplebar> -->
18
- <aside id="sidebarMenu" class="sidebar d-lg-block collapse bg-white ms-2 my-2 navbar-vertical navbar-expand-xs" data-simplebar>
19
- <div class="sidebar-inner px-4 pt-3">
25
+ <aside id="sidenav-main" style="z-index: 1;" class="sidebar navbar navbar-vertical navbar-expand-xs d-lg-block collapse bg-white ms-2 my-2 fixed-start">
26
+ <!-- <div class="sidebar-inner px-4 pt-3"> -->
27
+ <div class="collapse navbar-collapse sidebar-inner px-4 pt-3 w-auto" id="sidenav-collapse-main">
28
+ {% comment %}
20
29
  <div class="user-card d-flex d-md-none align-items-center justify-content-between justify-content-md-center pb-4">
21
30
  <div class="d-flex align-items-center">
22
- {% comment %}
23
31
  <div class="avatar-lg me-4">
24
32
  <img src="{{ ASSETS_ROOT }}/img/team/profile-picture-3.jpg" class="card-img-top rounded-circle border-white"
25
33
  alt="Profile picture">
26
34
  </div>
27
- {% endcomment %}
28
35
  <div class="d-block">
29
36
  <a href="/page-sign-in.html" class="btn btn-secondary btn-sm d-inline-flex align-items-center">
30
37
  <svg class="icon icon-xxs me-1" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"></path></svg>
@@ -40,9 +47,10 @@
40
47
  </a>
41
48
  </div>
42
49
  </div>
43
- <ul class="nav flex-column pt-3 pt-md-0">
50
+ {% endcomment %}
51
+ <ul class="nav navbar-nav flex-column pt-3 pt-md-0">
44
52
  <li class="nav-item">
45
- <a href="/" class="nav-link d-flex align-items-center">
53
+ <a href="/" class="nav-link d-flex align-items-center" data-bs-toggle="collapse">
46
54
  <span class="sidebar-icon">
47
55
  <img src="{{ ASSETS_ROOT }}/img/brace2-no_text.png" height="20" width="20" alt="BRACE2 Logo">
48
56
  </span>
@@ -53,7 +61,7 @@
53
61
 
54
62
  <li role="separator" class="dropdown-divider mt-2 mb-2 border-gray-700"></li>
55
63
 
56
- <li class="nav-item {% if 'dashboard' in segment %} active {% endif %}">
64
+ <li class="nav-item {% if 'dashboard' in segment %} active {% endif %}" data-bs-toggle="collapse">
57
65
  <a href="{% url 'dashboard' %}" class="nav-link">
58
66
  <span class="sidebar-icon">
59
67
  <svg class="icon icon-xs me-2" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 10a8 8 0 018-8v8h8a8 8 0 11-16 0z"></path><path d="M12 2.252A8.014 8.014 0 0117.748 8H12V2.252z"></path></svg>
@@ -62,9 +70,9 @@
62
70
  </a>
63
71
  </li>
64
72
 
65
- <li class="nav-item {% if 'events' in segment %} active {% endif %}">
73
+ <li class="nav-item {% if 'events' in segment %} active {% endif %}" data-bs-toggle="collapse">
66
74
  <span
67
- class="nav-link collapsed d-flex justify-content-between align-items-center"
75
+ class="nav-link collapsed d-flex justify-content-between align-items-center"
68
76
  data-bs-toggle="collapse" data-bs-target="#submenu-events">
69
77
  <span>
70
78
  <span class="sidebar-icon">
@@ -89,7 +97,7 @@
89
97
  </div>
90
98
  </li>
91
99
 
92
- <li class="nav-item {% if 'assets' in segment %} active {% endif %}">
100
+ <li class="nav-item text-dark {% if 'assets' in segment %} active {% endif %}" data-bs-toggle="collapse">
93
101
  <a href="{% url 'asset_table' %}" class="nav-link">
94
102
  <span class="sidebar-icon">
95
103
  <svg class="icon icon-xs me-2" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M4 4a2 2 0 00-2 2v1h16V6a2 2 0 00-2-2H4z"></path><path fill-rule="evenodd" d="M18 9H2v5a2 2 0 002 2h12a2 2 0 002-2V9zM4 13a1 1 0 011-1h1a1 1 0 110 2H5a1 1 0 01-1-1zm5-1a1 1 0 100 2h1a1 1 0 100-2H9z" clip-rule="evenodd"></path></svg>
@@ -44,7 +44,7 @@
44
44
 
45
45
  {% block stylesheets %}{% endblock stylesheets %}
46
46
  </head>
47
- <body>
47
+ <body class="g-sidenav-show">
48
48
  {% include 'includes/sidebar.html' %}
49
49
 
50
50
  <main class="content">
@@ -0,0 +1,304 @@
1
+ #===----------------------------------------------------------------------===#
2
+ #
3
+ # STAIRLab -- STructural Artificial Intelligence Laboratory
4
+ #
5
+ #===----------------------------------------------------------------------===#
6
+ #
7
+ # First run without arguments to generate list of structure numbers and
8
+ # save to JSON. Then run with that JSON as argv[1] to pull inventory data.
9
+ #
10
+ # Adapted from:
11
+ # https://github.com/psychogeekir/ScrapeNBIBridgeInfo/raw/master/getNBIClimateData.py
12
+ #
13
+ # Claudio M. Perez
14
+ #
15
+ # TODO:
16
+ #
17
+ # - Add option for "SELECTED_TAB": "NBETab",
18
+ #
19
+ # - Perhaps add something like:
20
+ # --filter-calid calids.txt
21
+ # This will be useful for testing, eg, (chrystal's first version)
22
+ # python getNBIData.py yearly.json --filter-calid <(echo "33 0214L")
23
+ #
24
+ # or
25
+ # python getNBIData.py | python getNBIData.py /dev/stdin <(echo "33 0214L")
26
+ #
27
+ import sys
28
+ import json
29
+ import requests
30
+ from tqdm import tqdm
31
+ from pathlib import Path
32
+
33
+ NAME = Path(__file__).name
34
+
35
+ EXAMPLES= """"
36
+ Examples:
37
+ run to obtain structure numbers list:
38
+ $ {NAME}
39
+ run to obtain data from JSON list:
40
+ $ {NAME} [structure_numbers]
41
+ run filtering for given structure 33 0214L:
42
+ $ {NAME} [structure_numbers] --filter-calid "33 0214L"
43
+ run filtering for given structures:
44
+ $ {NAME} [structure_numbers] --filter-list [list]
45
+ """
46
+
47
+ HELP=f"""
48
+
49
+ usage: $ {NAME}
50
+ $ {NAME} --help
51
+ $ {NAME} [structure_numbers] [options]
52
+
53
+ Two-step process to obtain data from the National Bridge Inventory.
54
+
55
+ Positional Arguments:
56
+
57
+ Options:
58
+ -fc, --filter-calid filter for specific structure.
59
+ -fl, --filter-list filter for specified structures in txt file.
60
+ -h, --help print this message and exit.
61
+
62
+ {EXAMPLES}
63
+ """
64
+
65
+ def getBridgeList(headers, start_page=1, totalpages=3, pagesize=10, totalbridges=24, page_nums=None, **kwds):
66
+ url = 'https://infobridge.fhwa.dot.gov/Data/GetAllBridges'
67
+
68
+ payload = {
69
+ "isShowBridgesApplied":True,
70
+ "gridParam": {
71
+ "isShowBridgesApplied":True, "IsFilterApplied":False, "SelectedFilters":None,
72
+ "SortOrder":"asc", "SortIndex": "STATE_CODE",
73
+ }
74
+ }
75
+
76
+ pages = []
77
+ def filter(row):
78
+ return int(row["STATE_CODE"]) > 0
79
+
80
+ if page_nums is None:
81
+ page_nums = range(start_page, totalpages + 1)
82
+
83
+ for pageno in page_nums:
84
+ try:
85
+ payload["gridParam"]["PageNumber"] = pageno
86
+ payload["gridParam"]["PageSize"] = pagesize
87
+
88
+ r = requests.post(url, headers=headers, data=json.dumps(payload))
89
+
90
+ if r.status_code == 200:
91
+ try:
92
+ resp = json.loads(eval(r.content.decode('utf-8'))) # [1:-1].replace("\\", ""))
93
+ except:
94
+ print(f"Failed to get page {pageno}", file=sys.stderr)
95
+ continue
96
+
97
+ bridges = [
98
+ {'BRIDGE_YEARLY_ID': row['BRIDGE_YEARLY_ID'],
99
+ 'STRUCTURE_NUMBER': row['STRUCTURE_NUMBER'].strip()}
100
+ for row in resp["Results"]["rows"] # if filter(row)
101
+ ]
102
+ pages.extend(bridges)
103
+ print(pageno, len(pages), len(bridges), resp["Results"]["rows"][-1]["STATE_NAME"], file=sys.stderr)
104
+
105
+ except KeyboardInterrupt:
106
+ break
107
+
108
+ return pages
109
+
110
+
111
+ def getNBIData(headers, bridgeTable, years, tab="NBI",
112
+ keep_query=False):
113
+
114
+ url = 'https://infobridge.fhwa.dot.gov/Data/getBridgeInformation'
115
+
116
+ _headers = headers.copy()
117
+ # payload = {
118
+ # "requestModel": {
119
+ # "SELECTED_TAB": "OverviewTab",
120
+ # "SELECTED_YEAR_ID": None,
121
+ # "IS_NEW_RECORD": True,
122
+ # "IS_YEAR_SELECTED": False,
123
+ # "Is_Overview_Bridge_Selected": False,
124
+ # "SELECTED_YEAR": None,
125
+ # "CURRENT_YEARLY_ID": "25099893",
126
+ # "IS_NBI_TREE_SELECTED": False,
127
+ # "Folder_Name": None,
128
+ # "tabChange": False,
129
+ # "BRIDGE_YEARLY_ID": "25099893",
130
+ # "NEW_BRIDGE_ID": 58813,
131
+ # "SELECTED_NDE_TAB": "General"
132
+ # }
133
+ # }
134
+
135
+ payload = {
136
+ "requestModel":{
137
+ "SELECTED_TAB": f"{tab}Tab",
138
+ "SELECTED_YEAR_ID": None,
139
+ "IS_NEW_RECORD": False,
140
+ "IS_YEAR_SELECTED": False,
141
+ "Is_Overview_Bridge_Selected": False,
142
+ "NEW_BRIDGE_ID": 0,
143
+ "STRUCTURE_NUMBER": None,
144
+ "STATE_NAME": None,
145
+ "STATE_CODE": 0,
146
+ "IS_EXPERIMENTAL": False,
147
+ "SELECTED_NDE_TAB": "General",
148
+ #"MERRA_ID": 0,"IS_NBI_TREE_SELECTED": False,"Folder_Name": None,"tabChange": False,
149
+ }
150
+ }
151
+
152
+
153
+ referer = 'https://infobridge.fhwa.dot.gov/Data/BridgeDetail/'
154
+ data = {}
155
+
156
+ for i,bridge in enumerate(tqdm(bridgeTable)):
157
+
158
+ BRIDGE_YEARLY_ID = bridge['BRIDGE_YEARLY_ID']
159
+ STRUCTURE_NUMBER = bridge['STRUCTURE_NUMBER']
160
+
161
+ # data[STRUCTURE_NUMBER] = []
162
+
163
+ for year in years:
164
+ _headers['referer'] = referer + str(BRIDGE_YEARLY_ID)
165
+
166
+ payload["requestModel"].update({
167
+ "SELECTED_YEAR": year,
168
+ "CURRENT_YEARLY_ID": BRIDGE_YEARLY_ID,
169
+ "BRIDGE_YEARLY_ID": BRIDGE_YEARLY_ID,
170
+ })
171
+
172
+ r = requests.post(url, data=json.dumps(payload), headers=_headers)
173
+
174
+ if r.status_code == 200:
175
+ htmlcontent = r.content.decode('utf-8')
176
+ # print(data[STRUCTURE_NUMBER][0])
177
+ try:
178
+ data[STRUCTURE_NUMBER] = [{
179
+ k: (
180
+ v if k != "Results" else {
181
+ kk: vv for kk, vv in v.items() if (kk != "NBIDataQuery" or keep_query)
182
+ }
183
+ ) for k, v in json.loads(htmlcontent).items()
184
+ }]
185
+ except Exception as e:
186
+ print(f">> Error: {e}", file=sys.stderr)
187
+ continue
188
+
189
+ else:
190
+ print(f">> Error ({year}) {r.status_code}: {r.content}", file=sys.stderr)
191
+
192
+ if i % 500 == 0:
193
+ with open(f"nbi_data-{i}.json", "w") as f:
194
+ json.dump(data, f, indent=2)
195
+
196
+ return data
197
+
198
+
199
+ if __name__ == '__main__':
200
+ user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
201
+ request_verification_token = 'CfDJ8M6CuWz5hhxGnmUVXw2yDHQlfeNDzVoF03IbAJ0p3LdaDW7poklPvy74ykYda-qwcrtUXD4rnNzn583Ug7PWbR9IlomGzQh1OQIw_pa9d5TNwdN5p77SDfIfz3yq1nWPzxemEn_8bbh7TGGK9FIwcRY'
202
+ cookie = "_ga=GA1.1.478241025.1718907711; _ga_0623JYSC1Q=GS1.1.1718922743.2.0.1718922743.0.0.0; _ga_VW1SFWJKBB=GS1.1.1730789269.3.0.1730789272.0.0.0; _ga_CSLL4ZEK4L=GS1.1.1730789269.3.0.1730789272.0.0.0; _ga_NQ5ZN114SB=GS1.1.1730789269.3.0.1730789272.0.0.0; .AspNetCore.Session=CfDJ8M6CuWz5hhxGnmUVXw2yDHRQxNlIdqc8pBGKOJhMcHphMelhCyOQD7cnzYLVUWcsfCE8KOO8TNogarX5FbmvNQeSW1pTphWgR%2B6RLzPiUWuR4yPiDmb6rg82isfHqoEBhFoziXpFlU2o9pMgQICLsy7WbaeZbSgOl6FTg5Y0vLQ5; __RequestVerificationToken=CfDJ8M6CuWz5hhxGnmUVXw2yDHQXNjHWpjZ61I-CMSrl0yWsdWpCyt2QhUoeZ2L2aY0sqNpGy-wrD8ToMph6-wbfcRPpqORdlVci0ghxWu-3i4PCuWsiOkq90E1WupEYErSXnhsQVwHHGcD63WI7qyXZd7w; _ga_GNYE9X3V7H=GS1.1.1730825963.2.1.1730825988.0.0.0"
203
+
204
+ headers = {
205
+ 'authority': 'infobridge.fhwa.dot.gov',
206
+ 'origin': 'https://infobridge.fhwa.dot.gov',
207
+ 'sec-fetch-site': 'same-origin',
208
+ 'sec-fetch-mode': 'cors',
209
+ 'accept-encoding': 'gzip, deflate, br',
210
+ 'accept-language': 'en-US,en;q=0.9',
211
+
212
+ '__requestverificationtoken': request_verification_token,
213
+ 'user-agent': user_agent,
214
+ 'cookie': cookie
215
+ }
216
+
217
+ if len(sys.argv) == 1:
218
+
219
+ headers.update({
220
+ 'x-requested-with': 'XMLHttpRequest',
221
+ 'content-type': 'application/json; charset=UTF-8',
222
+ 'accept': 'application/json, text/javascript, */*; q=0.01',
223
+ 'referer': 'https://infobridge.fhwa.dot.gov/Data',
224
+ })
225
+
226
+ bridgeTable = getBridgeList(headers, start_page=511, totalpages=808, pagesize=100)
227
+ print(json.dumps(bridgeTable, indent=2))
228
+ with open(f"nbi_codes-california-test.json","w") as f:
229
+ # with open(f"nbi_codes-california.json","w") as f:
230
+ json.dump(bridgeTable,f,indent=2)
231
+ sys.exit()
232
+
233
+ elif len(sys.argv) == 2:
234
+ headers.update({
235
+ 'datatype': 'json',
236
+ 'content-type': 'application/json; charset=UTF-8',
237
+ 'accept': 'application/json, text/plain, */*'
238
+ })
239
+ bridgeTable = json.load(open(sys.argv[1]))
240
+ bridgeTable = [
241
+ i for i in bridgeTable
242
+ if " " in i["STRUCTURE_NUMBER"] and len(i["STRUCTURE_NUMBER"]) in {7, 8}
243
+ ]
244
+
245
+ # calids = list(map(str.strip, open("init/calid.txt").readlines()))
246
+ # bridgeTable = [i for i in bridgeTable if i["STRUCTURE_NUMBER"] in calids]
247
+
248
+ nbi_data = getNBIData(headers, bridgeTable[:], years=(2024,)) #range(2020, 2024))
249
+ print(json.dumps(nbi_data, indent=2))
250
+ with open(f"nbi_data-california-test.json","w") as f:
251
+ # with open(f"nbi_data-california.json","w") as f:
252
+ json.dump(nbi_data,f,indent=2)
253
+
254
+ else:
255
+ arg1 = sys.argv[1]
256
+ args2 = iter(sys.argv[2:])
257
+
258
+ if arg1 in ["--help", "-h"]:
259
+ print(HELP)
260
+ sys.exit
261
+ else:
262
+ headers.update({
263
+ 'datatype': 'json',
264
+ 'content-type': 'application/json; charset=UTF-8',
265
+ 'accept': 'application/json, text/plain, */*'
266
+ })
267
+ bridgeTable = json.load(open(sys.argv[1]))
268
+ for arg in args2:
269
+ if arg in ["--help", "-h"]:
270
+ print(HELP)
271
+ sys.exit
272
+ elif arg in ["--filter-calid", "-fc"]:
273
+ calid = next(args2)
274
+ bridgeTable = [
275
+ i for i in bridgeTable
276
+ if calid in i["STRUCTURE_NUMBER"]
277
+ ]
278
+ file_ending = calid
279
+ elif arg in ["--filter-list", "-fl"]:
280
+ filename = next(args2)
281
+ with open(filename, 'r') as file:
282
+ # Check if this is dependent on a specific txt structure (currently 1 bridge/line)
283
+ calid = [line.strip() for line in file]
284
+ # print(calid)
285
+ bridgeTable = [
286
+ i for i in bridgeTable
287
+ if any(j in i["STRUCTURE_NUMBER"] for j in calid)
288
+ ]
289
+ # print(bridgeTable)
290
+ file_ending = Path(filename).name
291
+
292
+ # calids = list(map(str.strip, open("init/calid.txt").readlines()))
293
+ # bridgeTable = [i for i in bridgeTable if i["STRUCTURE_NUMBER"] in calids]
294
+
295
+ nbi_data = getNBIData(headers, bridgeTable[:], years=(2024,)) #range(2020, 2024))
296
+ print(json.dumps(nbi_data, indent=2))
297
+
298
+ # TODO: remove this and replace with arg parsing
299
+ tab = ...
300
+
301
+ with open(f"{tab}_data-{file_ending}.json","w") as f:
302
+ # with open(f"nbi_data-california.json","w") as f:
303
+ json.dump(nbi_data,f,indent=2)
304
+