nautobot 2.2.9__py3-none-any.whl → 2.3.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (697) hide show
  1. nautobot/apps/forms.py +4 -0
  2. nautobot/apps/models.py +10 -1
  3. nautobot/circuits/__init__.py +0 -1
  4. nautobot/circuits/apps.py +1 -0
  5. nautobot/circuits/factory.py +15 -3
  6. nautobot/circuits/filters.py +13 -0
  7. nautobot/circuits/forms.py +13 -0
  8. nautobot/circuits/migrations/0021_alter_circuit_status_alter_circuittermination__path.py +32 -0
  9. nautobot/circuits/migrations/0022_circuittermination_cloud_network.py +25 -0
  10. nautobot/circuits/models.py +16 -3
  11. nautobot/circuits/tables.py +16 -2
  12. nautobot/circuits/templates/circuits/circuittermination_create.html +10 -2
  13. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +6 -0
  14. nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -1
  15. nautobot/circuits/tests/test_api.py +7 -5
  16. nautobot/circuits/tests/test_filters.py +12 -5
  17. nautobot/circuits/tests/test_models.py +33 -2
  18. nautobot/circuits/views.py +2 -3
  19. nautobot/cloud/__init__.py +0 -0
  20. nautobot/cloud/api/__init__.py +0 -0
  21. nautobot/cloud/api/serializers.py +54 -0
  22. nautobot/cloud/api/urls.py +16 -0
  23. nautobot/cloud/api/views.py +48 -0
  24. nautobot/cloud/apps.py +13 -0
  25. nautobot/cloud/factory.py +111 -0
  26. nautobot/cloud/filters.py +184 -0
  27. nautobot/cloud/forms.py +333 -0
  28. nautobot/cloud/homepage.py +43 -0
  29. nautobot/cloud/migrations/0001_initial.py +304 -0
  30. nautobot/cloud/migrations/__init__.py +0 -0
  31. nautobot/cloud/models.py +247 -0
  32. nautobot/cloud/navigation.py +85 -0
  33. nautobot/cloud/tables.py +173 -0
  34. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
  35. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +128 -0
  36. nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
  37. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +100 -0
  38. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +65 -0
  39. nautobot/cloud/templates/cloud/cloudservice_update.html +25 -0
  40. nautobot/cloud/tests/__init__.py +0 -0
  41. nautobot/cloud/tests/test_api.py +248 -0
  42. nautobot/cloud/tests/test_filters.py +113 -0
  43. nautobot/cloud/tests/test_models.py +43 -0
  44. nautobot/cloud/tests/test_views.py +153 -0
  45. nautobot/cloud/urls.py +14 -0
  46. nautobot/cloud/views.py +181 -0
  47. nautobot/core/__init__.py +0 -3
  48. nautobot/core/api/metadata.py +1 -0
  49. nautobot/core/api/parsers.py +7 -1
  50. nautobot/core/api/urls.py +1 -0
  51. nautobot/core/api/utils.py +1 -0
  52. nautobot/core/api/views.py +4 -0
  53. nautobot/core/apps/__init__.py +6 -3
  54. nautobot/core/constants.py +8 -0
  55. nautobot/core/factory.py +32 -1
  56. nautobot/core/filters.py +96 -28
  57. nautobot/core/forms/fields.py +10 -4
  58. nautobot/core/forms/forms.py +1 -1
  59. nautobot/core/forms/widgets.py +18 -1
  60. nautobot/core/graphql/generators.py +2 -2
  61. nautobot/core/graphql/schema.py +34 -4
  62. nautobot/core/jobs/__init__.py +17 -6
  63. nautobot/core/jobs/cleanup.py +100 -0
  64. nautobot/core/jobs/groups.py +38 -0
  65. nautobot/core/management/commands/generate_test_data.py +116 -3
  66. nautobot/core/models/__init__.py +34 -9
  67. nautobot/core/models/generics.py +19 -3
  68. nautobot/core/models/name_color_content_types.py +7 -28
  69. nautobot/core/models/querysets.py +4 -3
  70. nautobot/core/models/tree_queries.py +1 -1
  71. nautobot/core/models/utils.py +21 -5
  72. nautobot/core/settings.py +4 -30
  73. nautobot/core/settings.yaml +34 -27
  74. nautobot/core/settings_funcs.py +103 -0
  75. nautobot/core/tables.py +127 -56
  76. nautobot/core/templates/admin/search_form.html +1 -1
  77. nautobot/core/templates/buttons/add.html +11 -3
  78. nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +13 -0
  79. nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +13 -0
  80. nautobot/core/templates/buttons/export.html +101 -53
  81. nautobot/core/templates/buttons/job_import.html +11 -3
  82. nautobot/core/templates/generic/object_bulk_destroy.html +3 -1
  83. nautobot/core/templates/generic/object_bulk_update.html +3 -1
  84. nautobot/core/templates/generic/object_changelog.html +0 -9
  85. nautobot/core/templates/generic/object_list.html +156 -17
  86. nautobot/core/templates/generic/object_retrieve.html +80 -16
  87. nautobot/core/templates/inc/extras_features_edit_form_fields.html +8 -0
  88. nautobot/core/templates/inc/javascript.html +2 -0
  89. nautobot/core/templates/inc/media.html +2 -2
  90. nautobot/core/templates/inc/nav_menu.html +1 -0
  91. nautobot/core/templates/inc/paginator.html +7 -7
  92. nautobot/core/templates/inc/search_panel.html +2 -2
  93. nautobot/core/templates/inc/table.html +2 -2
  94. nautobot/core/templates/nautobot_config.py.j2 +13 -23
  95. nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +37 -0
  96. nautobot/core/templates/utilities/templatetags/filter_form_modal.html +2 -2
  97. nautobot/core/templates/utilities/templatetags/saved_view_modal.html +38 -0
  98. nautobot/core/templates/utilities/theme_preview.html +25 -8
  99. nautobot/core/templates/utilities/worker_status.html +152 -0
  100. nautobot/core/templatetags/buttons.py +335 -38
  101. nautobot/core/templatetags/form_helpers.py +1 -1
  102. nautobot/core/templatetags/helpers.py +181 -11
  103. nautobot/core/testing/api.py +5 -4
  104. nautobot/core/testing/filters.py +51 -13
  105. nautobot/core/testing/mixins.py +46 -0
  106. nautobot/core/testing/models.py +22 -0
  107. nautobot/core/testing/schema.py +4 -8
  108. nautobot/core/testing/views.py +31 -14
  109. nautobot/core/tests/integration/test_general_functionality.py +1 -1
  110. nautobot/core/tests/integration/test_import_objects_ui.py +1 -0
  111. nautobot/core/tests/integration/test_swagger.py +1 -1
  112. nautobot/core/tests/nautobot_config.py +0 -1
  113. nautobot/core/tests/runner.py +2 -2
  114. nautobot/core/tests/test_api.py +1 -0
  115. nautobot/core/tests/test_authentication.py +7 -2
  116. nautobot/core/tests/test_filters.py +11 -9
  117. nautobot/core/tests/test_forms.py +9 -0
  118. nautobot/core/tests/test_graphql.py +27 -16
  119. nautobot/core/tests/test_jobs.py +123 -74
  120. nautobot/core/tests/test_tables.py +3 -1
  121. nautobot/core/tests/test_templatetags_helpers.py +12 -5
  122. nautobot/core/tests/test_utils.py +31 -20
  123. nautobot/core/tests/test_views.py +6 -6
  124. nautobot/core/urls.py +8 -3
  125. nautobot/core/utils/deprecation.py +29 -0
  126. nautobot/core/utils/filtering.py +12 -9
  127. nautobot/core/utils/lookup.py +37 -2
  128. nautobot/core/utils/requests.py +4 -1
  129. nautobot/core/views/__init__.py +137 -24
  130. nautobot/core/views/generic.py +118 -66
  131. nautobot/core/views/mixins.py +104 -35
  132. nautobot/core/views/paginator.py +9 -3
  133. nautobot/core/views/renderers.py +121 -56
  134. nautobot/core/views/utils.py +79 -1
  135. nautobot/dcim/__init__.py +0 -1
  136. nautobot/dcim/api/serializers.py +180 -44
  137. nautobot/dcim/api/urls.py +7 -3
  138. nautobot/dcim/api/views.py +53 -7
  139. nautobot/dcim/apps.py +3 -0
  140. nautobot/dcim/choices.py +25 -0
  141. nautobot/dcim/constants.py +7 -0
  142. nautobot/dcim/factory.py +249 -18
  143. nautobot/dcim/filters/__init__.py +369 -193
  144. nautobot/dcim/filters/mixins.py +274 -1
  145. nautobot/dcim/forms.py +817 -109
  146. nautobot/dcim/graphql/types.py +2 -2
  147. nautobot/dcim/homepage.py +1 -1
  148. nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
  149. nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
  150. nautobot/dcim/migrations/0061_module_models.py +861 -0
  151. nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
  152. nautobot/dcim/models/__init__.py +8 -0
  153. nautobot/dcim/models/cables.py +15 -0
  154. nautobot/dcim/models/device_component_templates.py +207 -53
  155. nautobot/dcim/models/device_components.py +275 -106
  156. nautobot/dcim/models/devices.py +466 -13
  157. nautobot/dcim/navigation.py +47 -0
  158. nautobot/dcim/signals.py +3 -3
  159. nautobot/dcim/tables/__init__.py +35 -23
  160. nautobot/dcim/tables/devices.py +231 -59
  161. nautobot/dcim/tables/devicetypes.py +65 -9
  162. nautobot/dcim/tables/racks.py +5 -1
  163. nautobot/dcim/tables/template_code.py +46 -26
  164. nautobot/dcim/templates/dcim/cable_connect.html +76 -3
  165. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
  166. nautobot/dcim/templates/dcim/device/base.html +15 -7
  167. nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
  168. nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
  169. nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
  170. nautobot/dcim/templates/dcim/device/frontports.html +2 -3
  171. nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
  172. nautobot/dcim/templates/dcim/device/inventory.html +2 -3
  173. nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
  174. nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
  175. nautobot/dcim/templates/dcim/device/powerports.html +2 -3
  176. nautobot/dcim/templates/dcim/device/rearports.html +2 -3
  177. nautobot/dcim/templates/dcim/device.html +45 -1
  178. nautobot/dcim/templates/dcim/device_component.html +13 -5
  179. nautobot/dcim/templates/dcim/device_list.html +2 -1
  180. nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +0 -6
  181. nautobot/dcim/templates/dcim/devicetype.html +99 -98
  182. nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
  183. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
  184. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
  185. nautobot/dcim/templates/dcim/interface.html +17 -2
  186. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
  187. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  188. nautobot/dcim/templates/dcim/manufacturer.html +24 -0
  189. nautobot/dcim/templates/dcim/module/base.html +97 -0
  190. nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
  191. nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
  192. nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
  193. nautobot/dcim/templates/dcim/module_destroy.html +5 -0
  194. nautobot/dcim/templates/dcim/module_frontports.html +53 -0
  195. nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
  196. nautobot/dcim/templates/dcim/module_list.html +20 -0
  197. nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
  198. nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
  199. nautobot/dcim/templates/dcim/module_powerports.html +53 -0
  200. nautobot/dcim/templates/dcim/module_rearports.html +53 -0
  201. nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
  202. nautobot/dcim/templates/dcim/module_update.html +71 -0
  203. nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
  204. nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
  205. nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
  206. nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
  207. nautobot/dcim/templates/dcim/moduletype_retrieve.html +142 -0
  208. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
  209. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
  210. nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
  211. nautobot/dcim/tests/test_api.py +691 -208
  212. nautobot/dcim/tests/test_filters.py +836 -217
  213. nautobot/dcim/tests/test_models.py +1072 -39
  214. nautobot/dcim/tests/test_views.py +1488 -358
  215. nautobot/dcim/urls.py +17 -2
  216. nautobot/dcim/utils.py +2 -3
  217. nautobot/dcim/views.py +1107 -120
  218. nautobot/extras/__init__.py +0 -1
  219. nautobot/extras/api/serializers.py +115 -3
  220. nautobot/extras/api/urls.py +12 -0
  221. nautobot/extras/api/views.py +125 -7
  222. nautobot/extras/apps.py +2 -2
  223. nautobot/extras/choices.py +43 -0
  224. nautobot/extras/context_managers.py +13 -8
  225. nautobot/extras/datasources/git.py +2 -0
  226. nautobot/extras/factory.py +422 -9
  227. nautobot/extras/filters/__init__.py +174 -3
  228. nautobot/extras/filters/mixins.py +46 -43
  229. nautobot/extras/forms/base.py +17 -4
  230. nautobot/extras/forms/forms.py +227 -8
  231. nautobot/extras/forms/mixins.py +93 -0
  232. nautobot/extras/graphql/types.py +23 -10
  233. nautobot/extras/homepage.py +16 -13
  234. nautobot/extras/jobs.py +2 -2
  235. nautobot/extras/management/__init__.py +1 -0
  236. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
  237. nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
  238. nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
  239. nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
  240. nautobot/extras/migrations/0111_metadata.py +162 -0
  241. nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
  242. nautobot/extras/migrations/0113_saved_views.py +77 -0
  243. nautobot/extras/models/__init__.py +15 -1
  244. nautobot/extras/models/change_logging.py +3 -3
  245. nautobot/extras/models/contacts.py +4 -0
  246. nautobot/extras/models/customfields.py +18 -3
  247. nautobot/extras/models/groups.py +389 -225
  248. nautobot/extras/models/jobs.py +4 -84
  249. nautobot/extras/models/metadata.py +441 -0
  250. nautobot/extras/models/mixins.py +72 -62
  251. nautobot/extras/models/models.py +116 -9
  252. nautobot/extras/models/relationships.py +9 -2
  253. nautobot/extras/models/tags.py +13 -2
  254. nautobot/extras/navigation.py +57 -0
  255. nautobot/extras/plugins/__init__.py +3 -1
  256. nautobot/extras/querysets.py +30 -66
  257. nautobot/extras/signals.py +96 -114
  258. nautobot/extras/tables.py +171 -47
  259. nautobot/extras/templates/extras/dynamicgroup.html +44 -15
  260. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
  261. nautobot/extras/templates/extras/job.html +1 -1
  262. nautobot/extras/templates/extras/job_detail.html +0 -11
  263. nautobot/extras/templates/extras/jobresult.html +61 -74
  264. nautobot/extras/templates/extras/metadatatype_create.html +89 -0
  265. nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
  266. nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
  267. nautobot/extras/templates/extras/objectchange_list.html +0 -12
  268. nautobot/extras/templates/extras/plugins_list.html +1 -3
  269. nautobot/extras/templates/extras/role_retrieve.html +48 -0
  270. nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
  271. nautobot/extras/tests/integration/test_customfields.py +1 -0
  272. nautobot/extras/tests/test_api.py +501 -22
  273. nautobot/extras/tests/test_changelog.py +20 -9
  274. nautobot/extras/tests/test_context_managers.py +22 -15
  275. nautobot/extras/tests/test_datasources.py +13 -1
  276. nautobot/extras/tests/test_dynamicgroups.py +201 -171
  277. nautobot/extras/tests/test_filters.py +211 -12
  278. nautobot/extras/tests/test_jobs.py +4 -4
  279. nautobot/extras/tests/test_models.py +499 -4
  280. nautobot/extras/tests/test_relationships.py +1 -0
  281. nautobot/extras/tests/test_views.py +565 -28
  282. nautobot/extras/tests/test_webhooks.py +1 -1
  283. nautobot/extras/urls.py +5 -0
  284. nautobot/extras/utils.py +56 -45
  285. nautobot/extras/views.py +585 -96
  286. nautobot/ipam/__init__.py +0 -1
  287. nautobot/ipam/apps.py +1 -0
  288. nautobot/ipam/factory.py +17 -19
  289. nautobot/ipam/filters.py +14 -1
  290. nautobot/ipam/forms.py +9 -5
  291. nautobot/ipam/graphql/types.py +2 -2
  292. nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
  293. nautobot/ipam/models.py +23 -9
  294. nautobot/ipam/querysets.py +1 -1
  295. nautobot/ipam/signals.py +4 -2
  296. nautobot/ipam/tables.py +1 -0
  297. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
  298. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
  299. nautobot/ipam/templates/ipam/prefix.html +1 -0
  300. nautobot/ipam/tests/test_api.py +37 -18
  301. nautobot/ipam/tests/test_filters.py +26 -2
  302. nautobot/ipam/tests/test_models.py +8 -3
  303. nautobot/ipam/tests/test_querysets.py +1 -1
  304. nautobot/ipam/tests/test_views.py +3 -2
  305. nautobot/ipam/urls.py +2 -2
  306. nautobot/ipam/views.py +25 -28
  307. nautobot/project-static/css/base.css +20 -1
  308. nautobot/project-static/css/dark.css +11 -0
  309. nautobot/project-static/docs/404.html +884 -80
  310. nautobot/project-static/docs/apps/index.html +884 -80
  311. nautobot/project-static/docs/apps/nautobot-apps.html +884 -80
  312. nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
  313. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +911 -112
  314. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +896 -93
  315. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1457 -790
  316. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +927 -136
  317. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +969 -180
  318. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +893 -91
  319. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +889 -85
  320. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +983 -185
  321. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +938 -143
  322. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1064 -274
  323. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1190 -346
  324. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1663 -865
  325. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1156 -373
  326. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2200 -1502
  327. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2229 -1421
  328. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +904 -103
  329. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +955 -155
  330. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1002 -215
  331. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1911 -1275
  332. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1835 -1091
  333. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +896 -93
  334. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2323 -1693
  335. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1785 -1023
  336. nautobot/project-static/docs/development/apps/api/configuration-view.html +884 -80
  337. nautobot/project-static/docs/development/apps/api/database-backend-config.html +884 -80
  338. nautobot/project-static/docs/development/apps/api/models/django-admin.html +884 -80
  339. nautobot/project-static/docs/development/apps/api/models/global-search.html +884 -80
  340. nautobot/project-static/docs/development/apps/api/models/graphql.html +884 -80
  341. nautobot/project-static/docs/development/apps/api/models/index.html +922 -81
  342. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +884 -80
  343. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +884 -80
  344. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +884 -80
  345. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +884 -80
  346. nautobot/project-static/docs/development/apps/api/platform-features/index.html +884 -80
  347. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +884 -80
  348. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +884 -80
  349. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +884 -80
  350. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +884 -80
  351. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +884 -80
  352. nautobot/project-static/docs/development/apps/api/prometheus.html +884 -80
  353. nautobot/project-static/docs/development/apps/api/setup.html +884 -80
  354. nautobot/project-static/docs/development/apps/api/testing.html +884 -80
  355. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +884 -80
  356. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +884 -80
  357. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +884 -80
  358. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +884 -80
  359. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +884 -80
  360. nautobot/project-static/docs/development/apps/api/views/base-template.html +884 -80
  361. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +884 -80
  362. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +884 -80
  363. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +884 -80
  364. nautobot/project-static/docs/development/apps/api/views/index.html +884 -80
  365. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +884 -80
  366. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +884 -80
  367. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +884 -80
  368. nautobot/project-static/docs/development/apps/api/views/notes.html +884 -80
  369. nautobot/project-static/docs/development/apps/api/views/rest-api.html +884 -80
  370. nautobot/project-static/docs/development/apps/api/views/urls.html +884 -80
  371. nautobot/project-static/docs/development/apps/index.html +884 -80
  372. nautobot/project-static/docs/development/apps/migration/code-updates.html +884 -80
  373. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +884 -80
  374. nautobot/project-static/docs/development/apps/migration/from-v1.html +884 -80
  375. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +884 -80
  376. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +884 -80
  377. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +884 -80
  378. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +884 -80
  379. nautobot/project-static/docs/development/apps/porting-from-netbox.html +884 -80
  380. nautobot/project-static/docs/development/core/application-registry.html +884 -80
  381. nautobot/project-static/docs/development/core/best-practices.html +885 -80
  382. nautobot/project-static/docs/development/core/bootstrap-ui.html +884 -80
  383. nautobot/project-static/docs/development/core/caching.html +884 -80
  384. nautobot/project-static/docs/development/core/controllers.html +884 -80
  385. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +884 -80
  386. nautobot/project-static/docs/development/core/generic-views.html +884 -80
  387. nautobot/project-static/docs/development/core/getting-started.html +884 -80
  388. nautobot/project-static/docs/development/core/homepage.html +884 -80
  389. nautobot/project-static/docs/development/core/index.html +884 -91
  390. nautobot/project-static/docs/development/core/model-checklist.html +887 -81
  391. nautobot/project-static/docs/development/core/model-features.html +884 -80
  392. nautobot/project-static/docs/development/core/natural-keys.html +884 -80
  393. nautobot/project-static/docs/development/core/navigation-menu.html +884 -80
  394. nautobot/project-static/docs/development/core/release-checklist.html +887 -83
  395. nautobot/project-static/docs/development/core/role-internals.html +884 -80
  396. nautobot/project-static/docs/development/core/settings.html +884 -80
  397. nautobot/project-static/docs/development/core/style-guide.html +885 -81
  398. nautobot/project-static/docs/development/core/templates.html +896 -81
  399. nautobot/project-static/docs/development/core/testing.html +884 -80
  400. nautobot/project-static/docs/development/core/user-preferences.html +884 -80
  401. nautobot/project-static/docs/development/index.html +884 -80
  402. nautobot/project-static/docs/development/jobs/index.html +1247 -457
  403. nautobot/project-static/docs/development/jobs/migration/from-v1.html +884 -80
  404. nautobot/project-static/docs/index.html +13 -8228
  405. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
  406. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
  407. nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
  408. nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
  409. nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
  410. nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
  411. nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
  412. nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
  413. nautobot/project-static/docs/models/dcim/module.html +15 -0
  414. nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
  415. nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
  416. nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
  417. nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
  418. nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
  419. nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
  420. nautobot/project-static/docs/models/extras/role.html +15 -0
  421. nautobot/project-static/docs/models/extras/savedview.html +15 -0
  422. nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
  423. nautobot/project-static/docs/models/extras/status.html +15 -0
  424. nautobot/project-static/docs/objects.inv +0 -0
  425. nautobot/project-static/docs/overview/application_stack.html +892 -81
  426. nautobot/project-static/docs/overview/design_philosophy.html +886 -82
  427. nautobot/project-static/docs/overview/index.html +9032 -13
  428. nautobot/project-static/docs/release-notes/index.html +887 -83
  429. nautobot/project-static/docs/release-notes/version-1.0.html +884 -80
  430. nautobot/project-static/docs/release-notes/version-1.1.html +884 -80
  431. nautobot/project-static/docs/release-notes/version-1.2.html +884 -80
  432. nautobot/project-static/docs/release-notes/version-1.3.html +884 -80
  433. nautobot/project-static/docs/release-notes/version-1.4.html +884 -80
  434. nautobot/project-static/docs/release-notes/version-1.5.html +885 -81
  435. nautobot/project-static/docs/release-notes/version-1.6.html +885 -81
  436. nautobot/project-static/docs/release-notes/version-2.0.html +884 -80
  437. nautobot/project-static/docs/release-notes/version-2.1.html +884 -80
  438. nautobot/project-static/docs/release-notes/version-2.2.html +990 -323
  439. nautobot/project-static/docs/release-notes/version-2.3.html +9524 -0
  440. nautobot/project-static/docs/requirements.txt +4 -4
  441. nautobot/project-static/docs/search/search_index.json +1 -1
  442. nautobot/project-static/docs/sitemap.xml +335 -260
  443. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  444. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +884 -80
  445. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +884 -80
  446. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +884 -80
  447. nautobot/project-static/docs/user-guide/administration/configuration/index.html +884 -80
  448. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +983 -197
  449. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +884 -80
  450. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +884 -80
  451. nautobot/project-static/docs/user-guide/administration/guides/caching.html +884 -80
  452. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +888 -84
  453. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +884 -80
  454. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +884 -80
  455. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +884 -80
  456. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +884 -80
  457. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +884 -80
  458. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +884 -80
  459. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +884 -80
  460. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +884 -80
  461. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +884 -80
  462. nautobot/project-static/docs/user-guide/administration/installation/index.html +888 -80
  463. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +884 -80
  464. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +884 -80
  465. nautobot/project-static/docs/user-guide/administration/installation/services.html +888 -80
  466. nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +900 -91
  467. nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +884 -80
  468. nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +884 -80
  469. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +884 -80
  470. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +884 -80
  471. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +915 -163
  472. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +884 -80
  473. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +884 -80
  474. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +884 -80
  475. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +884 -80
  476. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +884 -80
  477. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +884 -80
  478. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +884 -80
  479. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +884 -80
  480. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +884 -80
  481. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +884 -80
  482. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +884 -80
  483. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +885 -81
  484. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +884 -80
  485. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +888 -80
  486. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +887 -83
  487. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
  488. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
  489. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
  490. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
  491. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
  492. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
  493. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
  494. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +898 -94
  495. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +915 -97
  496. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +915 -97
  497. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +910 -92
  498. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +915 -97
  499. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +898 -94
  500. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +898 -94
  501. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +905 -97
  502. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +912 -108
  503. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +913 -109
  504. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +910 -106
  505. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +898 -94
  506. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +906 -97
  507. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +918 -100
  508. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +928 -110
  509. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +920 -98
  510. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +898 -94
  511. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +929 -111
  512. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +920 -102
  513. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +910 -106
  514. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +913 -109
  515. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +914 -106
  516. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
  517. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
  518. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
  519. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
  520. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +908 -104
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +898 -94
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +932 -75
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +916 -98
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +898 -94
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +935 -78
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +913 -95
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +921 -117
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +910 -106
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +898 -94
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +914 -96
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +916 -98
  532. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +898 -94
  533. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +898 -94
  534. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +898 -94
  535. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +884 -80
  536. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +884 -80
  537. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +889 -81
  538. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +889 -81
  539. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +884 -80
  540. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +884 -80
  541. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +884 -80
  542. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +884 -80
  543. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +884 -80
  544. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +884 -80
  545. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +884 -80
  546. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +884 -80
  547. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +884 -80
  548. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +884 -80
  549. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +893 -88
  550. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +884 -80
  551. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +884 -80
  552. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +884 -80
  553. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +884 -80
  554. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +884 -80
  555. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +889 -81
  556. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +884 -80
  557. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +884 -80
  558. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +884 -80
  559. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +884 -80
  560. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +884 -80
  561. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +884 -80
  562. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +884 -80
  563. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +884 -80
  564. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +884 -80
  565. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +884 -80
  566. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +884 -80
  567. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +884 -80
  568. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +884 -80
  569. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
  570. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
  571. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
  572. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
  587. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
  589. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
  590. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
  591. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
  592. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
  593. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
  594. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +884 -80
  595. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +884 -80
  596. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +884 -80
  597. nautobot/project-static/docs/user-guide/index.html +884 -80
  598. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +884 -80
  599. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +884 -80
  600. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +884 -80
  601. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +884 -80
  602. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1250 -777
  603. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +887 -83
  604. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +884 -80
  605. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +884 -80
  606. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +884 -80
  607. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +884 -80
  608. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +884 -80
  609. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +884 -80
  610. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +887 -83
  611. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +884 -80
  612. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +884 -80
  613. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +888 -80
  614. nautobot/project-static/docs/user-guide/platform-functionality/metadata.html +8948 -0
  615. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +887 -83
  616. nautobot/project-static/docs/user-guide/platform-functionality/note.html +884 -80
  617. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +884 -80
  618. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +884 -80
  619. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +884 -80
  620. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +884 -80
  621. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +884 -80
  622. nautobot/project-static/docs/user-guide/platform-functionality/role.html +887 -83
  623. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
  624. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +887 -83
  625. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
  626. nautobot/project-static/docs/user-guide/platform-functionality/status.html +884 -80
  627. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +884 -80
  628. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +942 -113
  629. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +884 -80
  630. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +884 -80
  631. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +884 -80
  632. nautobot/project-static/js/forms.js +71 -0
  633. nautobot/project-static/js/table_sorting_indicator.js +46 -0
  634. nautobot/project-static/js/tableconfig.js +6 -1
  635. nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
  636. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
  637. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
  638. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
  639. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
  640. nautobot/tenancy/__init__.py +0 -1
  641. nautobot/tenancy/apps.py +1 -0
  642. nautobot/tenancy/factory.py +3 -2
  643. nautobot/tenancy/filters/__init__.py +1 -0
  644. nautobot/tenancy/forms.py +1 -1
  645. nautobot/tenancy/templates/tenancy/tenant.html +22 -18
  646. nautobot/tenancy/views.py +11 -10
  647. nautobot/users/__init__.py +0 -1
  648. nautobot/users/api/serializers.py +1 -1
  649. nautobot/users/api/views.py +4 -2
  650. nautobot/users/apps.py +3 -2
  651. nautobot/users/factory.py +3 -3
  652. nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
  653. nautobot/users/models.py +12 -0
  654. nautobot/users/tests/test_filters.py +6 -3
  655. nautobot/users/urls.py +8 -0
  656. nautobot/virtualization/__init__.py +0 -1
  657. nautobot/virtualization/apps.py +1 -0
  658. nautobot/virtualization/filters.py +6 -1
  659. nautobot/virtualization/forms.py +11 -3
  660. nautobot/virtualization/graphql/types.py +2 -2
  661. nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
  662. nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
  663. nautobot/virtualization/tables.py +15 -5
  664. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
  665. nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
  666. nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
  667. nautobot/virtualization/tests/test_api.py +9 -4
  668. nautobot/virtualization/tests/test_filters.py +22 -0
  669. nautobot/virtualization/tests/test_models.py +7 -3
  670. nautobot/virtualization/tests/test_views.py +19 -3
  671. nautobot/virtualization/urls.py +2 -2
  672. nautobot/virtualization/views.py +10 -32
  673. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/METADATA +21 -19
  674. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/RECORD +679 -559
  675. nautobot/project-static/materialdesignicons-6.5.95/.github/ISSUE_TEMPLATE.md +0 -3
  676. nautobot/project-static/materialdesignicons-6.5.95/README.md +0 -25
  677. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css +0 -26654
  678. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css.map +0 -16
  679. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css +0 -3
  680. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css.map +0 -16
  681. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff +0 -0
  682. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff2 +0 -0
  683. nautobot/project-static/materialdesignicons-6.5.95/package.json +0 -28
  684. nautobot/project-static/materialdesignicons-6.5.95/preview.html +0 -717
  685. nautobot/project-static/materialdesignicons-6.5.95/scss/_animated.scss +0 -27
  686. nautobot/project-static/materialdesignicons-6.5.95/scss/_core.scss +0 -10
  687. nautobot/project-static/materialdesignicons-6.5.95/scss/_extras.scss +0 -65
  688. nautobot/project-static/materialdesignicons-6.5.95/scss/_functions.scss +0 -20
  689. nautobot/project-static/materialdesignicons-6.5.95/scss/_icons.scss +0 -10
  690. nautobot/project-static/materialdesignicons-6.5.95/scss/_path.scss +0 -10
  691. nautobot/project-static/materialdesignicons-6.5.95/scss/_variables.scss +0 -6606
  692. nautobot/project-static/materialdesignicons-6.5.95/scss/materialdesignicons.scss +0 -8
  693. /nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/LICENSE +0 -0
  694. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/LICENSE.txt +0 -0
  695. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/NOTICE +0 -0
  696. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/WHEEL +0 -0
  697. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/entry_points.txt +0 -0
@@ -1,3 +1,4 @@
1
+ from django.utils.html import format_html
1
2
  import django_tables2 as tables
2
3
  from django_tables2.utils import Accessor
3
4
 
@@ -23,6 +24,8 @@ from nautobot.dcim.models import (
23
24
  InterfaceRedundancyGroup,
24
25
  InterfaceRedundancyGroupAssociation,
25
26
  InventoryItem,
27
+ Module,
28
+ ModuleBay,
26
29
  Platform,
27
30
  PowerOutlet,
28
31
  PowerPort,
@@ -48,7 +51,8 @@ from .template_code import (
48
51
  INTERFACE_REDUNDANCY_GROUP_INTERFACES_IPADDRESSES,
49
52
  INTERFACE_REDUNDANCY_INTERFACE_PRIORITY,
50
53
  INTERFACE_TAGGED_VLANS,
51
- LINKED_RECORD_COUNT,
54
+ MODULE_BUTTONS,
55
+ MODULEBAY_BUTTONS,
52
56
  PATHENDPOINT,
53
57
  POWEROUTLET_BUTTONS,
54
58
  POWERPORT_BUTTONS,
@@ -62,16 +66,17 @@ __all__ = (
62
66
  "ControllerTable",
63
67
  "ControllerManagedDeviceGroupTable",
64
68
  "DeviceBayTable",
65
- "DeviceConsolePortTable",
66
- "DeviceConsoleServerPortTable",
67
69
  "DeviceDeviceBayTable",
68
- "DeviceFrontPortTable",
69
70
  "DeviceImportTable",
70
- "DeviceInterfaceTable",
71
71
  "DeviceInventoryItemTable",
72
- "DevicePowerPortTable",
73
- "DevicePowerOutletTable",
74
- "DeviceRearPortTable",
72
+ "DeviceModuleBayTable",
73
+ "DeviceModuleConsolePortTable",
74
+ "DeviceModuleConsoleServerPortTable",
75
+ "DeviceModuleFrontPortTable",
76
+ "DeviceModuleInterfaceTable",
77
+ "DeviceModulePowerPortTable",
78
+ "DeviceModulePowerOutletTable",
79
+ "DeviceModuleRearPortTable",
75
80
  "DeviceRedundancyGroupTable",
76
81
  "DeviceTable",
77
82
  "FrontPortTable",
@@ -79,6 +84,9 @@ __all__ = (
79
84
  "InterfaceRedundancyGroupTable",
80
85
  "InterfaceRedundancyGroupAssociationTable",
81
86
  "InventoryItemTable",
87
+ "ModuleTable",
88
+ "ModuleBayTable",
89
+ "ModuleModuleBayTable",
82
90
  "PlatformTable",
83
91
  "PowerOutletTable",
84
92
  "PowerPortTable",
@@ -234,6 +242,57 @@ class DeviceImportTable(BaseTable):
234
242
  empty_text = False
235
243
 
236
244
 
245
+ #
246
+ # Modules
247
+ #
248
+
249
+
250
+ class ModuleTable(StatusTableMixin, RoleTableMixin, BaseTable):
251
+ pk = ToggleColumn()
252
+ module_type = tables.Column(
253
+ linkify=lambda record: record.module_type.get_absolute_url(),
254
+ verbose_name="Type",
255
+ accessor="module_type__display",
256
+ )
257
+ parent_module_bay = tables.Column(
258
+ linkify=lambda record: record.parent_module_bay.get_absolute_url(),
259
+ verbose_name="Parent Module Bay",
260
+ accessor="parent_module_bay__display",
261
+ )
262
+ location = tables.Column(linkify=True)
263
+ tenant = TenantColumn()
264
+ tags = TagColumn(url_name="dcim:device_list")
265
+ actions = ButtonsColumn(Module, prepend_template=MODULE_BUTTONS)
266
+
267
+ class Meta(BaseTable.Meta):
268
+ model = Module
269
+ fields = (
270
+ "pk",
271
+ "module_type",
272
+ "parent_module_bay",
273
+ "location",
274
+ "serial",
275
+ "asset_tag",
276
+ "status",
277
+ "role",
278
+ "tenant",
279
+ "tags",
280
+ "actions",
281
+ )
282
+ default_columns = (
283
+ "pk",
284
+ "module_type",
285
+ "parent_module_bay",
286
+ "location",
287
+ "serial",
288
+ "asset_tag",
289
+ "status",
290
+ "role",
291
+ "tenant",
292
+ "actions",
293
+ )
294
+
295
+
237
296
  #
238
297
  # Device components
239
298
  #
@@ -245,8 +304,18 @@ class DeviceComponentTable(BaseTable):
245
304
  name = tables.Column(linkify=True, order_by=("_name",))
246
305
  cable = tables.Column(linkify=True)
247
306
 
248
- class Meta(BaseTable.Meta):
249
- order_by = ("device", "name")
307
+
308
+ class ModularDeviceComponentTable(DeviceComponentTable):
309
+ module = tables.Column()
310
+
311
+ def __init__(self, *args, parent_module=None, **kwargs):
312
+ self.parent_module = parent_module
313
+ super().__init__(*args, **kwargs)
314
+
315
+ def render_module(self, record, value, **kwargs):
316
+ if value and value == self.parent_module:
317
+ return self.default
318
+ return format_html('<a href="{}">{}</a>', value.get_absolute_url(), value)
250
319
 
251
320
 
252
321
  class CableTerminationTable(BaseTable):
@@ -268,14 +337,15 @@ class PathEndpointTable(CableTerminationTable):
268
337
  )
269
338
 
270
339
 
271
- class ConsolePortTable(DeviceComponentTable, PathEndpointTable):
340
+ class ConsolePortTable(ModularDeviceComponentTable, PathEndpointTable):
272
341
  tags = TagColumn(url_name="dcim:consoleport_list")
273
342
 
274
- class Meta(DeviceComponentTable.Meta):
343
+ class Meta(ModularDeviceComponentTable.Meta):
275
344
  model = ConsolePort
276
345
  fields = (
277
346
  "pk",
278
347
  "device",
348
+ "module",
279
349
  "name",
280
350
  "label",
281
351
  "type",
@@ -285,10 +355,10 @@ class ConsolePortTable(DeviceComponentTable, PathEndpointTable):
285
355
  "connection",
286
356
  "tags",
287
357
  )
288
- default_columns = ("pk", "device", "name", "label", "type", "description")
358
+ default_columns = ("pk", "device", "module", "name", "label", "type", "description")
289
359
 
290
360
 
291
- class DeviceConsolePortTable(ConsolePortTable):
361
+ class DeviceModuleConsolePortTable(ConsolePortTable):
292
362
  name = tables.TemplateColumn(
293
363
  template_code='<i class="mdi mdi-console"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
294
364
  attrs={"td": {"class": "text-nowrap"}},
@@ -299,12 +369,13 @@ class DeviceConsolePortTable(ConsolePortTable):
299
369
  prepend_template=CONSOLEPORT_BUTTONS,
300
370
  )
301
371
 
302
- class Meta(DeviceComponentTable.Meta):
372
+ class Meta(ModularDeviceComponentTable.Meta):
303
373
  model = ConsolePort
304
374
  fields = (
305
375
  "pk",
306
376
  "name",
307
377
  "label",
378
+ "module",
308
379
  "type",
309
380
  "description",
310
381
  "cable",
@@ -317,6 +388,7 @@ class DeviceConsolePortTable(ConsolePortTable):
317
388
  "pk",
318
389
  "name",
319
390
  "label",
391
+ "module",
320
392
  "type",
321
393
  "description",
322
394
  "cable",
@@ -328,14 +400,15 @@ class DeviceConsolePortTable(ConsolePortTable):
328
400
  }
329
401
 
330
402
 
331
- class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable):
403
+ class ConsoleServerPortTable(ModularDeviceComponentTable, PathEndpointTable):
332
404
  tags = TagColumn(url_name="dcim:consoleserverport_list")
333
405
 
334
- class Meta(DeviceComponentTable.Meta):
406
+ class Meta(ModularDeviceComponentTable.Meta):
335
407
  model = ConsoleServerPort
336
408
  fields = (
337
409
  "pk",
338
410
  "device",
411
+ "module",
339
412
  "name",
340
413
  "label",
341
414
  "type",
@@ -345,10 +418,10 @@ class ConsoleServerPortTable(DeviceComponentTable, PathEndpointTable):
345
418
  "connection",
346
419
  "tags",
347
420
  )
348
- default_columns = ("pk", "device", "name", "label", "type", "description")
421
+ default_columns = ("pk", "device", "module", "name", "label", "type", "description")
349
422
 
350
423
 
351
- class DeviceConsoleServerPortTable(ConsoleServerPortTable):
424
+ class DeviceModuleConsoleServerPortTable(ConsoleServerPortTable):
352
425
  name = tables.TemplateColumn(
353
426
  template_code='<i class="mdi mdi-console-network-outline"></i> '
354
427
  '<a href="{{ record.get_absolute_url }}">{{ value }}</a>',
@@ -360,12 +433,13 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable):
360
433
  prepend_template=CONSOLESERVERPORT_BUTTONS,
361
434
  )
362
435
 
363
- class Meta(DeviceComponentTable.Meta):
436
+ class Meta(ModularDeviceComponentTable.Meta):
364
437
  model = ConsoleServerPort
365
438
  fields = (
366
439
  "pk",
367
440
  "name",
368
441
  "label",
442
+ "module",
369
443
  "type",
370
444
  "description",
371
445
  "cable",
@@ -378,6 +452,7 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable):
378
452
  "pk",
379
453
  "name",
380
454
  "label",
455
+ "module",
381
456
  "type",
382
457
  "description",
383
458
  "cable",
@@ -389,14 +464,15 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable):
389
464
  }
