nautobot 2.2.8__py3-none-any.whl → 2.3.0__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 (704) 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 +113 -0
  26. nautobot/cloud/filters.py +187 -0
  27. nautobot/cloud/forms.py +339 -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 +246 -0
  32. nautobot/cloud/navigation.py +85 -0
  33. nautobot/cloud/tables.py +157 -0
  34. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
  35. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +122 -0
  36. nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
  37. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +111 -0
  38. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +69 -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 +125 -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 +110 -14
  57. nautobot/core/forms/fields.py +10 -4
  58. nautobot/core/forms/forms.py +11 -3
  59. nautobot/core/forms/widgets.py +18 -1
  60. nautobot/core/graphql/generators.py +2 -2
  61. nautobot/core/graphql/schema.py +28 -7
  62. nautobot/core/jobs/__init__.py +20 -3
  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 +15 -19
  73. nautobot/core/settings.yaml +48 -13
  74. nautobot/core/settings_funcs.py +103 -0
  75. nautobot/core/tables.py +130 -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 +28 -8
  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 +63 -14
  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 +204 -2
  120. nautobot/core/tests/test_tables.py +3 -1
  121. nautobot/core/tests/test_templatetags_helpers.py +12 -5
  122. nautobot/core/tests/test_templatetags_netutils.py +3 -3
  123. nautobot/core/tests/test_utils.py +31 -20
  124. nautobot/core/tests/test_views.py +6 -6
  125. nautobot/core/urls.py +8 -3
  126. nautobot/core/utils/deprecation.py +29 -0
  127. nautobot/core/utils/filtering.py +12 -9
  128. nautobot/core/utils/lookup.py +37 -2
  129. nautobot/core/utils/requests.py +4 -1
  130. nautobot/core/views/__init__.py +137 -24
  131. nautobot/core/views/generic.py +119 -67
  132. nautobot/core/views/mixins.py +105 -36
  133. nautobot/core/views/paginator.py +9 -3
  134. nautobot/core/views/renderers.py +121 -56
  135. nautobot/core/views/utils.py +81 -1
  136. nautobot/dcim/__init__.py +0 -1
  137. nautobot/dcim/api/serializers.py +180 -44
  138. nautobot/dcim/api/urls.py +7 -3
  139. nautobot/dcim/api/views.py +53 -7
  140. nautobot/dcim/apps.py +3 -0
  141. nautobot/dcim/choices.py +25 -0
  142. nautobot/dcim/constants.py +7 -0
  143. nautobot/dcim/factory.py +252 -18
  144. nautobot/dcim/filters/__init__.py +373 -193
  145. nautobot/dcim/filters/mixins.py +274 -1
  146. nautobot/dcim/forms.py +834 -121
  147. nautobot/dcim/graphql/types.py +2 -2
  148. nautobot/dcim/homepage.py +1 -1
  149. nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
  150. nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
  151. nautobot/dcim/migrations/0061_module_models.py +862 -0
  152. nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
  153. nautobot/dcim/models/__init__.py +8 -0
  154. nautobot/dcim/models/cables.py +15 -0
  155. nautobot/dcim/models/device_component_templates.py +207 -53
  156. nautobot/dcim/models/device_components.py +282 -99
  157. nautobot/dcim/models/devices.py +472 -13
  158. nautobot/dcim/models/racks.py +0 -1
  159. nautobot/dcim/navigation.py +47 -0
  160. nautobot/dcim/signals.py +3 -3
  161. nautobot/dcim/tables/__init__.py +35 -23
  162. nautobot/dcim/tables/devices.py +248 -47
  163. nautobot/dcim/tables/devicetypes.py +65 -9
  164. nautobot/dcim/tables/racks.py +5 -1
  165. nautobot/dcim/tables/template_code.py +46 -26
  166. nautobot/dcim/templates/dcim/cable_connect.html +76 -3
  167. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
  168. nautobot/dcim/templates/dcim/device/base.html +14 -6
  169. nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
  170. nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
  171. nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
  172. nautobot/dcim/templates/dcim/device/frontports.html +2 -3
  173. nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
  174. nautobot/dcim/templates/dcim/device/inventory.html +2 -3
  175. nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
  176. nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
  177. nautobot/dcim/templates/dcim/device/powerports.html +2 -3
  178. nautobot/dcim/templates/dcim/device/rearports.html +2 -3
  179. nautobot/dcim/templates/dcim/device.html +45 -1
  180. nautobot/dcim/templates/dcim/device_component.html +13 -5
  181. nautobot/dcim/templates/dcim/device_list.html +2 -1
  182. nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +6 -0
  183. nautobot/dcim/templates/dcim/devicetype.html +99 -98
  184. nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
  185. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
  186. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
  187. nautobot/dcim/templates/dcim/interface.html +17 -2
  188. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
  189. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  190. nautobot/dcim/templates/dcim/manufacturer.html +24 -0
  191. nautobot/dcim/templates/dcim/module/base.html +97 -0
  192. nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
  193. nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
  194. nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
  195. nautobot/dcim/templates/dcim/module_destroy.html +5 -0
  196. nautobot/dcim/templates/dcim/module_frontports.html +53 -0
  197. nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
  198. nautobot/dcim/templates/dcim/module_list.html +20 -0
  199. nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
  200. nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
  201. nautobot/dcim/templates/dcim/module_powerports.html +53 -0
  202. nautobot/dcim/templates/dcim/module_rearports.html +53 -0
  203. nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
  204. nautobot/dcim/templates/dcim/module_update.html +71 -0
  205. nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
  206. nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
  207. nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
  208. nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
  209. nautobot/dcim/templates/dcim/moduletype_retrieve.html +159 -0
  210. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
  211. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
  212. nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
  213. nautobot/dcim/tests/test_api.py +693 -208
  214. nautobot/dcim/tests/test_filters.py +843 -217
  215. nautobot/dcim/tests/test_models.py +1103 -8
  216. nautobot/dcim/tests/test_views.py +1525 -343
  217. nautobot/dcim/urls.py +17 -2
  218. nautobot/dcim/utils.py +2 -3
  219. nautobot/dcim/views.py +1109 -113
  220. nautobot/extras/__init__.py +0 -1
  221. nautobot/extras/api/serializers.py +115 -3
  222. nautobot/extras/api/urls.py +12 -0
  223. nautobot/extras/api/views.py +73 -59
  224. nautobot/extras/apps.py +2 -2
  225. nautobot/extras/choices.py +43 -0
  226. nautobot/extras/context_managers.py +13 -8
  227. nautobot/extras/datasources/git.py +2 -0
  228. nautobot/extras/factory.py +460 -9
  229. nautobot/extras/filters/__init__.py +174 -3
  230. nautobot/extras/filters/mixins.py +46 -43
  231. nautobot/extras/forms/base.py +24 -5
  232. nautobot/extras/forms/forms.py +227 -8
  233. nautobot/extras/forms/mixins.py +93 -0
  234. nautobot/extras/graphql/types.py +23 -10
  235. nautobot/extras/homepage.py +26 -3
  236. nautobot/extras/jobs.py +2 -2
  237. nautobot/extras/management/__init__.py +1 -0
  238. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
  239. nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
  240. nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
  241. nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
  242. nautobot/extras/migrations/0111_metadata.py +162 -0
  243. nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
  244. nautobot/extras/migrations/0113_saved_views.py +77 -0
  245. nautobot/extras/models/__init__.py +15 -1
  246. nautobot/extras/models/change_logging.py +3 -3
  247. nautobot/extras/models/contacts.py +4 -0
  248. nautobot/extras/models/customfields.py +18 -3
  249. nautobot/extras/models/groups.py +389 -225
  250. nautobot/extras/models/jobs.py +87 -3
  251. nautobot/extras/models/metadata.py +441 -0
  252. nautobot/extras/models/mixins.py +72 -62
  253. nautobot/extras/models/models.py +118 -9
  254. nautobot/extras/models/relationships.py +9 -2
  255. nautobot/extras/models/tags.py +13 -2
  256. nautobot/extras/navigation.py +57 -0
  257. nautobot/extras/plugins/__init__.py +3 -1
  258. nautobot/extras/querysets.py +30 -66
  259. nautobot/extras/signals.py +109 -101
  260. nautobot/extras/tables.py +201 -17
  261. nautobot/extras/templates/extras/dynamicgroup.html +44 -15
  262. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
  263. nautobot/extras/templates/extras/job.html +1 -1
  264. nautobot/extras/templates/extras/job_detail.html +11 -0
  265. nautobot/extras/templates/extras/jobresult.html +61 -74
  266. nautobot/extras/templates/extras/metadatatype_create.html +89 -0
  267. nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
  268. nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
  269. nautobot/extras/templates/extras/objectchange_list.html +0 -12
  270. nautobot/extras/templates/extras/plugins_list.html +1 -3
  271. nautobot/extras/templates/extras/role_retrieve.html +48 -0
  272. nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
  273. nautobot/extras/tests/integration/test_customfields.py +1 -0
  274. nautobot/extras/tests/test_api.py +509 -23
  275. nautobot/extras/tests/test_changelog.py +20 -9
  276. nautobot/extras/tests/test_context_managers.py +22 -15
  277. nautobot/extras/tests/test_datasources.py +13 -1
  278. nautobot/extras/tests/test_dynamicgroups.py +201 -171
  279. nautobot/extras/tests/test_filters.py +211 -12
  280. nautobot/extras/tests/test_jobs.py +6 -6
  281. nautobot/extras/tests/test_models.py +501 -4
  282. nautobot/extras/tests/test_relationships.py +1 -0
  283. nautobot/extras/tests/test_views.py +586 -8
  284. nautobot/extras/tests/test_webhooks.py +1 -1
  285. nautobot/extras/urls.py +5 -0
  286. nautobot/extras/utils.py +85 -16
  287. nautobot/extras/views.py +562 -122
  288. nautobot/ipam/__init__.py +0 -1
  289. nautobot/ipam/apps.py +1 -0
  290. nautobot/ipam/factory.py +17 -19
  291. nautobot/ipam/filters.py +13 -0
  292. nautobot/ipam/forms.py +8 -4
  293. nautobot/ipam/graphql/types.py +2 -2
  294. nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
  295. nautobot/ipam/models.py +20 -20
  296. nautobot/ipam/querysets.py +1 -1
  297. nautobot/ipam/signals.py +4 -2
  298. nautobot/ipam/tables.py +5 -0
  299. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
  300. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
  301. nautobot/ipam/templates/ipam/prefix.html +1 -0
  302. nautobot/ipam/tests/test_api.py +37 -18
  303. nautobot/ipam/tests/test_filters.py +26 -2
  304. nautobot/ipam/tests/test_models.py +9 -2
  305. nautobot/ipam/tests/test_querysets.py +1 -1
  306. nautobot/ipam/tests/test_views.py +3 -2
  307. nautobot/ipam/urls.py +2 -2
  308. nautobot/ipam/views.py +20 -34
  309. nautobot/project-static/css/base.css +21 -0
  310. nautobot/project-static/css/dark.css +11 -0
  311. nautobot/project-static/docs/404.html +894 -90
  312. nautobot/project-static/docs/apps/index.html +894 -90
  313. nautobot/project-static/docs/apps/nautobot-apps.html +894 -90
  314. nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
  315. nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css +1 -0
  316. nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css.map +1 -0
  317. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +921 -122
  318. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +906 -103
  319. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1620 -905
  320. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +937 -146
  321. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +979 -190
  322. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +903 -101
  323. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +899 -95
  324. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +993 -195
  325. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +976 -133
  326. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1080 -274
  327. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1244 -336
  328. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1729 -877
  329. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1166 -383
  330. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2090 -1376
  331. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2248 -1424
  332. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +914 -113
  333. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +965 -165
  334. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1012 -225
  335. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1915 -1279
  336. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1848 -1104
  337. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +906 -103
  338. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2335 -1701
  339. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1804 -1026
  340. nautobot/project-static/docs/development/apps/api/configuration-view.html +894 -90
  341. nautobot/project-static/docs/development/apps/api/database-backend-config.html +894 -90
  342. nautobot/project-static/docs/development/apps/api/models/django-admin.html +894 -90
  343. nautobot/project-static/docs/development/apps/api/models/global-search.html +894 -90
  344. nautobot/project-static/docs/development/apps/api/models/graphql.html +894 -90
  345. nautobot/project-static/docs/development/apps/api/models/index.html +944 -92
  346. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +894 -90
  347. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +894 -90
  348. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +894 -90
  349. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +894 -90
  350. nautobot/project-static/docs/development/apps/api/platform-features/index.html +894 -90
  351. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +894 -90
  352. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +894 -90
  353. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +894 -90
  354. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +894 -90
  355. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +894 -90
  356. nautobot/project-static/docs/development/apps/api/prometheus.html +894 -90
  357. nautobot/project-static/docs/development/apps/api/setup.html +894 -90
  358. nautobot/project-static/docs/development/apps/api/testing.html +894 -90
  359. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +894 -90
  360. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +894 -90
  361. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +894 -90
  362. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +894 -90
  363. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +894 -90
  364. nautobot/project-static/docs/development/apps/api/views/base-template.html +894 -90
  365. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +894 -90
  366. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +894 -90
  367. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +894 -90
  368. nautobot/project-static/docs/development/apps/api/views/index.html +894 -90
  369. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +894 -90
  370. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +894 -90
  371. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +894 -90
  372. nautobot/project-static/docs/development/apps/api/views/notes.html +894 -90
  373. nautobot/project-static/docs/development/apps/api/views/rest-api.html +894 -90
  374. nautobot/project-static/docs/development/apps/api/views/urls.html +894 -90
  375. nautobot/project-static/docs/development/apps/index.html +894 -90
  376. nautobot/project-static/docs/development/apps/migration/code-updates.html +894 -90
  377. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +894 -90
  378. nautobot/project-static/docs/development/apps/migration/from-v1.html +894 -90
  379. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +894 -90
  380. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +894 -90
  381. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +894 -90
  382. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +894 -90
  383. nautobot/project-static/docs/development/apps/porting-from-netbox.html +894 -90
  384. nautobot/project-static/docs/development/core/application-registry.html +894 -90
  385. nautobot/project-static/docs/development/core/best-practices.html +895 -90
  386. nautobot/project-static/docs/development/core/bootstrap-ui.html +894 -90
  387. nautobot/project-static/docs/development/core/caching.html +894 -90
  388. nautobot/project-static/docs/development/core/controllers.html +894 -90
  389. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +894 -90
  390. nautobot/project-static/docs/development/core/generic-views.html +894 -90
  391. nautobot/project-static/docs/development/core/getting-started.html +894 -90
  392. nautobot/project-static/docs/development/core/homepage.html +894 -90
  393. nautobot/project-static/docs/development/core/index.html +905 -90
  394. nautobot/project-static/docs/development/core/model-checklist.html +903 -91
  395. nautobot/project-static/docs/development/core/model-features.html +894 -90
  396. nautobot/project-static/docs/development/core/natural-keys.html +894 -90
  397. nautobot/project-static/docs/development/core/navigation-menu.html +894 -90
  398. nautobot/project-static/docs/development/core/release-checklist.html +897 -93
  399. nautobot/project-static/docs/development/core/role-internals.html +894 -90
  400. nautobot/project-static/docs/development/core/settings.html +894 -90
  401. nautobot/project-static/docs/development/core/style-guide.html +895 -91
  402. nautobot/project-static/docs/development/core/templates.html +906 -91
  403. nautobot/project-static/docs/development/core/testing.html +894 -90
  404. nautobot/project-static/docs/development/core/user-preferences.html +894 -90
  405. nautobot/project-static/docs/development/index.html +894 -90
  406. nautobot/project-static/docs/development/jobs/index.html +1271 -453
  407. nautobot/project-static/docs/development/jobs/migration/from-v1.html +894 -90
  408. nautobot/project-static/docs/index.html +9032 -13
  409. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
  410. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
  411. nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
  412. nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
  413. nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
  414. nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
  415. nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
  416. nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
  417. nautobot/project-static/docs/models/dcim/module.html +15 -0
  418. nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
  419. nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
  420. nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
  421. nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
  422. nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
  423. nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
  424. nautobot/project-static/docs/models/extras/role.html +15 -0
  425. nautobot/project-static/docs/models/extras/savedview.html +15 -0
  426. nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
  427. nautobot/project-static/docs/models/extras/status.html +15 -0
  428. nautobot/project-static/docs/objects.inv +0 -0
  429. nautobot/project-static/docs/overview/application_stack.html +902 -91
  430. nautobot/project-static/docs/overview/design_philosophy.html +896 -92
  431. nautobot/project-static/docs/overview/index.html +13 -8228
  432. nautobot/project-static/docs/release-notes/index.html +1131 -94
  433. nautobot/project-static/docs/release-notes/version-1.0.html +894 -90
  434. nautobot/project-static/docs/release-notes/version-1.1.html +894 -90
  435. nautobot/project-static/docs/release-notes/version-1.2.html +894 -90
  436. nautobot/project-static/docs/release-notes/version-1.3.html +894 -90
  437. nautobot/project-static/docs/release-notes/version-1.4.html +894 -90
  438. nautobot/project-static/docs/release-notes/version-1.5.html +895 -91
  439. nautobot/project-static/docs/release-notes/version-1.6.html +895 -91
  440. nautobot/project-static/docs/release-notes/version-2.0.html +894 -90
  441. nautobot/project-static/docs/release-notes/version-2.1.html +894 -90
  442. nautobot/project-static/docs/release-notes/version-2.2.html +1137 -196
  443. nautobot/project-static/docs/release-notes/version-2.3.html +9954 -0
  444. nautobot/project-static/docs/requirements.txt +5 -5
  445. nautobot/project-static/docs/search/search_index.json +1 -1
  446. nautobot/project-static/docs/sitemap.xml +335 -260
  447. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  448. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +894 -90
  449. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +894 -90
  450. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +894 -90
  451. nautobot/project-static/docs/user-guide/administration/configuration/index.html +894 -90
  452. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1025 -175
  453. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +894 -90
  454. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +894 -90
  455. nautobot/project-static/docs/user-guide/administration/guides/caching.html +894 -90
  456. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +902 -90
  457. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +894 -90
  458. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +894 -90
  459. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +894 -90
  460. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +894 -90
  461. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +894 -90
  462. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +894 -90
  463. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +894 -90
  464. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +894 -90
  465. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +946 -155
  466. nautobot/project-static/docs/user-guide/administration/installation/index.html +903 -95
  467. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +936 -124
  468. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +956 -159
  469. nautobot/project-static/docs/user-guide/administration/installation/services.html +915 -114
  470. nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +910 -101
  471. nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +894 -90
  472. nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +894 -90
  473. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +894 -90
  474. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +894 -90
  475. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +977 -121
  476. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +894 -90
  477. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +894 -90
  478. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +894 -90
  479. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +894 -90
  480. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +894 -90
  481. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +894 -90
  482. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +894 -90
  483. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +894 -90
  484. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +894 -90
  485. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +894 -90
  486. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +894 -90
  487. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +895 -91
  488. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +894 -90
  489. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +898 -90
  490. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +897 -93
  491. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
  492. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
  493. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
  494. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
  495. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
  496. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
  497. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
  498. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +908 -104
  499. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +925 -107
  500. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +925 -107
  501. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +920 -102
  502. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +925 -107
  503. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +908 -104
  504. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +908 -104
  505. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +915 -107
  506. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +922 -118
  507. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +923 -119
  508. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +920 -116
  509. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +908 -104
  510. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +916 -107
  511. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +928 -110
  512. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +938 -120
  513. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +930 -108
  514. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +908 -104
  515. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +939 -121
  516. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +930 -112
  517. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +920 -116
  518. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +923 -119
  519. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +925 -117
  520. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +918 -114
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +908 -104
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +942 -85
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +926 -108
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +908 -104
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +945 -88
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +923 -105
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +931 -127
  532. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +920 -116
  533. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +908 -104
  534. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +924 -106
  535. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +926 -108
  536. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +908 -104
  537. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +908 -104
  538. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +908 -104
  539. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +938 -90
  540. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +894 -90
  541. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +899 -91
  542. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +899 -91
  543. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +894 -90
  544. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +894 -90
  545. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +894 -90
  546. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +894 -90
  547. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +894 -90
  548. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +894 -90
  549. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +894 -90
  550. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +894 -90
  551. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +894 -90
  552. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +894 -90
  553. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +903 -98
  554. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +894 -90
  555. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +894 -90
  556. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +894 -90
  557. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +894 -90
  558. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +894 -90
  559. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +899 -91
  560. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +894 -90
  561. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +894 -90
  562. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +894 -90
  563. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +894 -90
  564. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +894 -90
  565. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +894 -90
  566. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +894 -90
  567. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +894 -90
  568. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +894 -90
  569. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +894 -90
  570. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +894 -90
  571. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +894 -90
  572. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +894 -90
  573. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
  587. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
  589. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
  590. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
  591. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
  592. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
  593. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
  594. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
  595. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
  596. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
  597. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
  598. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +894 -90
  599. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +894 -90
  600. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +894 -90
  601. nautobot/project-static/docs/user-guide/index.html +894 -90
  602. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +894 -90
  603. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +894 -90
  604. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +894 -90
  605. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +894 -90
  606. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1260 -787
  607. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +897 -93
  608. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +894 -90
  609. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +894 -90
  610. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +894 -90
  611. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +894 -90
  612. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +894 -90
  613. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +894 -90
  614. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +894 -90
  615. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +894 -90
  616. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +894 -90
  617. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +898 -90
  618. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +894 -90
  619. nautobot/project-static/docs/user-guide/platform-functionality/note.html +897 -93
  620. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +9061 -0
  621. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +897 -93
  622. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +894 -90
  623. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +894 -90
  624. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +894 -90
  625. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +894 -90
  626. nautobot/project-static/docs/user-guide/platform-functionality/role.html +897 -93
  627. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
  628. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +897 -93
  629. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
  630. nautobot/project-static/docs/user-guide/platform-functionality/status.html +894 -90
  631. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +894 -90
  632. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +952 -123
  633. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +894 -90
  634. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +894 -90
  635. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +894 -90
  636. nautobot/project-static/js/forms.js +71 -0
  637. nautobot/project-static/js/table_sorting_indicator.js +46 -0
  638. nautobot/project-static/js/tableconfig.js +6 -1
  639. nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
  640. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
  641. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
  642. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
  643. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
  644. nautobot/tenancy/__init__.py +0 -1
  645. nautobot/tenancy/apps.py +1 -0
  646. nautobot/tenancy/factory.py +3 -2
  647. nautobot/tenancy/filters/__init__.py +1 -0
  648. nautobot/tenancy/forms.py +1 -1
  649. nautobot/tenancy/templates/tenancy/tenant.html +24 -20
  650. nautobot/tenancy/views.py +11 -10
  651. nautobot/users/__init__.py +0 -1
  652. nautobot/users/api/serializers.py +1 -1
  653. nautobot/users/api/views.py +4 -2
  654. nautobot/users/apps.py +3 -2
  655. nautobot/users/factory.py +3 -3
  656. nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
  657. nautobot/users/models.py +12 -0
  658. nautobot/users/tests/test_filters.py +6 -3
  659. nautobot/users/urls.py +8 -0
  660. nautobot/virtualization/__init__.py +0 -1
  661. nautobot/virtualization/apps.py +1 -0
  662. nautobot/virtualization/filters.py +6 -1
  663. nautobot/virtualization/forms.py +11 -3
  664. nautobot/virtualization/graphql/types.py +2 -2
  665. nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
  666. nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
  667. nautobot/virtualization/models.py +0 -2
  668. nautobot/virtualization/tables.py +12 -8
  669. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
  670. nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
  671. nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
  672. nautobot/virtualization/tests/test_api.py +9 -4
  673. nautobot/virtualization/tests/test_filters.py +22 -0
  674. nautobot/virtualization/tests/test_models.py +7 -3
  675. nautobot/virtualization/tests/test_views.py +19 -3
  676. nautobot/virtualization/urls.py +2 -2
  677. nautobot/virtualization/views.py +10 -32
  678. {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/METADATA +21 -19
  679. {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/RECORD +684 -564
  680. nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css +0 -1
  681. nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css.map +0 -1
  682. nautobot/project-static/materialdesignicons-6.5.95/.github/ISSUE_TEMPLATE.md +0 -3
  683. nautobot/project-static/materialdesignicons-6.5.95/README.md +0 -25
  684. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css +0 -26654
  685. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css.map +0 -16
  686. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css +0 -3
  687. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css.map +0 -16
  688. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff +0 -0
  689. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff2 +0 -0
  690. nautobot/project-static/materialdesignicons-6.5.95/package.json +0 -28
  691. nautobot/project-static/materialdesignicons-6.5.95/preview.html +0 -717
  692. nautobot/project-static/materialdesignicons-6.5.95/scss/_animated.scss +0 -27
  693. nautobot/project-static/materialdesignicons-6.5.95/scss/_core.scss +0 -10
  694. nautobot/project-static/materialdesignicons-6.5.95/scss/_extras.scss +0 -65
  695. nautobot/project-static/materialdesignicons-6.5.95/scss/_functions.scss +0 -20
  696. nautobot/project-static/materialdesignicons-6.5.95/scss/_icons.scss +0 -10
  697. nautobot/project-static/materialdesignicons-6.5.95/scss/_path.scss +0 -10
  698. nautobot/project-static/materialdesignicons-6.5.95/scss/_variables.scss +0 -6606
  699. nautobot/project-static/materialdesignicons-6.5.95/scss/materialdesignicons.scss +0 -8
  700. /nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/LICENSE +0 -0
  701. {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/LICENSE.txt +0 -0
  702. {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/NOTICE +0 -0
  703. {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/WHEEL +0 -0
  704. {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/entry_points.txt +0 -0
@@ -23,14 +23,11 @@ __all__ = (
23
23
  "VMInterfaceTable",
24
24
  )
25
25
 
26
- # TODO: re-introduce assign ip address button?
27
26
  VMINTERFACE_BUTTONS = """
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">
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">
31
29
  <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
32
30
  </a>
33
- -->
34
31
  {% endif %}
35
32
  """
36
33
 
@@ -43,7 +40,9 @@ VMINTERFACE_BUTTONS = """
43
40
  class ClusterTypeTable(BaseTable):
44
41
  pk = ToggleColumn()
45
42
  name = tables.LinkColumn()
46
- cluster_count = tables.Column(verbose_name="Clusters")
43
+ cluster_count = LinkedCountColumn(
44
+ viewname="virtualization:cluster_list", url_params={"cluster_type": "pk"}, verbose_name="Clusters"
45
+ )
47
46
  actions = ButtonsColumn(ClusterType)
48
47
 
49
48
  class Meta(BaseTable.Meta):
@@ -60,7 +59,9 @@ class ClusterTypeTable(BaseTable):
60
59
  class ClusterGroupTable(BaseTable):
61
60
  pk = ToggleColumn()
62
61
  name = tables.LinkColumn()
63
- cluster_count = tables.Column(verbose_name="Clusters")
62
+ cluster_count = LinkedCountColumn(
63
+ viewname="virtualization:cluster_list", url_params={"cluster_group": "pk"}, verbose_name="Clusters"
64
+ )
64
65
  actions = ButtonsColumn(ClusterGroup)
65
66
 
66
67
  class Meta(BaseTable.Meta):
@@ -197,6 +198,7 @@ class VMInterfaceTable(StatusTableMixin, BaseInterfaceTable):
197
198
  "virtual_machine",
198
199
  "name",
199
200
  "status",
201
+ "role",
200
202
  "enabled",
201
203
  "mac_address",
202
204
  "mtu",
@@ -207,7 +209,7 @@ class VMInterfaceTable(StatusTableMixin, BaseInterfaceTable):
207
209
  "untagged_vlan",
208
210
  "tagged_vlans",
209
211
  )
210
- default_columns = ("pk", "virtual_machine", "name", "status", "enabled", "description")
212
+ default_columns = ("pk", "virtual_machine", "name", "status", "role", "enabled", "description")
211
213
 
212
214
 
213
215
  class VirtualMachineVMInterfaceTable(VMInterfaceTable):
@@ -225,6 +227,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable):
225
227
  "pk",
226
228
  "name",
227
229
  "status",
230
+ "role",
228
231
  "enabled",
229
232
  "parent_interface",
230
233
  "bridge",
@@ -242,6 +245,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable):
242
245
  "pk",
243
246
  "name",
244
247
  "status",
248
+ "role",
245
249
  "enabled",
246
250
  "parent_interface",
247
251
  "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.8
3
+ Version: 2.3.0
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.15,<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.4,<1.15.0) ; extra == "all" or extra == "remote-storage"
48
+ Requires-Dist: django-storages (==1.14.3) ; 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)