Skip to content

Commit 065b71f

Browse files
committed
[nautobot] add support for interface roles to the excel interfaces... interface
1 parent a113ca6 commit 065b71f

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

projects/nautobot/uoft_nautobot/excel.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
from django.views.generic import View
55
from django.http import HttpResponse, StreamingHttpResponse
66
from django.shortcuts import render
7+
from django.contrib.contenttypes.models import ContentType
78
from tempfile import NamedTemporaryFile
89

910
from nautobot.dcim.models import Interface, Device
10-
from nautobot.extras.models import Status, Tag
11+
from nautobot.extras.models import Status, Tag, Role
1112
from nautobot.ipam.models import VLAN, VLANGroup, IPAddress
1213
from nautobot.dcim.models.device_components import (
1314
InterfaceModeChoices,
@@ -55,8 +56,10 @@ def __init__(self, pk) -> None:
5556
self.interface_types_inverse = {v: k for k, v in self.interface_types.items()}
5657
self.statuses = InterfaceStatusChoices.as_dict().values()
5758
self.vlan_modes = InterfaceModeChoices.values()
59+
_roles_ct = ContentType.objects.get(app_label="dcim", model="interface")
60+
self.valid_roles = list(Role.objects.filter(content_types=_roles_ct))
5861

59-
#
62+
#
6063
if self.device_obj.vlan_group:
6164
self.vlan_group = self.device_obj.vlan_group
6265
else:
@@ -82,6 +85,7 @@ def _vlan_to_string(vlan):
8285
{
8386
"Name": "name",
8487
"Status": "status.name",
88+
"Role": Coalesce("role.name", default=""),
8589
"Label": "label",
8690
"Type": ("type", lambda t: ctx.interface_types[t]),
8791
"Enabled": "enabled",
@@ -99,7 +103,6 @@ def _vlan_to_string(vlan):
99103
"ip_addresses",
100104
([("address", str)], lambda lst: "\n".join(lst)),
101105
),
102-
# intf["IP Addresses"] = "\n".join([str(ip) for ip in intf["ip_addresses"]])
103106
"Custom Fields": (
104107
"cf",
105108
(
@@ -156,6 +159,9 @@ def _vlan_to_string(vlan):
156159
dvws["D1"] = "valid vlans"
157160
for i, v in enumerate(ctx.valid_vlans):
158161
dvws[f"D{i+2}"] = _vlan_to_string(v)
162+
dvws["E1"] = "roles"
163+
for i, r in enumerate(ctx.valid_roles):
164+
dvws[f"E{i+2}"] = r.name
159165

160166
# boolean columns
161167
bool_dv = DataValidation(type="list", formula1='"TRUE,FALSE"')
@@ -166,18 +172,14 @@ def _vlan_to_string(vlan):
166172
bool_dv.add(f"{col_letter}2:{col_letter}{length}")
167173

168174
# LAG column
169-
lag_dv = DataValidation(
170-
type="list", formula1=f"'Interfaces'!$A$2:$A${length}", allow_blank=True
171-
)
175+
lag_dv = DataValidation(type="list", formula1=f"'Interfaces'!$A$2:$A${length}", allow_blank=True)
172176
lag_dv.hide_drop_down = False
173177
ws.add_data_validation(lag_dv)
174178
col_letter = get_column_letter(columns_by_name["LAG"])
175179
lag_dv.add(f"{col_letter}2:{col_letter}{length}")
176180

177181
# status
178-
status_dv = DataValidation(
179-
type="list", formula1=f"'_data_validation_lists'!$A$2:$A${len(ctx.statuses)+1}"
180-
)
182+
status_dv = DataValidation(type="list", formula1=f"'_data_validation_lists'!$A$2:$A${len(ctx.statuses)+1}")
181183
status_dv.hide_drop_down = False
182184
ws.add_data_validation(status_dv)
183185
col_letter = get_column_letter(columns_by_name["Status"])
@@ -215,6 +217,17 @@ def _vlan_to_string(vlan):
215217
col_letter = get_column_letter(columns_by_name["Untagged VLAN"])
216218
vlans_dv.add(f"{col_letter}2:{col_letter}{length}")
217219

220+
# roles
221+
roles_dv = DataValidation(
222+
type="list",
223+
formula1=f"'_data_validation_lists'!$E$2:$E${len(ctx.valid_roles)+1}",
224+
allow_blank=True,
225+
)
226+
roles_dv.hide_drop_down = False
227+
ws.add_data_validation(roles_dv)
228+
col_letter = get_column_letter(columns_by_name["Role"])
229+
roles_dv.add(f"{col_letter}2:{col_letter}{length}")
230+
218231
with NamedTemporaryFile() as tmp:
219232
wb.save(tmp.name)
220233
tmp.seek(0)
@@ -256,9 +269,7 @@ def _parse_ipaddress_list(ips: str):
256269
if not ips:
257270
return []
258271
return [
259-
IPAddress.objects.get_or_create(
260-
address=ip, defaults=dict(status=Status.objects.get(name="Active"))
261-
)[0]
272+
IPAddress.objects.get_or_create(address=ip, defaults=dict(status=Status.objects.get(name="Active")))[0]
262273
for ip in ips.split("\n")
263274
]
264275

@@ -283,12 +294,11 @@ def _parse_tags(tags):
283294
),
284295
"label": ("Label", lambda l: l if l else ""),
285296
"type": ("Type", lambda t: ctx.interface_types_inverse[t]),
297+
"role": ("Role", lambda r: Role.objects.get(name=r) if r else None),
286298
"enabled": "Enabled",
287299
"lag": (
288300
"LAG",
289-
lambda l: Interface.objects.get(name=l, device_id=pk)
290-
if l
291-
else None,
301+
lambda l: Interface.objects.get(name=l, device_id=pk) if l else None,
292302
),
293303
"mgmt_only": "Management Only",
294304
"description": ("Description", lambda d: d if d else ""),
@@ -366,9 +376,7 @@ def excel_processing():
366376
# We've been sent here by the widget on the device page
367377
# but the data we've been sent here with failed server-side validation.
368378
# We need to render the form again, but with the errors from the form included
369-
form_html = render(
370-
request, "device_interfaces_excel.html", {"form": form, "pk": pk}
371-
)
379+
form_html = render(request, "device_interfaces_excel.html", {"form": form, "pk": pk})
372380
return form_html
373381
# return HttpResponse(f"<div class='alert alert-danger'>Invalid file format. Please try again and make sure you're uploading a .xlsx file</div>{form_html.content}")
374382

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy