template_code.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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|simplify_decimal }} {{ record.length_unit }}{% endif %}
  15. """
  16. DEVICE_WEIGHT = """
  17. {% load helpers %}
  18. {% if record.weight %}{{ record.weight|simplify_decimal }} {{ record.weight_unit }}{% endif %}
  19. """
  20. DEVICE_LINK = """
  21. <a href="{% url 'dcim:device' pk=record.pk %}">
  22. {{ record.name|default:'<span class="badge bg-info">Unnamed device</span>' }}
  23. </a>
  24. """
  25. DEVICEBAY_STATUS = """
  26. {% if record.installed_device_id %}
  27. <span class="badge bg-{{ record.installed_device.get_status_color }}">
  28. {{ record.installed_device.get_status_display }}
  29. </span>
  30. {% else %}
  31. <span class="badge bg-secondary">Vacant</span>
  32. {% endif %}
  33. """
  34. INTERFACE_IPADDRESSES = """
  35. <div class="table-badge-group">
  36. {% for ip in value.all %}
  37. {% if ip.status != 'active' %}
  38. <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>
  39. {% else %}
  40. <a href="{{ ip.get_absolute_url }}" class="table-badge">{{ ip }}</a>
  41. {% endif %}
  42. {% endfor %}
  43. </div>
  44. """
  45. INTERFACE_FHRPGROUPS = """
  46. <div class="table-badge-group">
  47. {% for assignment in value.all %}
  48. <a href="{{ assignment.group.get_absolute_url }}">{{ assignment.group.get_protocol_display }}: {{ assignment.group.group_id }}</a>
  49. {% endfor %}
  50. </div>
  51. """
  52. INTERFACE_TAGGED_VLANS = """
  53. {% if record.mode == 'tagged' %}
  54. {% for vlan in value.all %}
  55. <a href="{{ vlan.get_absolute_url }}">{{ vlan }}</a><br />
  56. {% endfor %}
  57. {% elif record.mode == 'tagged-all' %}
  58. All
  59. {% endif %}
  60. """
  61. INTERFACE_WIRELESS_LANS = """
  62. {% for wlan in value.all %}
  63. <a href="{{ wlan.get_absolute_url }}">{{ wlan }}</a><br />
  64. {% endfor %}
  65. """
  66. POWERFEED_CABLE = """
  67. <a href="{{ value.get_absolute_url }}">{{ value }}</a>
  68. <a href="{% url 'dcim:powerfeed_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace">
  69. <i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i>
  70. </a>
  71. """
  72. POWERFEED_CABLETERMINATION = """
  73. <a href="{{ value.parent_object.get_absolute_url }}">{{ value.parent_object }}</a>
  74. <i class="mdi mdi-chevron-right"></i>
  75. <a href="{{ value.get_absolute_url }}">{{ value }}</a>
  76. """
  77. LOCATION_BUTTONS = """
  78. <a href="{% url 'dcim:rack_elevation_list' %}?site={{ record.site.slug }}&location_id={{ record.pk }}" class="btn btn-sm btn-primary" title="View elevations">
  79. <i class="mdi mdi-server"></i>
  80. </a>
  81. """
  82. #
  83. # Device component templatebuttons
  84. #
  85. MODULAR_COMPONENT_TEMPLATE_BUTTONS = """
  86. {% load helpers %}
  87. {% if perms.dcim.add_inventoryitemtemplate and record.device_type_id %}
  88. <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">
  89. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  90. </a>
  91. {% endif %}
  92. """
  93. #
  94. # Device component buttons
  95. #
  96. CONSOLEPORT_BUTTONS = """
  97. {% if perms.dcim.add_inventoryitem %}
  98. <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">
  99. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  100. </a>
  101. {% endif %}
  102. {% if record.cable %}
  103. <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>
  104. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  105. {% if perms.dcim.delete_cable %}
  106. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  107. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  108. </a>
  109. {% endif %}
  110. {% elif perms.dcim.add_cable %}
  111. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  112. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  113. <span class="dropdown">
  114. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  115. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  116. </button>
  117. <ul class="dropdown-menu dropdown-menu-end">
  118. <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>
  119. <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>
  120. <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>
  121. </ul>
  122. </span>
  123. {% else %}
  124. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  125. {% endif %}
  126. """
  127. CONSOLESERVERPORT_BUTTONS = """
  128. {% if perms.dcim.add_inventoryitem %}
  129. <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">
  130. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  131. </a>
  132. {% endif %}
  133. {% if record.cable %}
  134. <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>
  135. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  136. {% if perms.dcim.delete_cable %}
  137. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  138. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  139. </a>
  140. {% endif %}
  141. {% elif perms.dcim.add_cable %}
  142. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  143. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  144. <span class="dropdown">
  145. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  146. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  147. </button>
  148. <ul class="dropdown-menu dropdown-menu-end">
  149. <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>
  150. <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>
  151. <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>
  152. </ul>
  153. </span>
  154. {% else %}
  155. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  156. {% endif %}
  157. """
  158. POWERPORT_BUTTONS = """
  159. {% if perms.dcim.add_inventoryitem %}
  160. <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">
  161. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  162. </a>
  163. {% endif %}
  164. {% if record.cable %}
  165. <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>
  166. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  167. {% if perms.dcim.delete_cable %}
  168. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  169. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  170. </a>
  171. {% endif %}
  172. {% elif perms.dcim.add_cable %}
  173. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  174. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  175. <span class="dropdown">
  176. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  177. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  178. </button>
  179. <ul class="dropdown-menu dropdown-menu-end">
  180. <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>
  181. <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>
  182. </ul>
  183. </span>
  184. {% else %}
  185. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  186. {% endif %}
  187. """
  188. POWEROUTLET_BUTTONS = """
  189. {% if perms.dcim.add_inventoryitem %}
  190. <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">
  191. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  192. </a>
  193. {% endif %}
  194. {% if record.cable %}
  195. <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>
  196. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  197. {% if perms.dcim.delete_cable %}
  198. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  199. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  200. </a>
  201. {% endif %}
  202. {% elif perms.dcim.add_cable %}
  203. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  204. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  205. {% if not record.mark_connected %}
  206. <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">
  207. <i class="mdi mdi-ethernet-cable" aria-hidden="true"></i>
  208. </a>
  209. {% else %}
  210. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  211. {% endif %}
  212. {% endif %}
  213. """
  214. INTERFACE_BUTTONS = """
  215. {% if perms.dcim.change_interface %}
  216. <span class="dropdown">
  217. <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Add">
  218. <span class="mdi mdi-plus-thick" aria-hidden="true"></span>
  219. </button>
  220. <ul class="dropdown-menu dropdown-menu-end">
  221. {% if perms.ipam.add_ipaddress %}
  222. <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>
  223. {% endif %}
  224. {% if perms.dcim.add_inventoryitem %}
  225. <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>
  226. {% endif %}
  227. {% if perms.dcim.add_interface %}
  228. <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>
  229. {% endif %}
  230. {% if perms.ipam.add_l2vpntermination %}
  231. <li><a class="dropdown-item" href="{% url 'ipam:l2vpntermination_add' %}?device={{ object.pk }}&interface={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">L2VPN Termination</a></li>
  232. {% endif %}
  233. {% if perms.ipam.add_fhrpgroupassignment %}
  234. <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>
  235. {% endif %}
  236. </ul>
  237. </span>
  238. {% endif %}
  239. {% if record.link %}
  240. <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>
  241. {% endif %}
  242. {% if record.cable %}
  243. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  244. {% if perms.dcim.delete_cable %}
  245. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  246. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  247. </a>
  248. {% endif %}
  249. {% elif record.wireless_link %}
  250. {% if perms.wireless.delete_wirelesslink %}
  251. <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">
  252. <i class="mdi mdi-wifi-off" aria-hidden="true"></i>
  253. </a>
  254. {% endif %}
  255. {% elif record.is_wired and perms.dcim.add_cable %}
  256. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  257. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  258. {% if not record.mark_connected %}
  259. <span class="dropdown">
  260. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Connect cable">
  261. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  262. </button>
  263. <ul class="dropdown-menu dropdown-menu-end">
  264. <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>
  265. <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>
  266. <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>
  267. <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>
  268. </ul>
  269. </span>
  270. {% else %}
  271. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  272. {% endif %}
  273. {% elif record.is_wireless and perms.wireless.add_wirelesslink %}
  274. <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">
  275. <span class="mdi mdi-wifi-plus" aria-hidden="true"></span>
  276. </a>
  277. {% endif %}
  278. """
  279. FRONTPORT_BUTTONS = """
  280. {% if perms.dcim.add_inventoryitem %}
  281. <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">
  282. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  283. </a>
  284. {% endif %}
  285. {% if record.cable %}
  286. <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>
  287. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  288. {% if perms.dcim.delete_cable %}
  289. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  290. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  291. </a>
  292. {% endif %}
  293. {% elif perms.dcim.add_cable %}
  294. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  295. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  296. {% if not record.mark_connected %}
  297. <span class="dropdown">
  298. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  299. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  300. </button>
  301. <ul class="dropdown-menu dropdown-menu-end">
  302. <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>
  303. <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>
  304. <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>
  305. <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>
  306. <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>
  307. <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>
  308. </ul>
  309. </span>
  310. {% else %}
  311. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  312. {% endif %}
  313. {% endif %}
  314. """
  315. REARPORT_BUTTONS = """
  316. {% if perms.dcim.add_inventoryitem %}
  317. <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">
  318. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  319. </a>
  320. {% endif %}
  321. {% if record.cable %}
  322. <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>
  323. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  324. {% if perms.dcim.delete_cable %}
  325. <a href="{% url 'dcim:cable_delete' pk=record.cable.pk %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" title="Remove cable" class="btn btn-danger btn-sm">
  326. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  327. </a>
  328. {% endif %}
  329. {% elif perms.dcim.add_cable %}
  330. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  331. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  332. {% if not record.mark_connected %}
  333. <span class="dropdown">
  334. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  335. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  336. </button>
  337. <ul class="dropdown-menu dropdown-menu-end">
  338. <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>
  339. <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>
  340. <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>
  341. <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>
  342. <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>
  343. <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>
  344. </ul>
  345. </span>
  346. {% else %}
  347. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  348. {% endif %}
  349. {% endif %}
  350. """
  351. DEVICEBAY_BUTTONS = """
  352. {% if perms.dcim.change_devicebay %}
  353. {% if record.installed_device %}
  354. <a href="{% url 'dcim:devicebay_depopulate' pk=record.pk %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-danger btn-sm">
  355. <i class="mdi mdi-server-minus" aria-hidden="true" title="Remove device"></i>
  356. </a>
  357. {% else %}
  358. <a href="{% url 'dcim:devicebay_populate' pk=record.pk %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-success btn-sm">
  359. <i class="mdi mdi-server-plus" aria-hidden="true" title="Install device"></i>
  360. </a>
  361. {% endif %}
  362. {% endif %}
  363. """
  364. MODULEBAY_BUTTONS = """
  365. {% if perms.dcim.add_module %}
  366. {% if record.installed_module %}
  367. <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">
  368. <i class="mdi mdi-server-minus" aria-hidden="true" title="Remove module"></i>
  369. </a>
  370. {% else %}
  371. <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">
  372. <i class="mdi mdi-server-plus" aria-hidden="true" title="Install module"></i>
  373. </a>
  374. {% endif %}
  375. {% endif %}
  376. """