template_code.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. LINKTERMINATION = """
  2. {% if value %}
  3. {% if value.parent_object %}
  4. <a href="{{ value.parent_object.get_absolute_url }}">{{ value.parent_object }}</a>
  5. <i class="mdi mdi-chevron-right"></i>
  6. {% endif %}
  7. <a href="{{ value.get_absolute_url }}">{{ value }}</a>
  8. {% endif %}
  9. """
  10. CABLE_LENGTH = """
  11. {% if record.length %}{{ record.length }} {{ record.get_length_unit_display }}{% endif %}
  12. """
  13. CABLE_TERMINATION_PARENT = """
  14. {% if value.device %}
  15. <a href="{{ value.device.get_absolute_url }}">{{ value.device }}</a>
  16. {% elif value.circuit %}
  17. <a href="{{ value.circuit.get_absolute_url }}">{{ value.circuit }}</a>
  18. {% elif value.power_panel %}
  19. <a href="{{ value.power_panel.get_absolute_url }}">{{ value.power_panel }}</a>
  20. {% endif %}
  21. """
  22. DEVICE_LINK = """
  23. <a href="{% url 'dcim:device' pk=record.pk %}">
  24. {{ record.name|default:'<span class="badge bg-info">Unnamed device</span>' }}
  25. </a>
  26. """
  27. DEVICEBAY_STATUS = """
  28. {% if record.installed_device_id %}
  29. <span class="badge bg-{{ record.installed_device.get_status_class }}">
  30. {{ record.installed_device.get_status_display }}
  31. </span>
  32. {% else %}
  33. <span class="badge bg-secondary">Vacant</span>
  34. {% endif %}
  35. """
  36. INTERFACE_IPADDRESSES = """
  37. <div class="table-badge-group">
  38. {% for ip in record.ip_addresses.all %}
  39. {% if ip.status != 'active' %}
  40. <a href="{{ ip.get_absolute_url }}" class="table-badge badge bg-{{ ip.get_status_class }}" data-bs-toggle="tooltip" data-bs-placement="left" title="{{ ip.get_status_display }}">{{ ip }}</a>
  41. {% else %}
  42. <a href="{{ ip.get_absolute_url }}" class="table-badge">{{ ip }}</a>
  43. {% endif %}
  44. {% endfor %}
  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 record.tagged_vlans.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 record.wireless_lans.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 %}
  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 record.cable %}
  100. <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>
  101. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  102. {% if perms.dcim.delete_cable %}
  103. <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">
  104. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  105. </a>
  106. {% endif %}
  107. {% elif perms.dcim.add_cable %}
  108. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  109. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  110. <span class="dropdown">
  111. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  112. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  113. </button>
  114. <ul class="dropdown-menu dropdown-menu-end">
  115. <li><a class="dropdown-item" href="{% url 'dcim:consoleport_connect' termination_a_id=record.pk termination_b_type='console-server-port' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Console Server Port</a></li>
  116. <li><a class="dropdown-item" href="{% url 'dcim:consoleport_connect' termination_a_id=record.pk termination_b_type='front-port' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Front Port</a></li>
  117. <li><a class="dropdown-item" href="{% url 'dcim:consoleport_connect' termination_a_id=record.pk termination_b_type='rear-port' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Rear Port</a></li>
  118. </ul>
  119. </span>
  120. {% else %}
  121. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  122. {% endif %}
  123. """
  124. CONSOLESERVERPORT_BUTTONS = """
  125. {% if record.cable %}
  126. <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>
  127. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  128. {% if perms.dcim.delete_cable %}
  129. <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">
  130. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  131. </a>
  132. {% endif %}
  133. {% elif perms.dcim.add_cable %}
  134. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  135. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  136. <span class="dropdown">
  137. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  138. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  139. </button>
  140. <ul class="dropdown-menu dropdown-menu-end">
  141. <li><a class="dropdown-item" href="{% url 'dcim:consoleserverport_connect' termination_a_id=record.pk termination_b_type='console-port' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Console Port</a></li>
  142. <li><a class="dropdown-item" href="{% url 'dcim:consoleserverport_connect' termination_a_id=record.pk termination_b_type='front-port' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Front Port</a></li>
  143. <li><a class="dropdown-item" href="{% url 'dcim:consoleserverport_connect' termination_a_id=record.pk termination_b_type='rear-port' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Rear Port</a></li>
  144. </ul>
  145. </span>
  146. {% else %}
  147. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  148. {% endif %}
  149. """
  150. POWERPORT_BUTTONS = """
  151. {% if record.cable %}
  152. <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>
  153. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  154. {% if perms.dcim.delete_cable %}
  155. <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">
  156. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  157. </a>
  158. {% endif %}
  159. {% elif perms.dcim.add_cable %}
  160. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  161. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  162. <span class="dropdown">
  163. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  164. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  165. </button>
  166. <ul class="dropdown-menu dropdown-menu-end">
  167. <li><a class="dropdown-item" href="{% url 'dcim:powerport_connect' termination_a_id=record.pk termination_b_type='power-outlet' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}">Power Outlet</a></li>
  168. <li><a class="dropdown-item" href="{% url 'dcim:powerport_connect' termination_a_id=record.pk termination_b_type='power-feed' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}">Power Feed</a></li>
  169. </ul>
  170. </span>
  171. {% else %}
  172. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  173. {% endif %}
  174. """
  175. POWEROUTLET_BUTTONS = """
  176. {% if record.cable %}
  177. <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>
  178. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  179. {% if perms.dcim.delete_cable %}
  180. <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">
  181. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  182. </a>
  183. {% endif %}
  184. {% elif perms.dcim.add_cable %}
  185. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  186. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  187. {% if not record.mark_connected %}
  188. <a href="{% url 'dcim:poweroutlet_connect' termination_a_id=record.pk termination_b_type='power-port' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" title="Connect" class="btn btn-success btn-sm">
  189. <i class="mdi mdi-ethernet-cable" aria-hidden="true"></i>
  190. </a>
  191. {% else %}
  192. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  193. {% endif %}
  194. {% endif %}
  195. """
  196. INTERFACE_BUTTONS = """
  197. {% if perms.ipam.add_ipaddress %}
  198. <a href="{% url 'ipam:ipaddress_add' %}?interface={{ record.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-sm btn-success" title="Add IP address">
  199. <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
  200. </a>
  201. {% endif %}
  202. {% if record.link %}
  203. <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>
  204. {% endif %}
  205. {% if record.cable %}
  206. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  207. {% if perms.dcim.delete_cable %}
  208. <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">
  209. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  210. </a>
  211. {% endif %}
  212. {% elif record.wireless_link %}
  213. {% if perms.wireless.delete_wirelesslink %}
  214. <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">
  215. <i class="mdi mdi-wifi-off" aria-hidden="true"></i>
  216. </a>
  217. {% endif %}
  218. {% elif record.is_wired and perms.dcim.add_cable %}
  219. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  220. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  221. {% if not record.mark_connected %}
  222. <span class="dropdown">
  223. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  224. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  225. </button>
  226. <ul class="dropdown-menu dropdown-menu-end">
  227. <li><a class="dropdown-item" href="{% url 'dcim:interface_connect' termination_a_id=record.pk termination_b_type='interface' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Interface</a></li>
  228. <li><a class="dropdown-item" href="{% url 'dcim:interface_connect' termination_a_id=record.pk termination_b_type='front-port' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Front Port</a></li>
  229. <li><a class="dropdown-item" href="{% url 'dcim:interface_connect' termination_a_id=record.pk termination_b_type='rear-port' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Rear Port</a></li>
  230. <li><a class="dropdown-item" href="{% url 'dcim:interface_connect' termination_a_id=record.pk termination_b_type='circuit-termination' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Circuit Termination</a></li>
  231. </ul>
  232. </span>
  233. {% else %}
  234. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  235. {% endif %}
  236. {% elif record.is_wireless and perms.wireless.add_wirelesslink %}
  237. <a href="{% url 'wireless:wirelesslink_add' %}?site_a={{ record.device.site.pk }}&location_a={{ record.device.location.pk }}&device_a={{ record.device.pk }}&interface_a={{ record.pk }}&site_b={{ record.device.site.pk }}&location_b={{ record.device.location.pk }}" class="btn btn-success btn-sm">
  238. <span class="mdi mdi-wifi-plus" aria-hidden="true"></span>
  239. </a>
  240. {% endif %}
  241. """
  242. FRONTPORT_BUTTONS = """
  243. {% if record.cable %}
  244. <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>
  245. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  246. {% if perms.dcim.delete_cable %}
  247. <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">
  248. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  249. </a>
  250. {% endif %}
  251. {% elif perms.dcim.add_cable %}
  252. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  253. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  254. {% if not record.mark_connected %}
  255. <span class="dropdown">
  256. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  257. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  258. </button>
  259. <ul class="dropdown-menu dropdown-menu-end">
  260. <li><a class="dropdown-item" href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='interface' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">Interface</a></li>
  261. <li><a class="dropdown-item" href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='console-server-port' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">Console Server Port</a></li>
  262. <li><a class="dropdown-item" href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='console-port' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">Console Port</a></li>
  263. <li><a class="dropdown-item" href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='front-port' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">Front Port</a></li>
  264. <li><a class="dropdown-item" href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='rear-port' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">Rear Port</a></li>
  265. <li><a class="dropdown-item" href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='circuit-termination' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}">Circuit Termination</a></li>
  266. </ul>
  267. </span>
  268. {% else %}
  269. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  270. {% endif %}
  271. {% endif %}
  272. """
  273. REARPORT_BUTTONS = """
  274. {% if record.cable %}
  275. <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>
  276. {% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
  277. {% if perms.dcim.delete_cable %}
  278. <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">
  279. <i class="mdi mdi-ethernet-cable-off" aria-hidden="true"></i>
  280. </a>
  281. {% endif %}
  282. {% elif perms.dcim.add_cable %}
  283. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i></a>
  284. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-lan-connect" aria-hidden="true"></i></a>
  285. {% if not record.mark_connected %}
  286. <span class="dropdown">
  287. <button type="button" class="btn btn-success btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  288. <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span>
  289. </button>
  290. <ul class="dropdown-menu dropdown-menu-end">
  291. <li><a class="dropdown-item" href="{% url 'dcim:rearport_connect' termination_a_id=record.pk termination_b_type='interface' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}">Interface</a></li>
  292. <li><a class="dropdown-item" href="{% url 'dcim:rearport_connect' termination_a_id=record.pk termination_b_type='front-port' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}">Front Port</a></li>
  293. <li><a class="dropdown-item" href="{% url 'dcim:rearport_connect' termination_a_id=record.pk termination_b_type='rear-port' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}">Rear Port</a></li>
  294. <li><a class="dropdown-item" href="{% url 'dcim:rearport_connect' termination_a_id=record.pk termination_b_type='circuit-termination' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}">Circuit Termination</a></li>
  295. </ul>
  296. </span>
  297. {% else %}
  298. <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
  299. {% endif %}
  300. {% endif %}
  301. """
  302. DEVICEBAY_BUTTONS = """
  303. {% if perms.dcim.change_devicebay %}
  304. {% if record.installed_device %}
  305. <a href="{% url 'dcim:devicebay_depopulate' pk=record.pk %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-danger btn-sm">
  306. <i class="mdi mdi-minus-thick" aria-hidden="true" title="Remove device"></i>
  307. </a>
  308. {% else %}
  309. <a href="{% url 'dcim:devicebay_populate' pk=record.pk %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-success btn-sm">
  310. <i class="mdi mdi-plus-thick" aria-hidden="true" title="Install device"></i>
  311. </a>
  312. {% endif %}
  313. {% endif %}
  314. """
  315. MODULEBAY_BUTTONS = """
  316. {% if perms.dcim.add_module %}
  317. {% if record.installed_module %}
  318. <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">
  319. <i class="mdi mdi-minus-thick" aria-hidden="true" title="Remove module"></i>
  320. </a>
  321. {% else %}
  322. <a href="{% url 'dcim:module_add' %}?device={{ record.device.pk }}&module_bay={{ record.pk }}&return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-success btn-sm">
  323. <i class="mdi mdi-plus-thick" aria-hidden="true" title="Install module"></i>
  324. </a>
  325. {% endif %}
  326. {% endif %}
  327. """