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
@@ -23,11 +23,14 @@ __all__ = (
23
23
  "VMInterfaceTable",
24
24
  )
25
25
 
26
+ # TODO: re-introduce assign ip address button?
26
27
  VMINTERFACE_BUTTONS = """
27
- {% if perms.ipam.add_ipaddress and perms.virtualization.change_vminterface %}
28
- <a href="{% url 'ipam:ipaddress_add' %}?vminterface={{ record.pk }}&return_url={{ request.path }}" class="btn btn-xs btn-success" title="Add IP address">
28
+ {% if perms.ipam.add_ipaddress %}
29
+ <!--
30
+ <a href="{% url 'ipam:ipaddress_add' %}?vminterface={{ record.pk }}&return_url={{ virtualmachine.get_absolute_url }}" class="btn btn-xs btn-success" title="Add IP address">
29
31
  <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
30
32
  </a>
33
+ -->
31
34
  {% endif %}
32
35
  """
33
36
 
@@ -40,7 +43,9 @@ VMINTERFACE_BUTTONS = """
40
43
  class ClusterTypeTable(BaseTable):
41
44
  pk = ToggleColumn()
42
45
  name = tables.LinkColumn()
43
- cluster_count = tables.Column(verbose_name="Clusters")
46
+ cluster_count = LinkedCountColumn(
47
+ viewname="virtualization:cluster_list", url_params={"cluster_type": "pk"}, verbose_name="Clusters"
48
+ )
44
49
  actions = ButtonsColumn(ClusterType)
45
50
 
46
51
  class Meta(BaseTable.Meta):
@@ -57,7 +62,9 @@ class ClusterTypeTable(BaseTable):
57
62
  class ClusterGroupTable(BaseTable):
58
63
  pk = ToggleColumn()
59
64
  name = tables.LinkColumn()
60
- cluster_count = tables.Column(verbose_name="Clusters")
65
+ cluster_count = LinkedCountColumn(
66
+ viewname="virtualization:cluster_list", url_params={"cluster_group": "pk"}, verbose_name="Clusters"
67
+ )
61
68
  actions = ButtonsColumn(ClusterGroup)
62
69
 
63
70
  class Meta(BaseTable.Meta):
@@ -194,6 +201,7 @@ class VMInterfaceTable(StatusTableMixin, BaseInterfaceTable):
194
201
  "virtual_machine",
195
202
  "name",
196
203
  "status",
204
+ "role",
197
205
  "enabled",
198
206
  "mac_address",
199
207
  "mtu",
@@ -204,7 +212,7 @@ class VMInterfaceTable(StatusTableMixin, BaseInterfaceTable):
204
212
  "untagged_vlan",
205
213
  "tagged_vlans",
206
214
  )
207
- default_columns = ("pk", "virtual_machine", "name", "status", "enabled", "description")
215
+ default_columns = ("pk", "virtual_machine", "name", "status", "role", "enabled", "description")
208
216
 
209
217
 
210
218
  class VirtualMachineVMInterfaceTable(VMInterfaceTable):
@@ -222,6 +230,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable):
222
230
  "pk",
223
231
  "name",
224
232
  "status",
233
+ "role",
225
234
  "enabled",
226
235
  "parent_interface",
227
236
  "bridge",
@@ -239,6 +248,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable):
239
248
  "pk",
240
249
  "name",
241
250
  "status",
251
+ "role",
242
252
  "enabled",
243
253
  "parent_interface",
244
254
  "mac_address",
@@ -215,7 +215,7 @@
215
215
  <strong>Interfaces</strong>
216
216
  <div class="pull-right noprint">
217
217
  {% if request.user.is_authenticated %}
218
- <button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target="#VirtualMachineVMInterfaceTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
218
+ {% table_config_button_small vminterface_table %}
219
219
  {% endif %}
220
220
  </div>
221
221
  <div class="pull-right col-md-2 noprint">
@@ -20,7 +20,13 @@
20
20
  <td>
21
21
  {{ object.status| hyperlinked_object_with_color }}
22
22
  </td>
23
- </tr>
23
+ </tr>
24
+ <tr>
25
+ <td>Role</td>
26
+ <td>
27
+ {{ object.role| hyperlinked_object_with_color }}
28
+ </td>
29
+ </tr>
24
30
  <tr>
25
31
  <td>Enabled</td>
26
32
  <td>{{ object.enabled | render_boolean }}</td>
@@ -9,6 +9,7 @@
9
9
  {% render_field form.virtual_machine %}
10
10
  {% render_field form.name %}
11
11
  {% render_field form.status %}
12
+ {% render_field form.role %}
12
13
  {% render_field form.enabled %}
13
14
  {% render_field form.parent_interface %}
14
15
  {% render_field form.bridge %}
@@ -4,7 +4,7 @@ from rest_framework import status
4
4
  from nautobot.core.testing import APITestCase, APIViewTestCases
5
5
  from nautobot.dcim.choices import InterfaceModeChoices
6
6
  from nautobot.dcim.models import Location, LocationType, SoftwareVersion
7
- from nautobot.extras.models import ConfigContextSchema, Status
7
+ from nautobot.extras.models import ConfigContextSchema, Role, Status
8
8
  from nautobot.ipam.models import VLAN, VLANGroup
9
9
  from nautobot.virtualization.models import (
10
10
  Cluster,
@@ -289,11 +289,15 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase):
289
289
  vm_status = Status.objects.get_for_model(VirtualMachine).first()
290
290
  virtualmachine = VirtualMachine.objects.create(cluster=cluster, name="Test VM 1", status=vm_status)
291
291
  cls.interface_status = Status.objects.get_for_model(VMInterface).first()
292
-
292
+ cls.interface_role = Role.objects.get_for_model(VMInterface).first()
293
293
  interfaces = (
294
- VMInterface.objects.create(virtual_machine=virtualmachine, name="Interface 1", status=cls.interface_status),
294
+ VMInterface.objects.create(
295
+ virtual_machine=virtualmachine, name="Interface 1", status=cls.interface_status, role=cls.interface_role
296
+ ),
295
297
  VMInterface.objects.create(virtual_machine=virtualmachine, name="Interface 2", status=cls.interface_status),
296
- VMInterface.objects.create(virtual_machine=virtualmachine, name="Interface 3", status=cls.interface_status),
298
+ VMInterface.objects.create(
299
+ virtual_machine=virtualmachine, name="Interface 3", status=cls.interface_status, role=cls.interface_role
300
+ ),
297
301
  )
298
302
 
299
303
  vlan_status = Status.objects.get_for_model(VLAN).first()
@@ -380,6 +384,7 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase):
380
384
  name="VMInterface 1",
381
385
  mode=InterfaceModeChoices.MODE_TAGGED,
382
386
  status=self.interface_status,
387
+ role=self.interface_role,
383
388
  )
384
389
  interface.tagged_vlans.add(vlan)
385
390
  payload = {"mode": None, "tagged_vlans": [vlan.pk]}
@@ -346,6 +346,7 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
346
346
  memory=3,
347
347
  disk=3,
348
348
  comments="This is VM 4",
349
+ software_version=None,
349
350
  ),
350
351
  VirtualMachine.objects.create(
351
352
  name="Virtual Machine 5",
@@ -358,6 +359,7 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
358
359
  memory=3,
359
360
  disk=3,
360
361
  comments="This is VM 5",
362
+ software_version=None,
361
363
  ),
362
364
  VirtualMachine.objects.create(
363
365
  name="Virtual Machine 6",
@@ -370,24 +372,28 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
370
372
  memory=3,
371
373
  disk=3,
372
374
  comments="This is VM 6",
375
+ software_version=cls.software_versions[1],
373
376
  ),
374
377
  )
375
378
  vms[0].software_image_files.set(cls.software_versions[1].software_image_files.all())
376
379
  vms[1].software_image_files.set(cls.software_versions[0].software_image_files.all())
377
380
 
378
381
  int_status = Status.objects.get_for_model(VMInterface).first()
382
+ int_role = Role.objects.get_for_model(VMInterface).first()
379
383
  cls.interfaces = (
380
384
  VMInterface.objects.create(
381
385
  virtual_machine=vms[0],
382
386
  name="Interface 1",
383
387
  mac_address="00-00-00-00-00-01",
384
388
  status=int_status,
389
+ role=int_role,
385
390
  ),
386
391
  VMInterface.objects.create(
387
392
  virtual_machine=vms[1],
388
393
  name="Interface 2",
389
394
  mac_address="00-00-00-00-00-02",
390
395
  status=int_status,
396
+ role=int_role,
391
397
  ),
392
398
  VMInterface.objects.create(
393
399
  virtual_machine=vms[2],
@@ -435,6 +441,15 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
435
441
  vms[0].tags.set(Tag.objects.get_for_model(VirtualMachine))
436
442
  vms[1].tags.set(Tag.objects.get_for_model(VirtualMachine)[:3])
437
443
 
444
+ def test_filters_generic(self):
445
+ # Assign more than 2 different software versions to VirtualMachine before we test generic filters
446
+ software_versions = list(SoftwareVersion.objects.all())
447
+ virtual_machines = list(VirtualMachine.objects.all())
448
+ for i in range(4):
449
+ virtual_machines[i].software_version = software_versions[i]
450
+ virtual_machines[i].save()
451
+ return super().test_filters_generic()
452
+
438
453
  def test_name(self):
439
454
  params = {"name": ["Virtual Machine 1", "Virtual Machine 2"]}
440
455
  self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -594,6 +609,8 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
594
609
  ["mac_address"],
595
610
  ["mtu"],
596
611
  ["name"],
612
+ ("role", "role__id"),
613
+ ("role", "role__name"),
597
614
  ["parent_interface"],
598
615
  ["tagged_vlans", "tagged_vlans__pk"],
599
616
  ["tagged_vlans", "tagged_vlans__vid"],
@@ -625,6 +642,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
625
642
  )
626
643
 
627
644
  statuses = Status.objects.get_for_model(VMInterface)
645
+ roles = Role.objects.get_for_model(VMInterface)
628
646
 
629
647
  vlans = VLAN.objects.filter()[:2]
630
648
  vlans[0].locations.clear()
@@ -640,6 +658,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
640
658
  enabled=True,
641
659
  mtu=100,
642
660
  mac_address="00-00-00-00-00-01",
661
+ role=roles[0],
643
662
  status=statuses[0],
644
663
  description="This is a description of Interface1",
645
664
  mode=InterfaceModeChoices.MODE_ACCESS,
@@ -651,6 +670,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
651
670
  enabled=True,
652
671
  mtu=200,
653
672
  mac_address="00-00-00-00-00-02",
673
+ role=roles[1],
654
674
  status=statuses[0],
655
675
  description="This is a description of Interface2",
656
676
  mode=InterfaceModeChoices.MODE_ACCESS,
@@ -676,6 +696,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
676
696
  enabled=False,
677
697
  mtu=300,
678
698
  mac_address="00-00-00-00-00-04",
699
+ role=roles[0],
679
700
  status=statuses[1],
680
701
  description="This is a description of Interface4",
681
702
  mode=InterfaceModeChoices.MODE_TAGGED,
@@ -688,6 +709,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
688
709
  enabled=False,
689
710
  mtu=300,
690
711
  mac_address="00-00-00-00-00-05",
712
+ role=roles[1],
691
713
  status=statuses[2],
692
714
  description="This is a description of Interface5",
693
715
  mode=InterfaceModeChoices.MODE_TAGGED_ALL,
@@ -3,7 +3,7 @@ from django.core.exceptions import ValidationError
3
3
  from django.test import TestCase
4
4
 
5
5
  from nautobot.dcim.models import Location, LocationType
6
- from nautobot.extras.models import Status
6
+ from nautobot.extras.models import Role, Status
7
7
  from nautobot.ipam.factory import VLANGroupFactory
8
8
  from nautobot.ipam.models import IPAddress, IPAddressToInterface, VLAN
9
9
  from nautobot.tenancy.models import Tenant
@@ -32,6 +32,7 @@ class VirtualMachineTestCase(TestCase): # TODO: change to BaseModelTestCase
32
32
  self.cluster = Cluster.objects.create(name="Test Cluster 1", cluster_type=cluster_type)
33
33
  self.status = statuses[0]
34
34
  self.int_status = Status.objects.get_for_model(VMInterface).first()
35
+ self.int_role = Role.objects.get_for_model(VMInterface).first()
35
36
 
36
37
  def test_vm_duplicate_name_per_cluster(self):
37
38
  vm1 = VirtualMachine(
@@ -73,7 +74,9 @@ class VirtualMachineTestCase(TestCase): # TODO: change to BaseModelTestCase
73
74
  status=self.status,
74
75
  )
75
76
  vm1.save()
76
- vm_interface = VMInterface.objects.create(name="Int1", virtual_machine=vm1, status=self.int_status)
77
+ vm_interface = VMInterface.objects.create(
78
+ name="Int1", virtual_machine=vm1, status=self.int_status, role=self.int_role
79
+ )
77
80
  ips = list(IPAddress.objects.filter(ip_version=4)[:5]) + list(IPAddress.objects.filter(ip_version=6)[:5])
78
81
  vm_interface.add_ip_addresses(ips)
79
82
  vm1.primary_ip4 = vm_interface.ip_addresses.all().filter(ip_version=6).first()
@@ -110,10 +113,11 @@ class VMInterfaceTestCase(TestCase): # TODO: change to BaseModelTestCase
110
113
  vm_status = Status.objects.get_for_model(VirtualMachine).first()
111
114
  cls.virtualmachine = VirtualMachine.objects.create(cluster=cluster, name="Test VM 1", status=vm_status)
112
115
  cls.int_status = Status.objects.get_for_model(VMInterface).first()
116
+ cls.int_role = Role.objects.get_for_model(VMInterface).first()
113
117
 
114
118
  def test_tagged_vlan_raise_error_if_mode_not_set_to_tagged(self):
115
119
  interface = VMInterface.objects.create(
116
- virtual_machine=self.virtualmachine, name="Interface 1", status=self.int_status
120
+ virtual_machine=self.virtualmachine, name="Interface 1", status=self.int_status, role=self.int_role
117
121
  )
118
122
  with self.assertRaises(ValidationError) as err:
119
123
  interface.tagged_vlans.add(self.vlan)
@@ -265,11 +265,15 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
265
265
 
266
266
  statuses = Status.objects.get_for_model(VMInterface)
267
267
  status = statuses.first()
268
-
268
+ role = Role.objects.get_for_model(VMInterface).first()
269
269
  interfaces = (
270
- VMInterface.objects.create(virtual_machine=virtualmachines[0], name="Interface 1", status=status),
270
+ VMInterface.objects.create(
271
+ virtual_machine=virtualmachines[0], name="Interface 1", status=status, role=role
272
+ ),
271
273
  VMInterface.objects.create(virtual_machine=virtualmachines[0], name="Interface 2", status=status),
272
- VMInterface.objects.create(virtual_machine=virtualmachines[0], name="Interface 3", status=status),
274
+ VMInterface.objects.create(
275
+ virtual_machine=virtualmachines[0], name="Interface 3", status=status, role=role
276
+ ),
273
277
  VMInterface.objects.create(virtual_machine=virtualmachines[1], name="BRIDGE", status=status),
274
278
  )
275
279
  # Required by ViewTestCases.DeviceComponentViewTestCase.test_bulk_rename
@@ -332,15 +336,27 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
332
336
  "mode": InterfaceModeChoices.MODE_TAGGED,
333
337
  "custom_field_1": "Custom field data",
334
338
  "tags": [],
339
+ "role": role.pk,
335
340
  }
336
341
 
337
342
  cls.bulk_edit_data = {
338
343
  "enabled": False,
339
344
  "mtu": 2000,
340
345
  "status": status.pk,
346
+ "role": role.pk,
341
347
  "description": "New description",
342
348
  "mode": InterfaceModeChoices.MODE_TAGGED,
343
349
  "untagged_vlan": vlans[0].pk,
344
350
  "tagged_vlans": [v.pk for v in vlans[1:4]],
345
351
  "custom_field_1": "New Custom Field Data",
346
352
  }
353
+
354
+ def _edit_object_test_setup(self):
355
+ test_instance = self._get_queryset().first()
356
+ self.update_data = {
357
+ "name": test_instance.name,
358
+ "virtual_machine": test_instance.virtual_machine.pk,
359
+ "status": test_instance.status.pk,
360
+ "label": "new test label",
361
+ "description": "new test description",
362
+ }
@@ -123,7 +123,7 @@ urlpatterns = [
123
123
  name="cluster_changelog",
124
124
  kwargs={"model": Cluster},
125
125
  ),
126
- path(
126
+ path( # 3.0 TODO: remove, no longer needed/used since 2.3
127
127
  "clusters/<uuid:pk>/dynamic-groups/",
128
128
  ObjectDynamicGroupsView.as_view(),
129
129
  name="cluster_dynamicgroups",
@@ -197,7 +197,7 @@ urlpatterns = [
197
197
  name="virtualmachine_changelog",
198
198
  kwargs={"model": VirtualMachine},
199
199
  ),
200
- path(
200
+ path( # 3.0 TODO: remove, no longer needed/used since 2.3
201
201
  "virtual-machines/<uuid:pk>/dynamic-groups/",
202
202
  ObjectDynamicGroupsView.as_view(),
203
203
  name="virtualmachine_dynamicgroups",
@@ -6,7 +6,6 @@ from django.urls import reverse
6
6
  from django.utils.functional import cached_property
7
7
  from django_tables2 import RequestConfig
8
8
 
9
- from nautobot.core.models.querysets import count_related
10
9
  from nautobot.core.utils.requests import normalize_querydict
11
10
  from nautobot.core.views import generic
12
11
  from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
@@ -25,7 +24,7 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
25
24
 
26
25
 
27
26
  class ClusterTypeListView(generic.ObjectListView):
28
- queryset = ClusterType.objects.annotate(cluster_count=count_related(Cluster, "cluster_type"))
27
+ queryset = ClusterType.objects.all()
29
28
  filterset = filters.ClusterTypeFilterSet
30
29
  filterset_form = forms.ClusterTypeFilterForm
31
30
  table = tables.ClusterTypeTable
@@ -36,14 +35,7 @@ class ClusterTypeView(generic.ObjectView):
36
35
 
37
36
  def get_extra_context(self, request, instance):
38
37
  # Clusters
39
- clusters = (
40
- Cluster.objects.restrict(request.user, "view")
41
- .filter(cluster_type=instance)
42
- .select_related("cluster_group", "location", "tenant")
43
- ).annotate(
44
- device_count=count_related(Device, "cluster"),
45
- vm_count=count_related(VirtualMachine, "cluster"),
46
- )
38
+ clusters = Cluster.objects.restrict(request.user, "view").filter(cluster_type=instance)
47
39
 
48
40
  cluster_table = tables.ClusterTable(clusters)
49
41
  cluster_table.columns.hide("cluster_type")
@@ -72,7 +64,7 @@ class ClusterTypeBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, un
72
64
 
73
65
 
74
66
  class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
75
- queryset = ClusterType.objects.annotate(cluster_count=count_related(Cluster, "cluster_type"))
67
+ queryset = ClusterType.objects.all()
76
68
  table = tables.ClusterTypeTable
77
69
  filterset = filters.ClusterTypeFilterSet
78
70
 
@@ -83,7 +75,7 @@ class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
83
75
 
84
76
 
85
77
  class ClusterGroupListView(generic.ObjectListView):
86
- queryset = ClusterGroup.objects.annotate(cluster_count=count_related(Cluster, "cluster_group"))
78
+ queryset = ClusterGroup.objects.all()
87
79
  filterset = filters.ClusterGroupFilterSet
88
80
  filterset_form = forms.ClusterGroupFilterForm
89
81
  table = tables.ClusterGroupTable
@@ -94,14 +86,7 @@ class ClusterGroupView(generic.ObjectView):
94
86
 
95
87
  def get_extra_context(self, request, instance):
96
88
  # Clusters
97
- clusters = (
98
- Cluster.objects.restrict(request.user, "view")
99
- .filter(cluster_group=instance)
100
- .select_related("cluster_type", "location", "tenant")
101
- ).annotate(
102
- device_count=count_related(Device, "cluster"),
103
- vm_count=count_related(VirtualMachine, "cluster"),
104
- )
89
+ clusters = Cluster.objects.restrict(request.user, "view").filter(cluster_group=instance)
105
90
 
106
91
  cluster_table = tables.ClusterTable(clusters)
107
92
  cluster_table.columns.hide("cluster_group")
@@ -130,7 +115,7 @@ class ClusterGroupBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, u
130
115
 
131
116
 
132
117
  class ClusterGroupBulkDeleteView(generic.BulkDeleteView):
133
- queryset = ClusterGroup.objects.annotate(cluster_count=count_related(Cluster, "cluster_group"))
118
+ queryset = ClusterGroup.objects.all()
134
119
  table = tables.ClusterGroupTable
135
120
  filterset = filters.ClusterGroupFilterSet
136
121
 
@@ -142,10 +127,7 @@ class ClusterGroupBulkDeleteView(generic.BulkDeleteView):
142
127
 
143
128
  class ClusterListView(generic.ObjectListView):
144
129
  permission_required = "virtualization.view_cluster"
145
- queryset = Cluster.objects.annotate(
146
- device_count=count_related(Device, "cluster"),
147
- vm_count=count_related(VirtualMachine, "cluster"),
148
- )
130
+ queryset = Cluster.objects.all()
149
131
  table = tables.ClusterTable
150
132
  filterset = filters.ClusterFilterSet
151
133
  filterset_form = forms.ClusterFilterForm
@@ -155,11 +137,7 @@ class ClusterView(generic.ObjectView):
155
137
  queryset = Cluster.objects.all()
156
138
 
157
139
  def get_extra_context(self, request, instance):
158
- devices = (
159
- Device.objects.restrict(request.user, "view")
160
- .filter(cluster=instance)
161
- .select_related("location", "rack", "tenant", "device_type__manufacturer")
162
- )
140
+ devices = Device.objects.restrict(request.user, "view").filter(cluster=instance)
163
141
  device_table = DeviceTable(list(devices), orderable=False)
164
142
  if request.user.has_perm("virtualization.change_cluster"):
165
143
  device_table.columns.show("pk")
@@ -183,14 +161,14 @@ class ClusterBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, unused
183
161
 
184
162
 
185
163
  class ClusterBulkEditView(generic.BulkEditView):
186
- queryset = Cluster.objects.select_related("cluster_type", "cluster_group", "location")
164
+ queryset = Cluster.objects.all()
187
165
  filterset = filters.ClusterFilterSet
188
166
  table = tables.ClusterTable
189
167
  form = forms.ClusterBulkEditForm
190
168
 
191
169
 
192
170
  class ClusterBulkDeleteView(generic.BulkDeleteView):
193
- queryset = Cluster.objects.select_related("cluster_type", "cluster_group", "location")
171
+ queryset = Cluster.objects.all()
194
172
  filterset = filters.ClusterFilterSet
195
173
  table = tables.ClusterTable
196
174
 
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nautobot
3
- Version: 2.2.9
3
+ Version: 2.3.0b1
4
4
  Summary: Source of truth and network automation platform.
5
5
  Home-page: https://nautobot.com
6
6
  License: Apache-2.0
7
7
  Keywords: Nautobot
8
8
  Author: Network to Code
9
9
  Author-email: opensource@networktocode.com
10
- Requires-Python: >=3.8,<3.12
10
+ Requires-Python: >=3.8,<3.13
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: Apache Software License
@@ -16,50 +16,52 @@ Classifier: Programming Language :: Python :: 3.8
16
16
  Classifier: Programming Language :: Python :: 3.9
17
17
  Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
19
20
  Provides-Extra: all
20
21
  Provides-Extra: ldap
21
22
  Provides-Extra: mysql
22
23
  Provides-Extra: napalm
23
24
  Provides-Extra: remote-storage
24
25
  Provides-Extra: sso
25
- Requires-Dist: Django (>=3.2.25,<3.3.0)
26
+ Requires-Dist: Django (>=4.2.14,<4.3.0)
26
27
  Requires-Dist: GitPython (>=3.1.43,<3.2.0)
27
28
  Requires-Dist: Jinja2 (>=3.1.4,<3.2.0)
28
- Requires-Dist: Markdown (>=3.5.2,<3.6.0)
29
+ Requires-Dist: Markdown (>=3.6,<3.7)
29
30
  Requires-Dist: MarkupSafe (>=2.1.5,<2.2.0)
30
31
  Requires-Dist: Pillow (>=10.3.0,<10.4.0)
31
32
  Requires-Dist: PyYAML (>=6.0,<6.1)
32
- Requires-Dist: celery (>=5.3.1,<5.4.0)
33
+ Requires-Dist: celery (>=5.3.6,<5.4.0)
33
34
  Requires-Dist: django-ajax-tables (>=1.1.1,<1.2.0)
34
- Requires-Dist: django-auth-ldap (>=4.7.0,<4.8.0) ; extra == "all" or extra == "ldap"
35
+ Requires-Dist: django-auth-ldap (>=4.8.0,<4.9.0) ; extra == "all" or extra == "ldap"
35
36
  Requires-Dist: django-celery-beat (>=2.6.0,<2.7.0)
36
37
  Requires-Dist: django-celery-results (>=2.5.1,<2.6.0)
37
- Requires-Dist: django-constance[database] (>=2.9.1,<2.10.0)
38
- Requires-Dist: django-cors-headers (>=4.3.1,<4.4.0)
39
- Requires-Dist: django-db-file-storage (>=0.5.5,<0.6.0)
38
+ Requires-Dist: django-constance (>=3.1.0,<3.2.0)
39
+ Requires-Dist: django-cors-headers (>=4.4.0,<4.5.0)
40
+ Requires-Dist: django-db-file-storage (>=0.5.6.1,<0.6.0.0)
40
41
  Requires-Dist: django-extensions (>=3.2.3,<3.3.0)
41
- Requires-Dist: django-filter (>=23.5,<23.6)
42
- Requires-Dist: django-health-check (>=3.18.1,<3.19.0)
42
+ Requires-Dist: django-filter (>=24.2,<24.3)
43
+ Requires-Dist: django-health-check (>=3.18.3,<3.19.0)
43
44
  Requires-Dist: django-jinja (>=2.11.0,<2.12.0)
44
45
  Requires-Dist: django-prometheus (>=2.3.1,<2.4.0)
45
46
  Requires-Dist: django-redis (>=5.4.0,<5.5.0)
46
47
  Requires-Dist: django-silk (>=5.1.0,<5.2.0)
47
- Requires-Dist: django-storages (==1.14.3) ; extra == "all" or extra == "remote-storage"
48
+ Requires-Dist: django-storages (>=1.14.4,<1.15.0) ; extra == "all" or extra == "remote-storage"
49
+ Requires-Dist: django-structlog[all] (>=8.1.0,<9.0.0)
48
50
  Requires-Dist: django-tables2 (>=2.7.0,<2.8.0)
49
- Requires-Dist: django-taggit (>=4.0.0,<4.1.0)
50
- Requires-Dist: django-timezone-field (>=5.1,<5.2)
51
- Requires-Dist: django-tree-queries (>=0.17.0,<0.18.0)
51
+ Requires-Dist: django-taggit (>=5.0.0,<5.1.0)
52
+ Requires-Dist: django-timezone-field (>=7.0,<7.1)
53
+ Requires-Dist: django-tree-queries (>=0.19.0,<0.20.0)
52
54
  Requires-Dist: django-webserver (>=1.2.0,<1.3.0)
53
- Requires-Dist: djangorestframework (>=3.15.1,<3.16.0)
55
+ Requires-Dist: djangorestframework (>=3.15.2,<3.16.0)
54
56
  Requires-Dist: drf-react-template-framework (>=0.0.17,<0.0.18)
55
57
  Requires-Dist: drf-spectacular[sidecar] (>=0.27.2,<0.28.0)
56
- Requires-Dist: emoji (>=2.11.0,<2.12.0)
58
+ Requires-Dist: emoji (>=2.12.1,<2.13.0)
57
59
  Requires-Dist: graphene-django (>=2.16.0,<2.17.0)
58
60
  Requires-Dist: graphene-django-optimizer (>=0.8.0,<0.9.0)
59
61
  Requires-Dist: jsonschema (>=4.7.0,<5.0.0)
60
62
  Requires-Dist: mysqlclient (>=2.2.3,<2.3.0) ; extra == "all" or extra == "mysql"
61
- Requires-Dist: napalm (>=4.1.0,<4.2.0) ; extra == "all" or extra == "napalm"
62
- Requires-Dist: netaddr (>=0.10.1,<0.11.0)
63
+ Requires-Dist: napalm (>=4.1.0,<6.0.0) ; extra == "all" or extra == "napalm"
64
+ Requires-Dist: netaddr (>=1.3.0,<1.4.0)
63
65
  Requires-Dist: netutils (>=1.6.0,<2.0.0)
64
66
  Requires-Dist: nh3 (>=0.2.15,<0.3.0)
65
67
  Requires-Dist: packaging (>=23.1)