template_code.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. LINKTERMINATION = """
  2. {% for termination in value %}
  3. {% if termination.parent_object %}
  4. <a href="{{ termination.parent_object.get_absolute_url }}">{{ termination.parent_object }}</a>
  5. <i class="mdi mdi-chevron-right"></i>
  6. {% endif %}
  7. <a href="{{ termination.get_absolute_url }}">{{ termination }}</a>{% if not forloop.last %}<br />{% endif %}
  8. {% empty %}
  9. {{ ''|placeholder }}
  10. {% endfor %}
  11. """
  12. CABLE_LENGTH = """
  13. {% load helpers %}
  14. {% if record.length %}{{ record.length|floatformat:"-2" }} {{ record.length_unit }}{% endif %}
  15. """
  16. WEIGHT = """
  17. {% load helpers %}
  18. {% if value %}{{ value|floatformat:"-2" }} {{ record.weight_unit }}{% endif %}
  19. """
  20. DEVICE_LINK = """
  21. {{ value|default:'<span class="badge bg-info">Unnamed device</span>' }}
  22. """
  23. DEVICEBAY_STATUS = """
  24. {% if record.installed_device_id %}
  25. <span class="badge bg-{{ record.installed_device.get_status_color }}">
  26. {{ record.installed_device.get_status_display }}
  27. </span>
  28. {% else %}
  29. <span class="badge bg-secondary">Vacant</span>
  30. {% endif %}
  31. """
  32. INTERFACE_IPADDRESSES = """
  33. <div class="table-badge-group">
  34. {% if value.count >= 3 %}
  35. <a href="{% url 'ipam:ipaddress_list' %}?{{ record|meta:"model_name" }}_id={{ record.pk }}">{{ value.count }}</a>
  36. {% else %}
  37. {% for ip in value.all %}
  38. {% if ip.status != 'active' %}
  39. <a href="{{ ip.get_absolute_url }}" class="table-badge badge bg-{{ ip.get_status_color }}" data-bs-toggle="tooltip" data-bs-placement="left" title="{{ ip.get_status_display }}">{{ ip }}</a>
  40. {% else %}
  41. <a href="{{ ip.get_absolute_url }}" class="table-badge">{{ ip }}</a>
  42. {% endif %}
  43. {% endfor %}
  44. {% endif %}
  45. </div>
  46. """
  47. INTERFACE_FHRPGROUPS = """
  48. <div class="table-badge-group">
  49. {% for assignment in value.all %}
  50. <a href="{{ assignment.group.get_absolute_url }}">{{ assignment.group.get_protocol_display }}: {{ assignment.group.group_id }}</a>
  51. {% endfor %}
  52. </div>
  53. """
  54. INTERFACE_TAGGED_VLANS = """
  55. {% if record.mode == 'tagged' %}
  56. {% for vlan in value.all %}
  57. <a href="{{ vlan.get_absolute_url }}">{{ vlan }}</a><br />
  58. {% endfor %}
  59. {% elif record.mode == 'tagged-all' %}
  60. All
  61. {% endif %}
  62. """
  63. INTERFACE_WIRELESS_LANS = """
  64. {% for wlan in value.all %}
  65. <a href="{{ wlan.get_absolute_url }}">{{ wlan }}</a><br />
  66. {% endfor %}
  67. """
  68. POWERFEED_CABLE = """
  69. <a href="{{ value.get_absolute_url }}">{{ value }}</a>
  70. <a href="{% url 'dcim:powerfeed_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace">
  71. <i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i>
  72. </a>
  73. """
  74. POWERFEED_CABLETERMINATION = """
  75. <a href="{{ value.parent_object.get_absolute_url }}">{{ value.parent_object }}</a>
  76. <i class="mdi mdi-chevron-right"></i>
  77. <a href="{{ value.get_absolute_url }}">{{ value }}</a>
  78. """
  79. LOCATION_BUTTONS = """
  80. <a href="{% url 'dcim:rack_elevation_list' %}?site={{ record.site.slug }}&location_id={{ record.pk }}" class="btn btn-sm btn-primary" title="View elevations">
  81. <i class="mdi mdi-server"></i>
  82. </a>
  83. """
  84. #
  85. # Device component templatebuttons
  86. #
  87. MODULAR_COMPONENT_TEMPLATE_BUTTONS = """
  88. {% load helpers %}
  89. {% if perms.dcim.add_inventoryitemtemplate and record.device_type_id %}
  90. <a href="{% url 'dcim:inventoryitemtemplate_add' %}?device_type={{ record.device_type_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={{ request.path }}" title="Add inventory item" class="btn btn-primary btn-sm">
  91. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  92. </a>
  93. {% endif %}
  94. """
  95. #
  96. # Device component buttons
  97. #
  98. CONSOLEPORT_BUTTONS = """
  99. {% if perms.dcim.add_inventoryitem %}
  100. <a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-sm btn-success" title="Add inventory item">
  101. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  102. </a>
  103. {% endif %}
  104. {% if record.cable %}
  105. <a href="{% url 'dcim:consoleport_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  106. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  107. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  108. <span class="dropdown">
  109. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  110. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  111. </button>
  112. <ul class="dropdown-menu dropdown-menu-end">
  113. {% if perms.dcim.change_cable %}
  114. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}">
  115. <i class="mdi mdi-pencil-outline"></i>
  116. Edit cable
  117. </a>
  118. </li>
  119. {% endif %}
  120. {% if perms.dcim.delete_cable %}
  121. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}">
  122. <i class="mdi mdi-trash-can-outline"></i>
  123. Delete cable
  124. </a>
  125. </li>
  126. {% endif %}
  127. </ul>
  128. </span>
  129. {% endif %}
  130. {% elif perms.dcim.add_cable %}
  131. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  132. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  133. <span class="dropdown">
  134. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  135. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  136. </button>
  137. <ul class="dropdown-menu dropdown-menu-end">
  138. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ record.pk }}&b_terminations_type=dcim.consoleserverport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Console Server Port</a></li>
  139. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ record.pk }}&b_terminations_type=dcim.frontport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Front Port</a></li>
  140. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ record.pk }}&b_terminations_type=dcim.rearport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Rear Port</a></li>
  141. </ul>
  142. </span>
  143. {% else %}
  144. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  145. {% endif %}
  146. """
  147. CONSOLESERVERPORT_BUTTONS = """
  148. {% if perms.dcim.add_inventoryitem %}
  149. <a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-sm btn-success" title="Add inventory item">
  150. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  151. </a>
  152. {% endif %}
  153. {% if record.cable %}
  154. <a href="{% url 'dcim:consoleserverport_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  155. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  156. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  157. <span class="dropdown">
  158. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  159. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  160. </button>
  161. <ul class="dropdown-menu dropdown-menu-end">
  162. {% if perms.dcim.change_cable %}
  163. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">
  164. <i class="mdi mdi-pencil-outline"></i>
  165. Edit cable
  166. </a>
  167. </li>
  168. {% endif %}
  169. {% if perms.dcim.delete_cable %}
  170. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">
  171. <i class="mdi mdi-trash-can-outline"></i>
  172. Delete cable
  173. </a>
  174. </li>
  175. {% endif %}
  176. </ul>
  177. </span>
  178. {% endif %}
  179. {% elif perms.dcim.add_cable %}
  180. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  181. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  182. <span class="dropdown">
  183. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  184. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  185. </button>
  186. <ul class="dropdown-menu dropdown-menu-end">
  187. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ record.pk }}&b_terminations_type=dcim.consoleport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Console Port</a></li>
  188. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ record.pk }}&b_terminations_type=dcim.frontport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Front Port</a></li>
  189. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ record.pk }}&b_terminations_type=dcim.rearport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Rear Port</a></li>
  190. </ul>
  191. </span>
  192. {% else %}
  193. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  194. {% endif %}
  195. """
  196. POWERPORT_BUTTONS = """
  197. {% if perms.dcim.add_inventoryitem %}
  198. <a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
  199. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  200. </a>
  201. {% endif %}
  202. {% if record.cable %}
  203. <a href="{% url 'dcim:powerport_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  204. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  205. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  206. <span class="dropdown">
  207. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  208. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  209. </button>
  210. <ul class="dropdown-menu dropdown-menu-end">
  211. {% if perms.dcim.change_cable %}
  212. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}">
  213. <i class="mdi mdi-pencil-outline"></i>
  214. Edit cable
  215. </a>
  216. </li>
  217. {% endif %}
  218. {% if perms.dcim.delete_cable %}
  219. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}">
  220. <i class="mdi mdi-trash-can-outline"></i>
  221. Delete cable
  222. </a>
  223. </li>
  224. {% endif %}
  225. </ul>
  226. </span>
  227. {% endif %}
  228. {% elif perms.dcim.add_cable %}
  229. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  230. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  231. <span class="dropdown">
  232. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  233. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  234. </button>
  235. <ul class="dropdown-menu dropdown-menu-end">
  236. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerport&a_terminations={{ record.pk }}&b_terminations_type=dcim.poweroutlet&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}">Power Outlet</a></li>
  237. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerport&a_terminations={{ record.pk }}&b_terminations_type=dcim.powerfeed&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}">Power Feed</a></li>
  238. </ul>
  239. </span>
  240. {% else %}
  241. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  242. {% endif %}
  243. """
  244. POWEROUTLET_BUTTONS = """
  245. {% if perms.dcim.add_inventoryitem %}
  246. <a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
  247. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  248. </a>
  249. {% endif %}
  250. {% if record.cable %}
  251. <a href="{% url 'dcim:poweroutlet_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  252. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  253. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  254. <span class="dropdown">
  255. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  256. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  257. </button>
  258. <ul class="dropdown-menu dropdown-menu-end">
  259. {% if perms.dcim.change_cable %}
  260. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}">
  261. <i class="mdi mdi-pencil-outline"></i>
  262. Edit cable
  263. </a>
  264. </li>
  265. {% endif %}
  266. {% if perms.dcim.delete_cable %}
  267. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}">
  268. <i class="mdi mdi-trash-can-outline"></i>
  269. Delete cable
  270. </a>
  271. </li>
  272. {% endif %}
  273. </ul>
  274. </span>
  275. {% endif %}
  276. {% elif perms.dcim.add_cable %}
  277. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  278. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  279. {% if not record.mark_connected %}
  280. <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.poweroutlet&a_terminations={{ record.pk }}&b_terminations_type=dcim.powerport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" title="Connect" class="btn btn-success btn-sm">
  281. <i class="mdi mdi-ethernet-cable" aria-hidden="true"></i>
  282. </a>
  283. {% else %}
  284. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  285. {% endif %}
  286. {% endif %}
  287. """
  288. INTERFACE_BUTTONS = """
  289. {% if perms.dcim.change_interface %}
  290. <span class="dropdown">
  291. <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Add">
  292. <span class="mdi mdi-plus-thick" aria-hidden="true"></span>
  293. </button>
  294. <ul class="dropdown-menu dropdown-menu-end">
  295. {% if perms.ipam.add_ipaddress %}
  296. <li><a class="dropdown-item" href="{% url 'ipam:ipaddress_add' %}?interface={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">IP Address</a></li>
  297. {% endif %}
  298. {% if perms.dcim.add_inventoryitem %}
  299. <li><a class="dropdown-item" href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Inventory Item</a></li>
  300. {% endif %}
  301. {% if perms.dcim.add_interface %}
  302. <li><a class="dropdown-item" href="{% url 'dcim:interface_add' %}?device={{ record.device_id }}&parent={{ record.pk }}&name={{ record.name }}.&type=virtual&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Child Interface</a></li>
  303. {% endif %}
  304. {% if perms.vpn.add_l2vpntermination %}
  305. <li><a class="dropdown-item" href="{% url 'vpn:l2vpntermination_add' %}?device={{ object.pk }}&interface={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">L2VPN Termination</a></li>
  306. {% endif %}
  307. {% if perms.ipam.add_fhrpgroupassignment %}
  308. <li><a class="dropdown-item" href="{% url 'ipam:fhrpgroupassignment_add' %}?interface_type={{ record|content_type_id }}&interface_id={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Assign FHRP Group</a></li>
  309. {% endif %}
  310. </ul>
  311. </span>
  312. {% endif %}
  313. {% if record.link %}
  314. <a href="{% url 'dcim:interface_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  315. {% endif %}
  316. {% if record.cable %}
  317. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  318. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  319. <span class="dropdown">
  320. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  321. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  322. </button>
  323. <ul class="dropdown-menu dropdown-menu-end">
  324. {% if perms.dcim.change_cable %}
  325. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}">
  326. <i class="mdi mdi-pencil-outline"></i>
  327. Edit cable
  328. </a>
  329. </li>
  330. {% endif %}
  331. {% if perms.dcim.delete_cable %}
  332. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}">
  333. <i class="mdi mdi-trash-can-outline"></i>
  334. Delete cable
  335. </a>
  336. </li>
  337. {% endif %}
  338. </ul>
  339. </span>
  340. {% endif %}
  341. {% elif record.wireless_link %}
  342. {% if perms.wireless.delete_wirelesslink %}
  343. <a href="{% url 'wireless:wirelesslink_delete' pk=record.wireless_link.pk %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" title="Delete wireless link" class="btn btn-danger btn-sm">
  344. <i class="mdi mdi-wifi-off" aria-hidden="true"></i>
  345. </a>
  346. {% endif %}
  347. {% elif record.type == 'virtual' %}
  348. {% if perms.vpn.add_tunnel and not record.tunnel_termination %}
  349. <a href="{% url 'vpn:tunnel_add' %}?termination1_type=dcim.device&termination1_parent={{ record.device.pk }}&termination1_termination={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" title="Create a tunnel" class="btn btn-success btn-sm">
  350. <i class="mdi mdi-tunnel-outline" aria-hidden="true"></i>
  351. </a>
  352. {% elif perms.vpn.delete_tunneltermination and record.tunnel_termination %}
  353. <a href="{% url 'vpn:tunneltermination_delete' pk=record.tunnel_termination.pk %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" title="Remove tunnel" class="btn btn-danger btn-sm">
  354. <i class="mdi mdi-tunnel-outline" aria-hidden="true"></i>
  355. </a>
  356. {% endif %}
  357. {% elif record.is_wired and perms.dcim.add_cable %}
  358. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  359. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  360. {% if not record.mark_connected %}
  361. <span class="dropdown">
  362. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Connect cable">
  363. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  364. </button>
  365. <ul class="dropdown-menu dropdown-menu-end">
  366. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ record.pk }}&b_terminations_type=dcim.interface&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Interface</a></li>
  367. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ record.pk }}&b_terminations_type=dcim.frontport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Front Port</a></li>
  368. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ record.pk }}&b_terminations_type=dcim.rearport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Rear Port</a></li>
  369. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ record.pk }}&b_terminations_type=circuits.circuittermination&termination_b_site={{ object.site.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Circuit Termination</a></li>
  370. </ul>
  371. </span>
  372. {% else %}
  373. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  374. {% endif %}
  375. {% elif record.is_wireless and perms.wireless.add_wirelesslink %}
  376. <a href="{% url 'wireless:wirelesslink_add' %}?site_a={{ record.device.site.pk }}&location_a={{ record.device.location.pk }}&device_a={{ record.device_id }}&interface_a={{ record.pk }}&site_b={{ record.device.site.pk }}&location_b={{ record.device.location.pk }}" class="btn btn-success btn-sm">
  377. <span class="mdi mdi-wifi-plus" aria-hidden="true"></span>
  378. </a>
  379. {% endif %}
  380. """
  381. FRONTPORT_BUTTONS = """
  382. {% if perms.dcim.add_inventoryitem %}
  383. <a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
  384. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  385. </a>
  386. {% endif %}
  387. {% if record.cable %}
  388. <a href="{% url 'dcim:frontport_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  389. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  390. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  391. <span class="dropdown">
  392. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  393. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  394. </button>
  395. <ul class="dropdown-menu dropdown-menu-end">
  396. {% if perms.dcim.change_cable %}
  397. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">
  398. <i class="mdi mdi-pencil-outline"></i>
  399. Edit cable
  400. </a>
  401. </li>
  402. {% endif %}
  403. {% if perms.dcim.delete_cable %}
  404. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">
  405. <i class="mdi mdi-trash-can-outline"></i>
  406. Delete cable
  407. </a>
  408. </li>
  409. {% endif %}
  410. </ul>
  411. </span>
  412. {% endif %}
  413. {% elif perms.dcim.add_cable %}
  414. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  415. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  416. {% if not record.mark_connected %}
  417. <span class="dropdown">
  418. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  419. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  420. </button>
  421. <ul class="dropdown-menu dropdown-menu-end">
  422. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.frontport&a_terminations={{ record.pk }}&b_terminations_type=dcim.interface&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Interface</a></li>
  423. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.frontport&a_terminations={{ record.pk }}&b_terminations_type=dcim.consoleserverport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Console Server Port</a></li>
  424. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.frontport&a_terminations={{ record.pk }}&b_terminations_type=dcim.consoleport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Console Port</a></li>
  425. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.frontport&a_terminations={{ record.pk }}&b_terminations_type=dcim.frontport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Front Port</a></li>
  426. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.frontport&a_terminations={{ record.pk }}&b_terminations_type=dcim.rearport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Rear Port</a></li>
  427. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.frontport&a_terminations={{ record.pk }}&b_terminations_type=circuits.circuittermination&termination_b_site={{ object.site.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Circuit Termination</a></li>
  428. </ul>
  429. </span>
  430. {% else %}
  431. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  432. {% endif %}
  433. {% endif %}
  434. """
  435. REARPORT_BUTTONS = """
  436. {% if perms.dcim.add_inventoryitem %}
  437. <a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
  438. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  439. </a>
  440. {% endif %}
  441. {% if record.cable %}
  442. <a href="{% url 'dcim:rearport_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace"><i class="mdi mdi-transit-connection-variant"></i></a>
  443. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  444. {% if perms.dcim.change_cable or perms.dcim.delete_cable %}
  445. <span class="dropdown">
  446. <button type="button" class="btn btn-warning btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  447. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  448. </button>
  449. <ul class="dropdown-menu dropdown-menu-end">
  450. {% if perms.dcim.change_cable %}
  451. <li><a class="dropdown-item" href="{% url 'dcim:cable_edit' pk=record.cable.pk %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}">
  452. <i class="mdi mdi-pencil-outline"></i>
  453. Edit cable
  454. </a>
  455. </li>
  456. {% endif %}
  457. {% if perms.dcim.delete_cable %}
  458. <li><a class="dropdown-item" href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}">
  459. <i class="mdi mdi-trash-can-outline"></i>
  460. Delete cable
  461. </a>
  462. </li>
  463. {% endif %}
  464. </ul>
  465. </span>
  466. {% endif %}
  467. {% elif perms.dcim.add_cable %}
  468. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  469. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  470. {% if not record.mark_connected %}
  471. <span class="dropdown">
  472. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  473. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  474. </button>
  475. <ul class="dropdown-menu dropdown-menu-end">
  476. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.rearport&a_terminations={{ record.pk }}&b_terminations_type=dcim.interface&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Interface</a></li>
  477. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.rearport&a_terminations={{ record.pk }}&b_terminations_type=dcim.consoleserverport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Console Server Port</a></li>
  478. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.rearport&a_terminations={{ record.pk }}&b_terminations_type=dcim.consoleport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Console Port</a></li>
  479. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.rearport&a_terminations={{ record.pk }}&b_terminations_type=dcim.frontport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Front Port</a></li>
  480. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.rearport&a_terminations={{ record.pk }}&b_terminations_type=dcim.rearport&termination_b_site={{ object.site.pk }}&termination_b_rack={{ object.rack.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Rear Port</a></li>
  481. <li><a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.rearport&a_terminations={{ record.pk }}&b_terminations_type=circuits.circuittermination&termination_b_site={{ object.site.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Circuit Termination</a></li>
  482. </ul>
  483. </span>
  484. {% else %}
  485. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  486. {% endif %}
  487. {% endif %}
  488. """
  489. DEVICEBAY_BUTTONS = """
  490. {% if perms.dcim.change_devicebay %}
  491. {% if record.installed_device %}
  492. <a href="{% url 'dcim:devicebay_depopulate' pk=record.pk %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-danger btn-sm">
  493. <i class="mdi mdi-server-minus" aria-hidden="true" title="Remove device"></i>
  494. </a>
  495. {% else %}
  496. <a href="{% url 'dcim:devicebay_populate' pk=record.pk %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-success btn-sm">
  497. <i class="mdi mdi-server-plus" aria-hidden="true" title="Install device"></i>
  498. </a>
  499. {% endif %}
  500. {% endif %}
  501. """
  502. MODULEBAY_BUTTONS = """
  503. {% if perms.dcim.add_module %}
  504. {% if record.installed_module %}
  505. <a href="{% url 'dcim:module_delete' pk=record.installed_module.pk %}?return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-danger btn-sm">
  506. <i class="mdi mdi-server-minus" aria-hidden="true" title="Remove module"></i>
  507. </a>
  508. {% else %}
  509. <a href="{% url 'dcim:module_add' %}?device={{ record.device_id }}&module_bay={{ record.pk }}&manufacturer={{ object.device_type.manufacturer_id }}&return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-success btn-sm">
  510. <i class="mdi mdi-server-plus" aria-hidden="true" title="Install module"></i>
  511. </a>
  512. {% endif %}
  513. {% endif %}
  514. """