390
465
 
391
466
 
392
- class PowerPortTable(DeviceComponentTable, PathEndpointTable):
467
+ class PowerPortTable(ModularDeviceComponentTable, PathEndpointTable):
393
468
  tags = TagColumn(url_name="dcim:powerport_list")
394
469
 
395
- class Meta(DeviceComponentTable.Meta):
470
+ class Meta(ModularDeviceComponentTable.Meta):
396
471
  model = PowerPort
397
472
  fields = (
398
473
  "pk",
399
474
  "device",
475
+ "module",
400
476
  "name",
401
477
  "label",
402
478
  "type",
@@ -411,6 +487,7 @@ class PowerPortTable(DeviceComponentTable, PathEndpointTable):
411
487
  default_columns = (
412
488
  "pk",
413
489
  "device",
490
+ "module",
414
491
  "name",
415
492
  "label",
416
493
  "type",
@@ -420,7 +497,7 @@ class PowerPortTable(DeviceComponentTable, PathEndpointTable):
420
497
  )
421
498
 
422
499
 
423
- class DevicePowerPortTable(PowerPortTable):
500
+ class DeviceModulePowerPortTable(PowerPortTable):
424
501
  name = tables.TemplateColumn(
425
502
  template_code='<i class="mdi mdi-power-plug-outline"></i> <a href="{{ record.get_absolute_url }}">'
426
503
  "{{ value }}</a>",
@@ -428,12 +505,13 @@ class DevicePowerPortTable(PowerPortTable):
428
505
  )
429
506
  actions = ButtonsColumn(model=PowerPort, buttons=("edit", "delete"), prepend_template=POWERPORT_BUTTONS)
430
507
 
431
- class Meta(DeviceComponentTable.Meta):
508
+ class Meta(ModularDeviceComponentTable.Meta):
432
509
  model = PowerPort
433
510
  fields = (
434
511
  "pk",
435
512
  "name",
436
513
  "label",
514
+ "module",
437
515
  "type",
438
516
  "maximum_draw",
439
517
  "allocated_draw",
@@ -448,6 +526,7 @@ class DevicePowerPortTable(PowerPortTable):
448
526
  "pk",
449
527
  "name",
450
528
  "label",
529
+ "module",
451
530
  "type",
452
531
  "maximum_draw",
453
532
  "allocated_draw",
@@ -459,15 +538,16 @@ class DevicePowerPortTable(PowerPortTable):
459
538
  row_attrs = {"style": cable_status_color_css}
460
539
 
461
540
 
462
- class PowerOutletTable(DeviceComponentTable, PathEndpointTable):
541
+ class PowerOutletTable(ModularDeviceComponentTable, PathEndpointTable):
463
542
  power_port = tables.Column(linkify=True)
464
543
  tags = TagColumn(url_name="dcim:poweroutlet_list")
465
544
 
466
- class Meta(DeviceComponentTable.Meta):
545
+ class Meta(ModularDeviceComponentTable.Meta):
467
546
  model = PowerOutlet
468
547
  fields = (
469
548
  "pk",
470
549
  "device",
550
+ "module",
471
551
  "name",
472
552
  "label",
473
553
  "type",
@@ -482,6 +562,7 @@ class PowerOutletTable(DeviceComponentTable, PathEndpointTable):
482
562
  default_columns = (
483
563
  "pk",
484
564
  "device",
565
+ "module",
485
566
  "name",
486
567
  "label",
487
568
  "type",
@@ -491,7 +572,7 @@ class PowerOutletTable(DeviceComponentTable, PathEndpointTable):
491
572
  )
492
573
 
493
574
 
494
- class DevicePowerOutletTable(PowerOutletTable):
575
+ class DeviceModulePowerOutletTable(PowerOutletTable):
495
576
  name = tables.TemplateColumn(
496
577
  template_code='<i class="mdi mdi-power-socket"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
497
578
  attrs={"td": {"class": "text-nowrap"}},
@@ -502,12 +583,13 @@ class DevicePowerOutletTable(PowerOutletTable):
502
583
  prepend_template=POWEROUTLET_BUTTONS,
503
584
  )
504
585
 
505
- class Meta(DeviceComponentTable.Meta):
586
+ class Meta(ModularDeviceComponentTable.Meta):
506
587
  model = PowerOutlet
507
588
  fields = (
508
589
  "pk",
509
590
  "name",
510
591
  "label",
592
+ "module",
511
593
  "type",
512
594
  "power_port",
513
595
  "feed_leg",
@@ -522,6 +604,7 @@ class DevicePowerOutletTable(PowerOutletTable):
522
604
  "pk",
523
605
  "name",
524
606
  "label",
607
+ "module",
525
608
  "type",
526
609
  "power_port",
527
610
  "feed_leg",
@@ -549,17 +632,19 @@ class BaseInterfaceTable(BaseTable):
549
632
  vrf = tables.Column(linkify=True, verbose_name="VRF")
550
633
 
551
634
 
552
- class InterfaceTable(StatusTableMixin, DeviceComponentTable, BaseInterfaceTable, PathEndpointTable):
635
+ class InterfaceTable(StatusTableMixin, ModularDeviceComponentTable, BaseInterfaceTable, PathEndpointTable):
553
636
  mgmt_only = BooleanColumn()
554
637
  tags = TagColumn(url_name="dcim:interface_list")
555
638
 
556
- class Meta(DeviceComponentTable.Meta):
639
+ class Meta(ModularDeviceComponentTable.Meta):
557
640
  model = Interface
558
641
  fields = (
559
642
  "pk",
560
643
  "device",
644
+ "module",
561
645
  "name",
562
646
  "status",
647
+ "role",
563
648
  "label",
564
649
  "enabled",
565
650
  "type",
@@ -580,8 +665,10 @@ class InterfaceTable(StatusTableMixin, DeviceComponentTable, BaseInterfaceTable,
580
665
  default_columns = (
581
666
  "pk",
582
667
  "device",
668
+ "module",
583
669
  "name",
584
670
  "status",
671
+ "role",
585
672
  "label",
586
673
  "enabled",
587
674
  "type",
@@ -589,7 +676,7 @@ class InterfaceTable(StatusTableMixin, DeviceComponentTable, BaseInterfaceTable,
589
676
  )
590
677
 
591
678
 
592
- class DeviceInterfaceTable(InterfaceTable):
679
+ class DeviceModuleInterfaceTable(InterfaceTable):
593
680
  name = tables.TemplateColumn(
594
681
  template_code='<i class="mdi mdi-{% if iface.mgmt_only %}wrench{% elif iface.is_lag %}drag-horizontal-variant'
595
682
  "{% elif iface.is_virtual %}circle{% elif iface.is_wireless %}wifi{% else %}ethernet"
@@ -601,14 +688,16 @@ class DeviceInterfaceTable(InterfaceTable):
601
688
  lag = tables.Column(linkify=True, verbose_name="LAG")
602
689
  actions = ButtonsColumn(model=Interface, buttons=("edit", "delete"), prepend_template=INTERFACE_BUTTONS)
603
690
 
604
- class Meta(DeviceComponentTable.Meta):
691
+ class Meta(ModularDeviceComponentTable.Meta):
605
692
  model = Interface
606
693
  fields = (
607
694
  "pk",
608
695
  "name",
609
696
  "status",
697
+ "role",
610
698
  "device",
611
699
  "label",
700
+ "module",
612
701
  "enabled",
613
702
  "type",
614
703
  "parent_interface",
@@ -633,7 +722,9 @@ class DeviceInterfaceTable(InterfaceTable):
633
722
  "pk",
634
723
  "name",
635
724
  "status",
725
+ "role",
636
726
  "label",
727
+ "module",
637
728
  "enabled",
638
729
  "type",
639
730
  "parent_interface",
@@ -653,16 +744,17 @@ class DeviceInterfaceTable(InterfaceTable):
653
744
  }
654
745
 
655
746
 
656
- class FrontPortTable(DeviceComponentTable, CableTerminationTable):
747
+ class FrontPortTable(ModularDeviceComponentTable, CableTerminationTable):
657
748
  rear_port_position = tables.Column(verbose_name="Position")
658
749
  rear_port = tables.Column(linkify=True)
659
750
  tags = TagColumn(url_name="dcim:frontport_list")
660
751
 
661
- class Meta(DeviceComponentTable.Meta):
752
+ class Meta(ModularDeviceComponentTable.Meta):
662
753
  model = FrontPort
663
754
  fields = (
664
755
  "pk",
665
756
  "device",
757
+ "module",
666
758
  "name",
667
759
  "label",
668
760
  "type",
@@ -676,6 +768,7 @@ class FrontPortTable(DeviceComponentTable, CableTerminationTable):
676
768
  default_columns = (
677
769
  "pk",
678
770
  "device",
771
+ "module",
679
772
  "name",
680
773
  "label",
681
774
  "type",
@@ -685,7 +778,7 @@ class FrontPortTable(DeviceComponentTable, CableTerminationTable):
685
778
  )
686
779
 
687
780
 
688
- class DeviceFrontPortTable(FrontPortTable):
781
+ class DeviceModuleFrontPortTable(FrontPortTable):
689
782
  name = tables.TemplateColumn(
690
783
  template_code='<i class="mdi mdi-square-rounded{% if not record.cable %}-outline{% endif %}"></i> '
691
784
  '<a href="{{ record.get_absolute_url }}">{{ value }}</a>',
@@ -693,12 +786,13 @@ class DeviceFrontPortTable(FrontPortTable):
693
786
  )
694
787
  actions = ButtonsColumn(model=FrontPort, buttons=("edit", "delete"), prepend_template=FRONTPORT_BUTTONS)
695
788
 
696
- class Meta(DeviceComponentTable.Meta):
789
+ class Meta(ModularDeviceComponentTable.Meta):
697
790
  model = FrontPort
698
791
  fields = (
699
792
  "pk",
700
793
  "name",
701
794
  "label",
795
+ "module",
702
796
  "type",
703
797
  "rear_port",
704
798
  "rear_port_position",
@@ -712,6 +806,7 @@ class DeviceFrontPortTable(FrontPortTable):
712
806
  "pk",
713
807
  "name",
714
808
  "label",
809
+ "module",
715
810
  "type",
716
811
  "rear_port",
717
812
  "rear_port_position",
@@ -723,14 +818,15 @@ class DeviceFrontPortTable(FrontPortTable):
723
818
  row_attrs = {"style": cable_status_color_css}
724
819
 
725
820
 
726
- class RearPortTable(DeviceComponentTable, CableTerminationTable):
821
+ class RearPortTable(ModularDeviceComponentTable, CableTerminationTable):
727
822
  tags = TagColumn(url_name="dcim:rearport_list")
728
823
 
729
- class Meta(DeviceComponentTable.Meta):
824
+ class Meta(ModularDeviceComponentTable.Meta):
730
825
  model = RearPort
731
826
  fields = (
732
827
  "pk",
733
828
  "device",
829
+ "module",
734
830
  "name",
735
831
  "label",
736
832
  "type",
@@ -740,10 +836,10 @@ class RearPortTable(DeviceComponentTable, CableTerminationTable):
740
836
  "cable_peer",
741
837
  "tags",
742
838
  )
743
- default_columns = ("pk", "device", "name", "label", "type", "description")
839
+ default_columns = ("pk", "device", "module", "name", "label", "type", "description")
744
840
 
745
841
 
746
- class DeviceRearPortTable(RearPortTable):
842
+ class DeviceModuleRearPortTable(RearPortTable):
747
843
  name = tables.TemplateColumn(
748
844
  template_code='<i class="mdi mdi-square-rounded{% if not record.cable %}-outline{% endif %}"></i> '
749
845
  '<a href="{{ record.get_absolute_url }}">{{ value }}</a>',
@@ -751,12 +847,13 @@ class DeviceRearPortTable(RearPortTable):
751
847
  )
752
848
  actions = ButtonsColumn(model=RearPort, buttons=("edit", "delete"), prepend_template=REARPORT_BUTTONS)
753
849
 
754
- class Meta(DeviceComponentTable.Meta):
850
+ class Meta(ModularDeviceComponentTable.Meta):
755
851
  model = RearPort
756
852
  fields = (
757
853
  "pk",
758
854
  "name",
759
855
  "label",
856
+ "module",
760
857
  "type",
761
858
  "positions",
762
859
  "description",
@@ -769,6 +866,7 @@ class DeviceRearPortTable(RearPortTable):
769
866
  "pk",
770
867
  "name",
771
868
  "label",
869
+ "module",
772
870
  "type",
773
871
  "positions",
774
872
  "description",
@@ -807,9 +905,53 @@ class DeviceBayTable(DeviceComponentTable):
807
905
  )
808
906
 
809
907
 
908
+ class ModuleBayTable(BaseTable):
909
+ pk = ToggleColumn()
910
+ parent_device = tables.Column(
911
+ linkify=lambda record: record.parent_device.get_absolute_url(),
912
+ verbose_name="Parent Device",
913
+ accessor="parent_device__display",
914
+ )
915
+ parent_module = tables.Column(
916
+ linkify=lambda record: record.parent_module.get_absolute_url(),
917
+ verbose_name="Parent Module",
918
+ accessor="parent_module__display",
919
+ )
920
+ name = tables.Column(linkify=True, order_by=("_name",))
921
+ installed_module = tables.Column(linkify=True, verbose_name="Installed Module")
922
+ installed_module__status = ColoredLabelColumn()
923
+ tags = TagColumn(url_name="dcim:devicebay_list")
924
+
925
+ class Meta(BaseTable.Meta):
926
+ model = ModuleBay
927
+ fields = (
928
+ "pk",
929
+ "parent_device",
930
+ "parent_module",
931
+ "name",
932
+ "position",
933
+ "label",
934
+ "description",
935
+ "installed_module",
936
+ "installed_module__status",
937
+ "tags",
938
+ )
939
+ default_columns = (
940
+ "pk",
941
+ "parent_device",
942
+ "parent_module",
943
+ "name",
944
+ "position",
945
+ "label",
946
+ "description",
947
+ "installed_module",
948
+ "installed_module__status",
949
+ )
950
+
951
+
810
952
  class DeviceDeviceBayTable(DeviceBayTable):
811
953
  name = tables.TemplateColumn(
812
- template_code='<i class="mdi mdi-circle{% if record.installed_device %}slice-8{% else %}outline{% endif %}'
954
+ template_code='<i class="mdi mdi-circle-{% if record.installed_device %}slice-8{% else %}outline{% endif %}'
813
955
  '"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
814
956
  attrs={"td": {"class": "text-nowrap"}},
815
957
  )
@@ -838,6 +980,46 @@ class DeviceDeviceBayTable(DeviceBayTable):
838
980
  )
839
981
 
840
982
 
983
+ class DeviceModuleBayTable(ModuleBayTable):
984
+ name = tables.TemplateColumn(
985
+ template_code='<i class="mdi mdi-{% if record.installed_module %}expansion-card-variant{% else %}tray{% endif %}'
986
+ '"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
987
+ attrs={"td": {"class": "text-nowrap"}},
988
+ )
989
+ installed_module = tables.Column(linkify=True, verbose_name="Installed Module")
990
+ installed_module__status = ColoredLabelColumn(verbose_name="Installed Module Status")
991
+ actions = ButtonsColumn(model=ModuleBay, buttons=("edit", "delete"), prepend_template=MODULEBAY_BUTTONS)
992
+
993
+ class Meta(ModularDeviceComponentTable.Meta):
994
+ model = ModuleBay
995
+ fields = (
996
+ "pk",
997
+ "name",
998
+ "position",
999
+ "installed_module",
1000
+ "installed_module__status",
1001
+ "label",
1002
+ "description",
1003
+ "tags",
1004
+ "actions",
1005
+ )
1006
+ default_columns = (
1007
+ "pk",
1008
+ "name",
1009
+ "position",
1010
+ "installed_module",
1011
+ "installed_module__status",
1012
+ "actions",
1013
+ )
1014
+
1015
+
1016
+ class ModuleModuleBayTable(DeviceModuleBayTable):
1017
+ actions = ButtonsColumn(model=ModuleBay, buttons=("edit", "delete"), prepend_template=MODULEBAY_BUTTONS)
1018
+
1019
+ class Meta(DeviceModuleBayTable.Meta):
1020
+ pass
1021
+
1022
+
841
1023
  class InventoryItemTable(DeviceComponentTable):
842
1024
  manufacturer = tables.Column(linkify=True)
843
1025
  discovered = BooleanColumn()
@@ -943,27 +1125,13 @@ class DeviceRedundancyGroupTable(BaseTable):
943
1125
  url_params={"device_redundancy_group": "pk"},
944
1126
  verbose_name="Devices",
945
1127
  )
946
- controller_count = LinkedCountColumn(
947
- viewname="dcim:controller_list",
948
- url_params={"controller_device_redundancy_group": "pk"},
949
- verbose_name="Controllers",
950
- )
951
1128
  secrets_group = tables.Column(linkify=True)
952
1129
  tags = TagColumn(url_name="dcim:deviceredundancygroup_list")
953
1130
 
954
1131
  class Meta(BaseTable.Meta):
955
1132
  model = DeviceRedundancyGroup
956
- fields = (
957
- "pk",
958
- "name",
959
- "status",
960
- "failover_strategy",
961
- "controller_count",
962
- "device_count",
963
- "secrets_group",
964
- "tags",
965
- )
966
- default_columns = ("pk", "name", "status", "failover_strategy", "controller_count", "device_count")
1133
+ fields = ("pk", "name", "status", "failover_strategy", "device_count", "secrets_group", "tags")
1134
+ default_columns = ("pk", "name", "status", "failover_strategy", "device_count")
967
1135
 
968
1136
 
969
1137
  #
@@ -1201,7 +1369,11 @@ class ControllerManagedDeviceGroupTable(BaseTable):
1201
1369
  controller = tables.Column(linkify=True)
1202
1370
  tags = TagColumn(url_name="dcim:controllermanageddevicegroup_list")
1203
1371
  actions = ButtonsColumn(ControllerManagedDeviceGroup)
1204
- device_count = tables.TemplateColumn(template_code=LINKED_RECORD_COUNT, verbose_name="Devices")
1372
+ device_count = LinkedCountColumn(
1373
+ viewname="dcim:device_list",
1374
+ url_params={"controller_managed_device_group": "pk"},
1375
+ verbose_name="Devices",
1376
+ )
1205
1377
 
1206
1378
  class Meta(BaseTable.Meta):
1207
1379
  """Meta attributes."""