nautobot 2.4.18__py3-none-any.whl → 2.4.19__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 (583) hide show
  1. nautobot/apps/ui.py +6 -0
  2. nautobot/circuits/tables.py +1 -1
  3. nautobot/circuits/templates/circuits/circuit_create.html +7 -7
  4. nautobot/circuits/templates/circuits/circuit_retrieve.html +1 -5
  5. nautobot/circuits/templates/circuits/circuittermination_create.html +26 -26
  6. nautobot/circuits/templates/circuits/inc/circuit_termination.html +20 -20
  7. nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +3 -3
  8. nautobot/circuits/templates/circuits/inc/circuit_termination_speed_fragment.html +7 -7
  9. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +1 -3
  10. nautobot/circuits/views.py +26 -9
  11. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +1 -4
  12. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +1 -7
  13. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +1 -3
  14. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +1 -5
  15. nautobot/cloud/views.py +45 -0
  16. nautobot/core/graphql/generators.py +5 -2
  17. nautobot/core/jobs/bulk_actions.py +48 -85
  18. nautobot/core/models/querysets.py +2 -1
  19. nautobot/core/templates/40x.html +15 -15
  20. nautobot/core/templates/500.html +21 -21
  21. nautobot/core/templates/admin/app_index.html +8 -8
  22. nautobot/core/templates/admin/base.html +104 -104
  23. nautobot/core/templates/admin/change_form.html +65 -65
  24. nautobot/core/templates/admin/change_list.html +60 -60
  25. nautobot/core/templates/admin/change_list_results.html +39 -39
  26. nautobot/core/templates/admin/config/config.html +47 -47
  27. nautobot/core/templates/admin/delete_confirmation.html +47 -47
  28. nautobot/core/templates/admin/edit_inline/stacked.html +124 -124
  29. nautobot/core/templates/admin/edit_inline/tabular.html +60 -60
  30. nautobot/core/templates/admin/includes/fieldset.html +4 -4
  31. nautobot/core/templates/admin/index.html +60 -60
  32. nautobot/core/templates/admin/prepopulated_fields_js.html +18 -18
  33. nautobot/core/templates/admin/submit_line.html +4 -4
  34. nautobot/core/templates/base_django.html +46 -46
  35. nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +8 -8
  36. nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +8 -8
  37. nautobot/core/templates/buttons/export.html +3 -3
  38. nautobot/core/templates/components/breadcrumbs.html +5 -5
  39. nautobot/core/templates/components/button/default.html +3 -3
  40. nautobot/core/templates/components/button/dropdown.html +7 -7
  41. nautobot/core/templates/components/button/formbutton.html +4 -4
  42. nautobot/core/templates/components/panel/body_content_data_table.html +1 -1
  43. nautobot/core/templates/components/panel/body_wrapper_generic_table.html +3 -0
  44. nautobot/core/templates/components/panel/footer_content_table.html +3 -1
  45. nautobot/core/templates/components/panel/header_extra_content_table.html +10 -1
  46. nautobot/core/templates/components/tab/content_wrapper.html +1 -1
  47. nautobot/core/templates/components/tab/label_wrapper.html +1 -1
  48. nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +10 -3
  49. nautobot/core/templates/generic/object_bulk_add_component.html +40 -40
  50. nautobot/core/templates/generic/object_bulk_create.html +3 -3
  51. nautobot/core/templates/generic/object_bulk_destroy.html +6 -6
  52. nautobot/core/templates/generic/object_bulk_update.html +52 -52
  53. nautobot/core/templates/generic/object_import.html +33 -33
  54. nautobot/core/templates/generic/object_list.html +267 -267
  55. nautobot/core/templates/generic/object_retrieve.html +261 -261
  56. nautobot/core/templates/graphene/graphiql.html +127 -127
  57. nautobot/core/templates/home.html +62 -62
  58. nautobot/core/templates/inc/computed_fields/panel_data.html +13 -13
  59. nautobot/core/templates/inc/created_updated.html +8 -8
  60. nautobot/core/templates/inc/custom_fields/panel_data.html +13 -13
  61. nautobot/core/templates/inc/dynamic_groups_panel.html +11 -11
  62. nautobot/core/templates/inc/footer.html +19 -19
  63. nautobot/core/templates/inc/javascript.html +1 -1
  64. nautobot/core/templates/inc/media.html +46 -46
  65. nautobot/core/templates/inc/nav_menu.html +1 -1
  66. nautobot/core/templates/inc/relationships_table_rows.html +22 -22
  67. nautobot/core/templates/inc/tenant_table_row.html +1 -1
  68. nautobot/core/templates/login.html +77 -77
  69. nautobot/core/templates/media_failure.html +38 -38
  70. nautobot/core/templates/panel_table.html +1 -1
  71. nautobot/core/templates/rest_framework/api.html +3 -3
  72. nautobot/core/templates/search.html +1 -1
  73. nautobot/core/templates/swagger_ui.html +9 -9
  74. nautobot/core/templates/utilities/confirmation_form.html +18 -18
  75. nautobot/core/templates/utilities/render_field.html +1 -1
  76. nautobot/core/templates/utilities/render_jinja2.html +43 -43
  77. nautobot/core/templates/utilities/templatetags/filter_form_modal.html +56 -56
  78. nautobot/core/templates/utilities/templatetags/utilization_graph.html +1 -1
  79. nautobot/core/templates/utilities/theme_preview.html +799 -799
  80. nautobot/core/templates/utilities/worker_status.html +122 -122
  81. nautobot/core/templates/widgets/clearable_file.html +3 -3
  82. nautobot/core/templates/widgets/sluginput.html +1 -1
  83. nautobot/core/templatetags/buttons.py +8 -2
  84. nautobot/core/templatetags/helpers.py +1 -1
  85. nautobot/core/testing/integration.py +7 -4
  86. nautobot/core/testing/views.py +24 -5
  87. nautobot/core/tests/test_breadcrumbs.py +78 -4
  88. nautobot/core/tests/test_commands.py +7 -4
  89. nautobot/core/tests/test_graphql.py +20 -5
  90. nautobot/core/tests/test_jobs.py +34 -21
  91. nautobot/core/tests/test_ui.py +175 -1
  92. nautobot/core/tests/test_utils.py +35 -0
  93. nautobot/core/tests/test_views_generic.py +43 -0
  94. nautobot/core/tests/test_views_utils.py +239 -5
  95. nautobot/core/ui/breadcrumbs.py +208 -21
  96. nautobot/core/ui/bulk_buttons.py +8 -0
  97. nautobot/core/ui/object_detail.py +138 -55
  98. nautobot/core/ui/titles.py +1 -0
  99. nautobot/core/utils/requests.py +27 -2
  100. nautobot/core/views/generic.py +41 -31
  101. nautobot/core/views/mixins.py +80 -110
  102. nautobot/core/views/utils.py +153 -1
  103. nautobot/dcim/api/serializers.py +8 -2
  104. nautobot/dcim/constants.py +1 -0
  105. nautobot/dcim/factory.py +4 -3
  106. nautobot/dcim/filters/mixins.py +1 -2
  107. nautobot/dcim/forms.py +5 -1
  108. nautobot/dcim/migrations/0074_alter_rack_u_height.py +21 -0
  109. nautobot/dcim/models/devices.py +26 -1
  110. nautobot/dcim/models/racks.py +2 -2
  111. nautobot/dcim/templates/dcim/cable.html +53 -53
  112. nautobot/dcim/templates/dcim/cable_connect.html +182 -182
  113. nautobot/dcim/templates/dcim/cable_trace.html +1 -1
  114. nautobot/dcim/templates/dcim/console_port_connection_list.html +5 -5
  115. nautobot/dcim/templates/dcim/consoleport.html +86 -86
  116. nautobot/dcim/templates/dcim/consoleserverport.html +86 -86
  117. nautobot/dcim/templates/dcim/controller_create.html +34 -34
  118. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +68 -68
  119. nautobot/dcim/templates/dcim/device/base.html +1 -104
  120. nautobot/dcim/templates/dcim/device/config.html +17 -17
  121. nautobot/dcim/templates/dcim/device/consoleports.html +1 -52
  122. nautobot/dcim/templates/dcim/device/consoleserverports.html +1 -52
  123. nautobot/dcim/templates/dcim/device/devicebays.html +1 -48
  124. nautobot/dcim/templates/dcim/device/frontports.html +1 -52
  125. nautobot/dcim/templates/dcim/device/interfaces.html +1 -56
  126. nautobot/dcim/templates/dcim/device/inventory.html +1 -48
  127. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +64 -64
  128. nautobot/dcim/templates/dcim/device/modulebays.html +1 -48
  129. nautobot/dcim/templates/dcim/device/poweroutlets.html +1 -52
  130. nautobot/dcim/templates/dcim/device/powerports.html +1 -52
  131. nautobot/dcim/templates/dcim/device/rearports.html +1 -52
  132. nautobot/dcim/templates/dcim/device/status.html +66 -66
  133. nautobot/dcim/templates/dcim/device/wireless.html +1 -72
  134. nautobot/dcim/templates/dcim/device.html +4 -422
  135. nautobot/dcim/templates/dcim/device_component_add.html +25 -25
  136. nautobot/dcim/templates/dcim/device_create.html +229 -0
  137. nautobot/dcim/templates/dcim/device_edit.html +2 -227
  138. nautobot/dcim/templates/dcim/devicebay.html +41 -41
  139. nautobot/dcim/templates/dcim/devicebay_populate.html +32 -32
  140. nautobot/dcim/templates/dcim/devicetype_component_add.html +28 -28
  141. nautobot/dcim/templates/dcim/devicetype_retrieve.html +1 -3
  142. nautobot/dcim/templates/dcim/frontport.html +84 -84
  143. nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +1 -1
  144. nautobot/dcim/templates/dcim/inc/device_interface_filter.html +8 -0
  145. nautobot/dcim/templates/dcim/inc/device_napalm_tabs.html +1 -15
  146. nautobot/dcim/templates/dcim/inc/location_hierarchy.html +22 -22
  147. nautobot/dcim/templates/dcim/interface.html +206 -206
  148. nautobot/dcim/templates/dcim/interface_connection_list.html +5 -5
  149. nautobot/dcim/templates/dcim/interfaceredundancygroupassociation_create.html +6 -6
  150. nautobot/dcim/templates/dcim/inventoryitem.html +44 -44
  151. nautobot/dcim/templates/dcim/inventoryitem_add.html +32 -32
  152. nautobot/dcim/templates/dcim/inventoryitem_edit.html +22 -22
  153. nautobot/dcim/templates/dcim/location_migrate_data_to_contact.html +46 -46
  154. nautobot/dcim/templates/dcim/location_retrieve.html +1 -7
  155. nautobot/dcim/templates/dcim/locationtype.html +1 -6
  156. nautobot/dcim/templates/dcim/locationtype_retrieve.html +1 -7
  157. nautobot/dcim/templates/dcim/module/base.html +85 -85
  158. nautobot/dcim/templates/dcim/module_interfaces.html +1 -1
  159. nautobot/dcim/templates/dcim/module_modulebays.html +1 -1
  160. nautobot/dcim/templates/dcim/module_retrieve.html +52 -52
  161. nautobot/dcim/templates/dcim/module_update.html +61 -61
  162. nautobot/dcim/templates/dcim/modulebay_destroy.html +1 -1
  163. nautobot/dcim/templates/dcim/modulebay_retrieve.html +85 -85
  164. nautobot/dcim/templates/dcim/modulebay_update.html +33 -33
  165. nautobot/dcim/templates/dcim/modulefamily_retrieve.html +1 -1
  166. nautobot/dcim/templates/dcim/moduletype_retrieve.html +140 -144
  167. nautobot/dcim/templates/dcim/platform_create.html +38 -38
  168. nautobot/dcim/templates/dcim/power_port_connection_list.html +5 -5
  169. nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -8
  170. nautobot/dcim/templates/dcim/poweroutlet.html +85 -85
  171. nautobot/dcim/templates/dcim/powerpanel_retrieve.html +1 -8
  172. nautobot/dcim/templates/dcim/powerport.html +91 -91
  173. nautobot/dcim/templates/dcim/rack_elevation_list.html +18 -18
  174. nautobot/dcim/templates/dcim/rack_retrieve.html +264 -274
  175. nautobot/dcim/templates/dcim/rackreservation_retrieve.html +0 -3
  176. nautobot/dcim/templates/dcim/rearport.html +78 -78
  177. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +1 -5
  178. nautobot/dcim/tests/integration/test_device_bulk_operations.py +3 -2
  179. nautobot/dcim/tests/integration/test_location_bulk_operations.py +6 -2
  180. nautobot/dcim/tests/test_api.py +33 -1
  181. nautobot/dcim/tests/test_views.py +148 -4
  182. nautobot/dcim/ui.py +29 -0
  183. nautobot/dcim/urls.py +1 -109
  184. nautobot/dcim/utils.py +30 -0
  185. nautobot/dcim/views.py +1009 -531
  186. nautobot/extras/tables.py +20 -0
  187. nautobot/extras/templates/extras/computedfield_edit.html +4 -4
  188. nautobot/extras/templates/extras/configcontext_update.html +1 -1
  189. nautobot/extras/templates/extras/configcontextschema_retrieve.html +32 -32
  190. nautobot/extras/templates/extras/customfield_update.html +23 -23
  191. nautobot/extras/templates/extras/dynamicgroup_retrieve.html +38 -38
  192. nautobot/extras/templates/extras/dynamicgroup_update.html +62 -62
  193. nautobot/extras/templates/extras/gitrepository_list.html +10 -10
  194. nautobot/extras/templates/extras/gitrepository_retrieve.html +68 -68
  195. nautobot/extras/templates/extras/graphqlquery_retrieve.html +73 -73
  196. nautobot/extras/templates/extras/inc/configcontext_format.html +2 -2
  197. nautobot/extras/templates/extras/inc/job_table.html +10 -10
  198. nautobot/extras/templates/extras/inc/jobresult.html +21 -21
  199. nautobot/extras/templates/extras/inc/jobresult_js.html +6 -6
  200. nautobot/extras/templates/extras/inc/tags_panel.html +10 -10
  201. nautobot/extras/templates/extras/job.html +64 -64
  202. nautobot/extras/templates/extras/job_approval_request.html +9 -9
  203. nautobot/extras/templates/extras/job_bulk_edit.html +13 -13
  204. nautobot/extras/templates/extras/job_edit.html +45 -45
  205. nautobot/extras/templates/extras/job_list.html +4 -4
  206. nautobot/extras/templates/extras/jobresult_retrieve.html +0 -25
  207. nautobot/extras/templates/extras/marketplace.html +101 -101
  208. nautobot/extras/templates/extras/metadatatype_create.html +20 -20
  209. nautobot/extras/templates/extras/object_assign_contact_or_team.html +18 -18
  210. nautobot/extras/templates/extras/object_configcontext.html +1 -3
  211. nautobot/extras/templates/extras/objectchange.html +2 -165
  212. nautobot/extras/templates/extras/objectchange_retrieve.html +165 -0
  213. nautobot/extras/templates/extras/plugin_detail.html +41 -41
  214. nautobot/extras/templates/extras/plugins_list.html +9 -9
  215. nautobot/extras/templates/extras/plugins_tiles.html +26 -26
  216. nautobot/extras/templates/extras/relationship_edit.html +4 -4
  217. nautobot/extras/templates/extras/role_retrieve.html +13 -13
  218. nautobot/extras/templates/extras/scheduled_jobs_approval_queue_list.html +21 -21
  219. nautobot/extras/templates/extras/scheduledjob.html +128 -128
  220. nautobot/extras/templates/extras/secret_create.html +53 -53
  221. nautobot/extras/templates/extras/secretsgroup_update.html +13 -13
  222. nautobot/extras/templates/extras/templatetags/plugin_object_detail_tabs.html +3 -3
  223. nautobot/extras/templates/extras/webhook.html +79 -79
  224. nautobot/extras/tests/integration/test_relationships.py +6 -6
  225. nautobot/extras/tests/test_filters.py +1 -1
  226. nautobot/extras/tests/test_jobs.py +2 -0
  227. nautobot/extras/tests/test_views.py +3 -3
  228. nautobot/extras/urls.py +1 -3
  229. nautobot/extras/views.py +101 -27
  230. nautobot/ipam/filters.py +2 -2
  231. nautobot/ipam/migrations/0053_alter_vrfdeviceassignment_options_and_more.py +20 -0
  232. nautobot/ipam/models.py +34 -0
  233. nautobot/ipam/tables.py +3 -1
  234. nautobot/ipam/templates/ipam/inc/prefix_header_extra_content_table.html +4 -0
  235. nautobot/ipam/templates/ipam/inc/toggle_available.html +8 -8
  236. nautobot/ipam/templates/ipam/inc/vlangroup_header.html +4 -4
  237. nautobot/ipam/templates/ipam/ipaddress.html +119 -123
  238. nautobot/ipam/templates/ipam/ipaddress_assign.html +10 -10
  239. nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -1
  240. nautobot/ipam/templates/ipam/ipaddress_merge.html +180 -180
  241. nautobot/ipam/templates/ipam/ipaddresstointerface_retrieve.html +48 -48
  242. nautobot/ipam/templates/ipam/prefix.html +2 -107
  243. nautobot/ipam/templates/ipam/prefix_create.html +34 -0
  244. nautobot/ipam/templates/ipam/prefix_edit.html +1 -34
  245. nautobot/ipam/templates/ipam/prefix_retrieve.html +3 -0
  246. nautobot/ipam/templates/ipam/service_retrieve.html +1 -6
  247. nautobot/ipam/templates/ipam/vlan_retrieve.html +1 -7
  248. nautobot/ipam/templates/ipam/vrf_edit.html +1 -1
  249. nautobot/ipam/tests/test_views.py +34 -0
  250. nautobot/ipam/ui.py +145 -0
  251. nautobot/ipam/urls.py +1 -46
  252. nautobot/ipam/utils/__init__.py +26 -0
  253. nautobot/ipam/views.py +219 -106
  254. nautobot/project-static/docs/404.html +11 -11
  255. nautobot/project-static/docs/apps/index.html +11 -11
  256. nautobot/project-static/docs/apps/nautobot-apps.html +11 -11
  257. nautobot/project-static/docs/assets/javascripts/{bundle.92b07e13.min.js → bundle.f55a23d4.min.js} +2 -2
  258. nautobot/project-static/docs/assets/javascripts/{bundle.92b07e13.min.js.map → bundle.f55a23d4.min.js.map} +2 -2
  259. nautobot/project-static/docs/assets/stylesheets/{main.7e37652d.min.css → main.e53b48f4.min.css} +1 -1
  260. nautobot/project-static/docs/assets/stylesheets/{main.7e37652d.min.css.map → main.e53b48f4.min.css.map} +1 -1
  261. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +11 -11
  262. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +11 -11
  263. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +11 -11
  264. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +11 -11
  265. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +11 -11
  266. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +11 -11
  267. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +11 -11
  268. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +11 -11
  269. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +11 -11
  270. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +11 -11
  271. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +11 -11
  272. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +11 -11
  273. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +11 -11
  274. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +11 -11
  275. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +11 -11
  276. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +11 -11
  277. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +11 -11
  278. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +11 -11
  279. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +11 -11
  280. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +11 -11
  281. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +2174 -1226
  282. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +11 -11
  283. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +12 -12
  284. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +72 -27
  285. nautobot/project-static/docs/development/apps/api/configuration-view.html +11 -11
  286. nautobot/project-static/docs/development/apps/api/database-backend-config.html +11 -11
  287. nautobot/project-static/docs/development/apps/api/models/django-admin.html +11 -11
  288. nautobot/project-static/docs/development/apps/api/models/global-search.html +11 -11
  289. nautobot/project-static/docs/development/apps/api/models/graphql.html +11 -11
  290. nautobot/project-static/docs/development/apps/api/models/index.html +11 -11
  291. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +11 -11
  292. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +11 -11
  293. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +11 -11
  294. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +11 -11
  295. nautobot/project-static/docs/development/apps/api/platform-features/index.html +11 -11
  296. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +11 -11
  297. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +11 -11
  298. nautobot/project-static/docs/development/apps/api/platform-features/prepopulating-data.html +11 -11
  299. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +11 -11
  300. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +11 -11
  301. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +11 -11
  302. nautobot/project-static/docs/development/apps/api/prometheus.html +11 -11
  303. nautobot/project-static/docs/development/apps/api/setup.html +11 -11
  304. nautobot/project-static/docs/development/apps/api/testing.html +11 -11
  305. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +11 -11
  306. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +11 -11
  307. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +11 -11
  308. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +11 -11
  309. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +11 -11
  310. nautobot/project-static/docs/development/apps/api/views/base-template.html +11 -11
  311. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +11 -11
  312. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +11 -11
  313. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +11 -11
  314. nautobot/project-static/docs/development/apps/api/views/index.html +11 -11
  315. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +11 -11
  316. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +11 -11
  317. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +11 -11
  318. nautobot/project-static/docs/development/apps/api/views/notes.html +11 -11
  319. nautobot/project-static/docs/development/apps/api/views/rest-api.html +11 -11
  320. nautobot/project-static/docs/development/apps/api/views/urls.html +11 -11
  321. nautobot/project-static/docs/development/apps/index.html +11 -11
  322. nautobot/project-static/docs/development/apps/migration/code-updates.html +11 -11
  323. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +11 -11
  324. nautobot/project-static/docs/development/apps/migration/from-v1.html +11 -11
  325. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +11 -11
  326. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +11 -11
  327. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +11 -11
  328. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +11 -11
  329. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +11 -11
  330. nautobot/project-static/docs/development/apps/migration/ui-component-framework/breadcrumbs-titles.html +11 -11
  331. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +11 -11
  332. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +11 -11
  333. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +11 -11
  334. nautobot/project-static/docs/development/apps/porting-from-netbox.html +11 -11
  335. nautobot/project-static/docs/development/core/application-registry.html +11 -11
  336. nautobot/project-static/docs/development/core/best-practices.html +11 -11
  337. nautobot/project-static/docs/development/core/bootstrap-ui.html +11 -11
  338. nautobot/project-static/docs/development/core/caching.html +11 -11
  339. nautobot/project-static/docs/development/core/controllers.html +11 -11
  340. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +11 -11
  341. nautobot/project-static/docs/development/core/generic-views.html +11 -11
  342. nautobot/project-static/docs/development/core/getting-started.html +50 -48
  343. nautobot/project-static/docs/development/core/homepage.html +11 -11
  344. nautobot/project-static/docs/development/core/index.html +11 -11
  345. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +11 -11
  346. nautobot/project-static/docs/development/core/model-checklist.html +11 -11
  347. nautobot/project-static/docs/development/core/model-features.html +11 -11
  348. nautobot/project-static/docs/development/core/natural-keys.html +11 -11
  349. nautobot/project-static/docs/development/core/navigation-menu.html +11 -11
  350. nautobot/project-static/docs/development/core/release-checklist.html +11 -11
  351. nautobot/project-static/docs/development/core/role-internals.html +11 -11
  352. nautobot/project-static/docs/development/core/settings.html +11 -11
  353. nautobot/project-static/docs/development/core/style-guide.html +15 -11
  354. nautobot/project-static/docs/development/core/templates.html +11 -11
  355. nautobot/project-static/docs/development/core/testing.html +11 -11
  356. nautobot/project-static/docs/development/core/ui-component-framework.html +11 -11
  357. nautobot/project-static/docs/development/core/user-preferences.html +11 -11
  358. nautobot/project-static/docs/development/index.html +11 -11
  359. nautobot/project-static/docs/development/jobs/getting-started.html +11 -11
  360. nautobot/project-static/docs/development/jobs/index.html +11 -11
  361. nautobot/project-static/docs/development/jobs/installation.html +11 -11
  362. nautobot/project-static/docs/development/jobs/job-extensions.html +11 -11
  363. nautobot/project-static/docs/development/jobs/job-logging.html +11 -11
  364. nautobot/project-static/docs/development/jobs/job-patterns.html +11 -11
  365. nautobot/project-static/docs/development/jobs/job-structure.html +11 -11
  366. nautobot/project-static/docs/development/jobs/migration/from-v1.html +11 -11
  367. nautobot/project-static/docs/development/jobs/testing.html +11 -11
  368. nautobot/project-static/docs/index.html +11 -11
  369. nautobot/project-static/docs/objects.inv +0 -0
  370. nautobot/project-static/docs/overview/application_stack.html +11 -11
  371. nautobot/project-static/docs/overview/design_philosophy.html +11 -11
  372. nautobot/project-static/docs/release-notes/index.html +11 -11
  373. nautobot/project-static/docs/release-notes/version-1.0.html +11 -11
  374. nautobot/project-static/docs/release-notes/version-1.1.html +11 -11
  375. nautobot/project-static/docs/release-notes/version-1.2.html +11 -11
  376. nautobot/project-static/docs/release-notes/version-1.3.html +11 -11
  377. nautobot/project-static/docs/release-notes/version-1.4.html +11 -11
  378. nautobot/project-static/docs/release-notes/version-1.5.html +11 -11
  379. nautobot/project-static/docs/release-notes/version-1.6.html +11 -11
  380. nautobot/project-static/docs/release-notes/version-2.0.html +11 -11
  381. nautobot/project-static/docs/release-notes/version-2.1.html +11 -11
  382. nautobot/project-static/docs/release-notes/version-2.2.html +11 -11
  383. nautobot/project-static/docs/release-notes/version-2.3.html +11 -11
  384. nautobot/project-static/docs/release-notes/version-2.4.html +196 -11
  385. nautobot/project-static/docs/search/search_index.json +1 -1
  386. nautobot/project-static/docs/sitemap.xml +300 -300
  387. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  388. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +11 -11
  389. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +11 -11
  390. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +11 -11
  391. nautobot/project-static/docs/user-guide/administration/configuration/index.html +11 -11
  392. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +11 -11
  393. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +11 -11
  394. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +11 -11
  395. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +89 -14
  396. nautobot/project-static/docs/user-guide/administration/guides/docker.html +11 -11
  397. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +11 -11
  398. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +11 -11
  399. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +11 -11
  400. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +11 -11
  401. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +11 -11
  402. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +11 -11
  403. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +11 -11
  404. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +11 -11
  405. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +11 -11
  406. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +11 -11
  407. nautobot/project-static/docs/user-guide/administration/installation/index.html +11 -11
  408. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +11 -11
  409. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +11 -11
  410. nautobot/project-static/docs/user-guide/administration/installation/services.html +11 -11
  411. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +11 -11
  412. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +11 -11
  413. nautobot/project-static/docs/user-guide/administration/security/index.html +11 -11
  414. nautobot/project-static/docs/user-guide/administration/security/notices.html +11 -11
  415. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +11 -11
  416. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +11 -11
  417. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +11 -11
  418. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +11 -11
  419. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +11 -11
  420. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +11 -11
  421. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +11 -11
  422. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +11 -11
  423. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +11 -11
  424. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +11 -11
  425. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +11 -11
  426. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +11 -11
  427. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +11 -11
  428. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +11 -11
  429. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +11 -11
  430. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +11 -11
  431. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +11 -11
  432. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +11 -11
  433. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +11 -11
  434. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +11 -11
  435. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +11 -11
  436. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +11 -11
  437. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +11 -11
  438. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +11 -11
  439. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +11 -11
  440. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +11 -11
  441. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +11 -11
  442. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +11 -11
  443. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +11 -11
  444. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +11 -11
  445. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +11 -11
  446. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +11 -11
  447. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +11 -11
  448. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +11 -11
  449. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +11 -11
  450. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +11 -11
  451. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +11 -11
  452. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +11 -11
  453. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +11 -11
  454. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +11 -11
  455. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +11 -11
  456. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +11 -11
  457. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +11 -11
  458. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +11 -11
  459. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +11 -11
  460. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +11 -11
  461. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +11 -11
  462. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +11 -11
  463. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +11 -11
  464. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +11 -11
  465. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +11 -11
  466. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +11 -11
  467. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +11 -11
  468. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +11 -11
  469. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +11 -11
  470. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +11 -11
  471. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +11 -11
  472. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +11 -11
  473. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +11 -11
  474. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +11 -11
  475. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +11 -11
  476. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +11 -11
  477. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +11 -11
  478. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +11 -11
  479. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +11 -11
  480. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +11 -11
  481. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +11 -11
  482. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +11 -11
  483. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +11 -11
  484. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +11 -11
  485. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +11 -11
  486. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +11 -11
  487. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +11 -11
  488. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +11 -11
  489. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +11 -11
  490. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +11 -11
  491. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +11 -11
  492. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +11 -11
  493. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +11 -11
  494. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +11 -11
  495. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +11 -11
  496. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +11 -11
  497. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +11 -11
  498. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +11 -11
  499. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +11 -11
  500. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +11 -11
  501. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +11 -11
  502. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +11 -11
  503. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +11 -11
  504. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +11 -11
  505. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +11 -11
  506. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +11 -11
  507. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +11 -11
  508. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +11 -11
  509. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +11 -11
  510. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +11 -11
  511. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +11 -11
  512. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +11 -11
  513. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +11 -11
  514. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +11 -11
  515. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +11 -11
  516. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +11 -11
  517. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +11 -11
  518. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +11 -11
  519. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +11 -11
  520. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +11 -11
  521. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +11 -11
  522. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +11 -11
  523. nautobot/project-static/docs/user-guide/index.html +11 -11
  524. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +11 -11
  525. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +11 -11
  526. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +11 -11
  527. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +11 -11
  528. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +11 -11
  529. nautobot/project-static/docs/user-guide/platform-functionality/events.html +11 -11
  530. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +11 -11
  531. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +11 -11
  532. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +11 -11
  533. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +11 -11
  534. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +11 -11
  535. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +11 -11
  536. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +11 -11
  537. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +11 -11
  538. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +11 -11
  539. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +11 -11
  540. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +11 -11
  541. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +11 -11
  542. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +11 -11
  543. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +11 -11
  544. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +11 -11
  545. nautobot/project-static/docs/user-guide/platform-functionality/note.html +11 -11
  546. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +11 -11
  547. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +11 -11
  548. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +11 -11
  549. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +11 -11
  550. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +11 -11
  551. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +11 -11
  552. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +11 -11
  553. nautobot/project-static/docs/user-guide/platform-functionality/role.html +11 -11
  554. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +11 -11
  555. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +11 -11
  556. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +11 -11
  557. nautobot/project-static/docs/user-guide/platform-functionality/status.html +11 -11
  558. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +11 -11
  559. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +11 -11
  560. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +11 -11
  561. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +11 -11
  562. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +11 -11
  563. nautobot/tenancy/templates/tenancy/tenant.html +1 -7
  564. nautobot/tenancy/views.py +13 -0
  565. nautobot/users/templates/users/api_tokens.html +4 -4
  566. nautobot/users/templates/users/base.html +28 -28
  567. nautobot/virtualization/templates/virtualization/cluster.html +64 -64
  568. nautobot/virtualization/templates/virtualization/inc/virtualmachine_vminterface_filter.html +8 -0
  569. nautobot/virtualization/templates/virtualization/virtualmachine_component_add.html +25 -25
  570. nautobot/virtualization/templates/virtualization/virtualmachine_retrieve.html +1 -251
  571. nautobot/virtualization/templates/virtualization/vminterface.html +70 -70
  572. nautobot/virtualization/urls.py +0 -12
  573. nautobot/virtualization/views.py +158 -54
  574. nautobot/wireless/templates/wireless/wirelessnetwork_create.html +13 -13
  575. nautobot/wireless/tests/integration/test_radio_profile.py +1 -1
  576. {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/METADATA +1 -1
  577. {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/RECORD +581 -570
  578. nautobot/ipam/templates/ipam/prefix_ipaddresses.html +0 -11
  579. nautobot/ipam/templates/ipam/prefix_prefixes.html +0 -11
  580. {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/LICENSE.txt +0 -0
  581. {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/NOTICE +0 -0
  582. {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/WHEEL +0 -0
  583. {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/entry_points.txt +0 -0
@@ -44,6 +44,7 @@ from nautobot.core.templatetags.helpers import bettertitle, validated_viewname
44
44
  from nautobot.core.utils.config import get_settings_or_config
45
45
  from nautobot.core.utils.permissions import get_permission_for_model
46
46
  from nautobot.core.utils.requests import (
47
+ convert_querydict_to_dict,
47
48
  convert_querydict_to_factory_formset_acceptable_querydict,
48
49
  get_filterable_params_from_filter_params,
49
50
  normalize_querydict,
@@ -58,6 +59,7 @@ from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
58
59
  from nautobot.core.views.utils import (
59
60
  check_filter_for_display,
60
61
  common_detail_view_context,
62
+ get_bulk_queryset_from_view,
61
63
  get_csv_form_fields_from_serializer_class,
62
64
  get_saved_views_for_user,
63
65
  handle_protectederror,
@@ -68,7 +70,7 @@ from nautobot.core.views.utils import (
68
70
  from nautobot.extras.models import ExportTemplate, SavedView, UserSavedViewAssociation
69
71
 
70
72
 
71
- class GenericView(LoginRequiredMixin, UIComponentsMixin, View):
73
+ class GenericView(UIComponentsMixin, LoginRequiredMixin, View):
72
74
  """
73
75
  Base class for non-object-related views.
74
76
 
@@ -76,7 +78,7 @@ class GenericView(LoginRequiredMixin, UIComponentsMixin, View):
76
78
  """
77
79
 
78
80
 
79
- class ObjectView(ObjectPermissionRequiredMixin, UIComponentsMixin, View):
81
+ class ObjectView(UIComponentsMixin, ObjectPermissionRequiredMixin, View):
80
82
  """
81
83
  Retrieve a single object for display.
82
84
 
@@ -141,7 +143,7 @@ class ObjectView(ObjectPermissionRequiredMixin, UIComponentsMixin, View):
141
143
  return render(request, self.get_template_name(), context)
142
144
 
143
145
 
144
- class ObjectListView(ObjectPermissionRequiredMixin, UIComponentsMixin, View):
146
+ class ObjectListView(UIComponentsMixin, ObjectPermissionRequiredMixin, View):
145
147
  """
146
148
  List a series of objects.
147
149
 
@@ -421,7 +423,7 @@ class ObjectListView(ObjectPermissionRequiredMixin, UIComponentsMixin, View):
421
423
  return {}
422
424
 
423
425
 
424
- class ObjectEditView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
426
+ class ObjectEditView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
425
427
  """
426
428
  Create or edit a single object.
427
429
 
@@ -569,7 +571,7 @@ class ObjectEditView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequi
569
571
  )
570
572
 
571
573
 
572
- class ObjectDeleteView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
574
+ class ObjectDeleteView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
573
575
  """
574
576
  Delete a single object.
575
577
 
@@ -646,7 +648,7 @@ class ObjectDeleteView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionReq
646
648
  )
647
649
 
648
650
 
649
- class BulkCreateView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
651
+ class BulkCreateView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
650
652
  """
651
653
  Create new objects in bulk.
652
654
 
@@ -760,7 +762,7 @@ class BulkCreateView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequi
760
762
  )
761
763
 
762
764
 
763
- class ObjectImportView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
765
+ class ObjectImportView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
764
766
  """
765
767
  Import a single object (YAML or JSON format).
766
768
 
@@ -908,7 +910,7 @@ class ObjectImportView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionReq
908
910
 
909
911
 
910
912
  class BulkImportView(
911
- GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View
913
+ UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View
912
914
  ): # 3.0 TODO: remove as it's no longer used
913
915
  """
914
916
  Import objects in bulk (CSV format).
@@ -1019,7 +1021,7 @@ class BulkImportView(
1019
1021
 
1020
1022
 
1021
1023
  class BulkEditView(
1022
- GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, BulkEditAndBulkDeleteModelMixin, View
1024
+ UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, BulkEditAndBulkDeleteModelMixin, View
1023
1025
  ):
1024
1026
  """
1025
1027
  Edit objects in bulk.
@@ -1056,15 +1058,19 @@ class BulkEditView(
1056
1058
  if self.queryset is None or self.form is None or self.table is None:
1057
1059
  raise RuntimeError("self.queryset, self.form, and self.table must not be None")
1058
1060
  model = self.queryset.model
1059
- edit_all = request.POST.get("_all")
1061
+ pk_list = list(request.POST.getlist("pk"))
1062
+ edit_all = bool(self.request.POST.get("_all"))
1063
+ saved_view_id = request.GET.get("saved_view", "")
1064
+
1065
+ self.key_params = {
1066
+ "content_type": ContentType.objects.get_for_model(model),
1067
+ "edit_all": edit_all,
1068
+ "filter_query_params": convert_querydict_to_dict(request.GET),
1069
+ "pk_list": pk_list,
1070
+ "saved_view_id": saved_view_id,
1071
+ }
1060
1072
 
1061
- # If we are editing *all* objects in the queryset, replace the PK list with all matched objects.
1062
- if edit_all:
1063
- pk_list = []
1064
- queryset = self._get_bulk_edit_delete_all_queryset(request)
1065
- else:
1066
- pk_list = request.POST.getlist("pk")
1067
- queryset = self.queryset.filter(pk__in=pk_list)
1073
+ queryset = get_bulk_queryset_from_view(user=request.user, action="change", **self.key_params)
1068
1074
 
1069
1075
  if "_apply" in request.POST:
1070
1076
  form = self.form(model, request.POST, edit_all=edit_all) # pylint: disable=not-callable
@@ -1072,7 +1078,7 @@ class BulkEditView(
1072
1078
 
1073
1079
  if form.is_valid():
1074
1080
  logger.debug("Form validation was successful")
1075
- return self.send_bulk_edit_objects_to_job(request, form.cleaned_data, model)
1081
+ return self.send_bulk_edit_objects_to_job(request, form.cleaned_data)
1076
1082
  else:
1077
1083
  logger.debug("Form validation failed")
1078
1084
 
@@ -1116,7 +1122,7 @@ class BulkEditView(
1116
1122
  return {}
1117
1123
 
1118
1124
 
1119
- class BulkRenameView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
1125
+ class BulkRenameView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
1120
1126
  """
1121
1127
  An extendable view for renaming objects in bulk.
1122
1128
  """
@@ -1217,7 +1223,7 @@ class BulkRenameView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequi
1217
1223
 
1218
1224
 
1219
1225
  class BulkDeleteView(
1220
- GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, BulkEditAndBulkDeleteModelMixin, View
1226
+ UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, BulkEditAndBulkDeleteModelMixin, View
1221
1227
  ):
1222
1228
  """
1223
1229
  Delete objects in bulk.
@@ -1246,15 +1252,19 @@ class BulkDeleteView(
1246
1252
  if self.queryset is None or self.table is None:
1247
1253
  raise RuntimeError("self.queryset and self.table must not be None")
1248
1254
  model = self.queryset.model
1249
- delete_all = request.POST.get("_all")
1255
+ pk_list = list(request.POST.getlist("pk"))
1256
+ delete_all = bool(request.POST.get("_all"))
1257
+ saved_view_id = request.GET.get("saved_view", "")
1250
1258
 
1251
- # Are we deleting *all* objects in the queryset or just a selected subset?
1252
- if delete_all:
1253
- queryset = self._get_bulk_edit_delete_all_queryset(request)
1254
- pk_list = []
1255
- else:
1256
- pk_list = request.POST.getlist("pk")
1257
- queryset = self.queryset.filter(pk__in=pk_list)
1259
+ self.key_params = {
1260
+ "content_type": ContentType.objects.get_for_model(model),
1261
+ "delete_all": delete_all,
1262
+ "filter_query_params": convert_querydict_to_dict(request.GET),
1263
+ "pk_list": pk_list,
1264
+ "saved_view_id": saved_view_id,
1265
+ }
1266
+
1267
+ queryset = get_bulk_queryset_from_view(user=request.user, action="delete", **self.key_params)
1258
1268
 
1259
1269
  form_cls = self.get_form()
1260
1270
 
@@ -1266,7 +1276,7 @@ class BulkDeleteView(
1266
1276
 
1267
1277
  if form.is_valid():
1268
1278
  logger.debug("Form validation was successful")
1269
- return self.send_bulk_delete_objects_to_job(request, pk_list, model, delete_all)
1279
+ return self.send_bulk_delete_objects_to_job(request)
1270
1280
  else:
1271
1281
  logger.debug("Form validation failed")
1272
1282
 
@@ -1329,7 +1339,7 @@ class BulkDeleteView(
1329
1339
 
1330
1340
 
1331
1341
  # TODO: Replace with BulkCreateView
1332
- class ComponentCreateView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
1342
+ class ComponentCreateView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
1333
1343
  """
1334
1344
  Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine.
1335
1345
  """
@@ -1435,7 +1445,7 @@ class ComponentCreateView(GetReturnURLMixin, UIComponentsMixin, ObjectPermission
1435
1445
  )
1436
1446
 
1437
1447
 
1438
- class BulkComponentCreateView(GetReturnURLMixin, UIComponentsMixin, ObjectPermissionRequiredMixin, View):
1448
+ class BulkComponentCreateView(UIComponentsMixin, GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
1439
1449
  """
1440
1450
  Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines.
1441
1451
  """
@@ -31,7 +31,6 @@ from rest_framework.parsers import FormParser, MultiPartParser
31
31
  from rest_framework.response import Response
32
32
  from rest_framework.viewsets import GenericViewSet
33
33
 
34
- from nautobot.core import exceptions as core_exceptions
35
34
  from nautobot.core.api.views import BulkDestroyModelMixin, BulkUpdateModelMixin
36
35
  from nautobot.core.forms import (
37
36
  BootstrapMixin,
@@ -40,13 +39,17 @@ from nautobot.core.forms import (
40
39
  CSVFileField,
41
40
  restrict_form_fields,
42
41
  )
43
- from nautobot.core.jobs import BulkDeleteObjects, BulkEditObjects
44
42
  from nautobot.core.ui.breadcrumbs import Breadcrumbs
45
43
  from nautobot.core.ui.titles import Titles
46
- from nautobot.core.utils import filtering, lookup, permissions
47
- from nautobot.core.utils.requests import get_filterable_params_from_filter_params, normalize_querydict
44
+ from nautobot.core.utils import lookup, permissions
45
+ from nautobot.core.utils.requests import (
46
+ convert_querydict_to_dict,
47
+ get_filterable_params_from_filter_params,
48
+ normalize_querydict,
49
+ )
48
50
  from nautobot.core.views.renderers import NautobotHTMLRenderer
49
51
  from nautobot.core.views.utils import (
52
+ get_bulk_queryset_from_view,
50
53
  get_csv_form_fields_from_serializer_class,
51
54
  handle_protectederror,
52
55
  import_csv_helper,
@@ -671,13 +674,16 @@ class NautobotViewSetMixin(GenericViewSet, UIComponentsMixin, AccessMixin, GetRe
671
674
  def get_extra_context(self, request, instance=None):
672
675
  """
673
676
  Return any additional context data for the template.
674
- request: The current request
675
- instance: The object being viewed
677
+
678
+ Args:
679
+ request (Request): The current request
680
+ instance (Model, optional): The specific object being viewed, if any
676
681
  """
677
682
  if instance is not None:
678
- return {
679
- "active_tab": request.GET.get("tab", "main"),
680
- }
683
+ default_tab = "main"
684
+ if hasattr(self, "action") and self.action != "retrieve":
685
+ default_tab = self.action
686
+ return {"active_tab": request.GET.get("tab", default_tab)}
681
687
  return {}
682
688
 
683
689
  def get_template_name(self):
@@ -1113,60 +1119,14 @@ class BulkEditAndBulkDeleteModelMixin:
1113
1119
 
1114
1120
  logger = logging.getLogger(__name__)
1115
1121
 
1116
- def _get_bulk_edit_delete_all_queryset(self, request):
1117
- """
1118
- Retrieve the queryset of model instances to be bulk-deleted or bulk-deleted, filtered based on request parameters.
1119
-
1120
- This method handles the retrieval of a queryset of model instances that match the specified
1121
- filter criteria in the request parameters, allowing a bulk delete operation to be performed
1122
- on all matching instances.
1123
- """
1124
- model = self.queryset.model
1125
-
1126
- # This Mixin is currently been used by both NautobotUIViewSet ObjectBulkDestroyViewMixin, ObjectBulkUpdateViewMixin
1127
- # BulkEditView, and BulkDeleteView which uses different keys for accessing filterset
1128
- filterset_class = getattr(self, "filterset", None)
1129
- if filterset_class is None:
1130
- filterset_class = getattr(self, "filterset_class", None)
1131
-
1132
- if request.GET and filterset_class is not None:
1133
- queryset = filterset_class(request.GET, model.objects.all()).qs # pylint: disable=not-callable
1134
- # We take this approach because filterset.qs has already applied .distinct(),
1135
- # and performing a .delete directly on a queryset with .distinct applied is not allowed.
1136
- queryset = self.queryset.filter(pk__in=queryset)
1137
- else:
1138
- queryset = model.objects.all()
1139
- return queryset
1140
-
1141
- def send_bulk_delete_objects_to_job(self, request, pk_list, model, delete_all):
1122
+ def send_bulk_delete_objects_to_job(self, request):
1142
1123
  """Prepare and enqueue bulk delete job."""
1143
- job_model = Job.objects.get_for_class_path(BulkDeleteObjects.class_path)
1144
-
1145
- if filterset_class := lookup.get_filterset_for_model(model):
1146
- filter_query_params = normalize_querydict(request.GET, filterset=filterset_class())
1147
- else:
1148
- filter_query_params = {}
1124
+ from nautobot.core.jobs import BulkDeleteObjects
1149
1125
 
1150
- # Discarding non-filter query params
1151
- new_filter_query_params = {}
1152
-
1153
- for key, value in filter_query_params.items():
1154
- try:
1155
- filtering.get_filterset_field(filterset_class(), key)
1156
- new_filter_query_params[key] = value
1157
- except core_exceptions.FilterSetFieldNotFound:
1158
- self.logger.debug(f"Query parameter `{key}` not found in `{filterset_class}`, discarding it")
1126
+ job_model = Job.objects.get_for_class_path(BulkDeleteObjects.class_path)
1159
1127
 
1160
- filter_query_params = new_filter_query_params
1128
+ job_form = BulkDeleteObjects.as_form(data={**self.key_params})
1161
1129
 
1162
- job_form = BulkDeleteObjects.as_form(
1163
- data={
1164
- "pk_list": pk_list,
1165
- "content_type": ContentType.objects.get_for_model(model),
1166
- "delete_all": delete_all,
1167
- "filter_query_params": filter_query_params,
1168
- }
1169
- )
1170
1130
  # BulkDeleteObjects job form cannot be invalid; Hence no handling of invalid case.
1171
1131
  job_form.is_valid()
1172
1132
  job_kwargs = BulkDeleteObjects.prepare_job_kwargs(job_form.cleaned_data)
@@ -1177,39 +1137,18 @@ class BulkEditAndBulkDeleteModelMixin:
1177
1137
  )
1178
1138
  return redirect("extras:jobresult", pk=job_result.pk)
1179
1139
 
1180
- def send_bulk_edit_objects_to_job(self, request, form_data, model):
1140
+ def send_bulk_edit_objects_to_job(self, request, form_data):
1181
1141
  """Prepare and enqueue a bulk edit job."""
1182
- job_model = Job.objects.get_for_class_path(BulkEditObjects.class_path)
1183
- if filterset_class := lookup.get_filterset_for_model(model):
1184
- filter_query_params = normalize_querydict(request.GET, filterset=filterset_class())
1185
- else:
1186
- filter_query_params = {}
1142
+ from nautobot.core.jobs import BulkEditObjects
1187
1143
 
1188
- # Discarding non-filter query params
1189
- new_filter_query_params = {}
1190
-
1191
- for key, value in filter_query_params.items():
1192
- try:
1193
- filtering.get_filterset_field(filterset_class(), key)
1194
- new_filter_query_params[key] = value
1195
- except core_exceptions.FilterSetFieldNotFound:
1196
- self.logger.debug(f"Query parameter `{key}` not found in `{filterset_class}`, discarding it")
1197
-
1198
- filter_query_params = new_filter_query_params
1144
+ job_model = Job.objects.get_for_class_path(BulkEditObjects.class_path)
1199
1145
 
1200
1146
  if nullified_fields := request.POST.getlist("_nullify"):
1201
1147
  form_data["_nullify"] = nullified_fields
1202
1148
  else:
1203
1149
  form_data["_nullify"] = []
1204
1150
 
1205
- job_form = BulkEditObjects.as_form(
1206
- data={
1207
- "form_data": form_data,
1208
- "content_type": ContentType.objects.get_for_model(model),
1209
- "edit_all": request.POST.get("_all") is not None,
1210
- "filter_query_params": filter_query_params,
1211
- }
1212
- )
1151
+ job_form = BulkEditObjects.as_form(data={"form_data": form_data, **self.key_params})
1213
1152
  # NOTE: BulkEditObjects cant be invalid, so there is no need for handling invalid error
1214
1153
  job_form.is_valid()
1215
1154
  job_kwargs = BulkEditObjects.prepare_job_kwargs(job_form.cleaned_data)
@@ -1228,17 +1167,25 @@ class ObjectBulkDestroyViewMixin(NautobotViewSetMixin, BulkDestroyModelMixin, Bu
1228
1167
 
1229
1168
  bulk_destroy_form_class: Optional[type[Form]] = None
1230
1169
  filterset_class: Optional[type[FilterSet]] = None
1170
+ logger = logging.getLogger(__name__)
1231
1171
 
1232
1172
  def _process_bulk_destroy_form(self, form):
1233
1173
  request = self.request
1234
- pk_list = self.pk_list
1235
1174
  queryset = self.get_queryset()
1236
1175
  model = queryset.model
1237
1176
  # Delete objects
1238
- if self.request.POST.get("_all"):
1239
- queryset = self._get_bulk_edit_delete_all_queryset(self.request)
1240
- else:
1241
- queryset = queryset.filter(pk__in=pk_list)
1177
+ delete_all = bool(self.request.POST.get("_all"))
1178
+ saved_view_id = request.GET.get("saved_view", "")
1179
+
1180
+ self.key_params = {
1181
+ "content_type": ContentType.objects.get_for_model(model),
1182
+ "delete_all": delete_all,
1183
+ "filter_query_params": convert_querydict_to_dict(request.GET),
1184
+ "pk_list": self.pk_list,
1185
+ "saved_view_id": saved_view_id,
1186
+ }
1187
+
1188
+ queryset = get_bulk_queryset_from_view(user=request.user, action="delete", **self.key_params)
1242
1189
 
1243
1190
  try:
1244
1191
  with transaction.atomic():
@@ -1267,21 +1214,26 @@ class ObjectBulkDestroyViewMixin(NautobotViewSetMixin, BulkDestroyModelMixin, Bu
1267
1214
  request.POST "_confirm": Function to validate the table form/BulkDestroyConfirmationForm and to perform the action of bulk destroy. Render the form with errors if exceptions are raised.
1268
1215
  """
1269
1216
  queryset = self.get_queryset()
1217
+ model = queryset.model
1218
+ self.pk_list = list(request.POST.getlist("pk"))
1270
1219
  delete_all = bool(request.POST.get("_all"))
1220
+ saved_view_id = request.GET.get("saved_view", "")
1271
1221
  data = {}
1272
- # Are we deleting *all* objects in the queryset or just a selected subset?
1273
- if delete_all:
1274
- self.pk_list = []
1275
- queryset = self._get_bulk_edit_delete_all_queryset(self.request)
1276
- else:
1277
- self.pk_list = list(request.POST.getlist("pk"))
1278
- queryset = queryset.filter(pk__in=self.pk_list)
1222
+ self.key_params = {
1223
+ "content_type": ContentType.objects.get_for_model(model),
1224
+ "delete_all": delete_all,
1225
+ "filter_query_params": convert_querydict_to_dict(request.GET),
1226
+ "pk_list": self.pk_list,
1227
+ "saved_view_id": saved_view_id,
1228
+ }
1229
+
1230
+ queryset = get_bulk_queryset_from_view(user=request.user, action="delete", **self.key_params)
1279
1231
 
1280
1232
  if "_confirm" in request.POST:
1281
1233
  form_class = self.get_form_class(**kwargs)
1282
1234
  form = form_class(request.POST, initial=normalize_querydict(request.GET, form_class=form_class))
1283
1235
  if form.is_valid():
1284
- return self.send_bulk_delete_objects_to_job(request, self.pk_list, queryset.model, delete_all)
1236
+ return self.send_bulk_delete_objects_to_job(request)
1285
1237
  else:
1286
1238
  return self.form_invalid(form)
1287
1239
  table = None
@@ -1368,12 +1320,25 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
1368
1320
  """
1369
1321
 
1370
1322
  filterset_class: ClassVar[Optional[type[FilterSet]]] = None
1323
+ logger = logging.getLogger(__name__)
1371
1324
 
1372
1325
  # NOTE: Performing BulkEdit Objects has been moved to a system job, but the logic remains here to ensure backward compatibility.
1373
1326
  def _process_bulk_update_form(self, form):
1374
1327
  request = self.request
1328
+ self.pk_list = list(request.POST.getlist("pk"))
1375
1329
  queryset = self.get_queryset()
1376
1330
  model = queryset.model
1331
+ edit_all = bool(self.request.POST.get("_all"))
1332
+ saved_view_id = request.GET.get("saved_view", "")
1333
+
1334
+ self.key_params = {
1335
+ "content_type": ContentType.objects.get_for_model(model),
1336
+ "edit_all": edit_all,
1337
+ "filter_query_params": convert_querydict_to_dict(request.GET),
1338
+ "pk_list": self.pk_list,
1339
+ "saved_view_id": saved_view_id,
1340
+ }
1341
+
1377
1342
  form_custom_fields = getattr(form, "custom_fields", [])
1378
1343
  form_relationships = getattr(form, "relationships", [])
1379
1344
  # Standard fields are those that are intrinsic to self.model in the form
@@ -1385,14 +1350,12 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
1385
1350
  if field not in form_custom_fields + form_relationships + ["pk"] + ["object_note"]
1386
1351
  ]
1387
1352
  nullified_fields = request.POST.getlist("_nullify") or []
1353
+
1388
1354
  with deferred_change_logging_for_bulk_operation():
1389
1355
  updated_objects = []
1390
- edit_all = self.request.POST.get("_all")
1391
1356
 
1392
- if edit_all:
1393
- queryset = self._get_bulk_edit_delete_all_queryset(self.request)
1394
- else:
1395
- queryset = queryset.filter(pk__in=form.cleaned_data["pk"])
1357
+ queryset = get_bulk_queryset_from_view(user=request.user, action="change", **self.key_params)
1358
+
1396
1359
  for obj in queryset:
1397
1360
  self.obj = obj
1398
1361
  # Update standard fields. If a field is listed in _nullify, delete its value.
@@ -1464,14 +1427,21 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
1464
1427
  request.POST "_edit": Function to render the user selection of objects in a table form/BulkUpdateForm via Response that is passed to NautobotHTMLRenderer.
1465
1428
  request.POST "_apply": Function to validate the table form/BulkUpdateForm and to perform the action of bulk update. Render the form with errors if exceptions are raised.
1466
1429
  """
1467
- edit_all = request.POST.get("_all")
1430
+ _queryset = self.get_queryset()
1431
+ model = _queryset.model
1432
+ self.pk_list = list(request.POST.getlist("pk"))
1433
+ edit_all = bool(self.request.POST.get("_all"))
1434
+ saved_view_id = request.GET.get("saved_view", "")
1435
+
1436
+ self.key_params = {
1437
+ "content_type": ContentType.objects.get_for_model(model),
1438
+ "edit_all": edit_all,
1439
+ "filter_query_params": convert_querydict_to_dict(request.GET),
1440
+ "pk_list": self.pk_list,
1441
+ "saved_view_id": saved_view_id,
1442
+ }
1468
1443
 
1469
- if edit_all:
1470
- self.pk_list = None
1471
- queryset = self._get_bulk_edit_delete_all_queryset(request)
1472
- else:
1473
- self.pk_list = list(request.POST.getlist("pk"))
1474
- queryset = self.get_queryset().filter(pk__in=self.pk_list)
1444
+ queryset = get_bulk_queryset_from_view(user=request.user, action="change", **self.key_params)
1475
1445
 
1476
1446
  data = {}
1477
1447
  form_class = self.get_form_class()
@@ -1480,7 +1450,7 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
1480
1450
  form = form_class(queryset.model, request.POST, edit_all=edit_all)
1481
1451
  restrict_form_fields(form, request.user)
1482
1452
  if form.is_valid():
1483
- return self.send_bulk_edit_objects_to_job(self.request, form.cleaned_data, queryset.model)
1453
+ return self.send_bulk_edit_objects_to_job(request, form.cleaned_data)
1484
1454
  else:
1485
1455
  return self.form_invalid(form)
1486
1456
  table = None