nautobot 2.4.17__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.
- nautobot/apps/ui.py +6 -0
- nautobot/apps/views.py +2 -0
- nautobot/circuits/tables.py +1 -1
- nautobot/circuits/templates/circuits/circuit_create.html +7 -7
- nautobot/circuits/templates/circuits/circuit_retrieve.html +1 -5
- nautobot/circuits/templates/circuits/circuittermination_create.html +26 -26
- nautobot/circuits/templates/circuits/circuittermination_retrieve.html +1 -8
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +20 -20
- nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +3 -3
- nautobot/circuits/templates/circuits/inc/circuit_termination_speed_fragment.html +9 -0
- nautobot/circuits/templates/circuits/providernetwork_retrieve.html +1 -3
- nautobot/circuits/tests/integration/test_circuit.py +2 -2
- nautobot/circuits/views.py +49 -15
- nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +1 -4
- nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +1 -7
- nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +1 -3
- nautobot/cloud/templates/cloud/cloudservice_retrieve.html +1 -5
- nautobot/cloud/views.py +45 -0
- nautobot/core/filters.py +2 -2
- nautobot/core/graphql/generators.py +5 -2
- nautobot/core/jobs/bulk_actions.py +48 -85
- nautobot/core/models/querysets.py +2 -1
- nautobot/core/settings.py +1 -0
- nautobot/core/settings.yaml +9 -0
- nautobot/core/tables.py +21 -23
- nautobot/core/templates/40x.html +15 -15
- nautobot/core/templates/500.html +21 -21
- nautobot/core/templates/admin/app_index.html +8 -8
- nautobot/core/templates/admin/base.html +104 -104
- nautobot/core/templates/admin/change_form.html +65 -65
- nautobot/core/templates/admin/change_list.html +60 -60
- nautobot/core/templates/admin/change_list_results.html +39 -39
- nautobot/core/templates/admin/config/config.html +47 -47
- nautobot/core/templates/admin/delete_confirmation.html +47 -47
- nautobot/core/templates/admin/edit_inline/stacked.html +124 -124
- nautobot/core/templates/admin/edit_inline/tabular.html +60 -60
- nautobot/core/templates/admin/includes/fieldset.html +4 -4
- nautobot/core/templates/admin/index.html +60 -60
- nautobot/core/templates/admin/prepopulated_fields_js.html +18 -18
- nautobot/core/templates/admin/submit_line.html +4 -4
- nautobot/core/templates/base_django.html +46 -46
- nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +8 -8
- nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +8 -8
- nautobot/core/templates/buttons/export.html +3 -3
- nautobot/core/templates/components/breadcrumbs.html +19 -0
- nautobot/core/templates/components/button/default.html +3 -3
- nautobot/core/templates/components/button/dropdown.html +7 -7
- nautobot/core/templates/components/button/formbutton.html +4 -4
- nautobot/core/templates/components/panel/body_content_data_table.html +1 -1
- nautobot/core/templates/components/panel/body_wrapper_generic_table.html +3 -0
- nautobot/core/templates/components/panel/footer_content_table.html +3 -1
- nautobot/core/templates/components/panel/header_extra_content_table.html +10 -1
- nautobot/core/templates/components/tab/content_wrapper.html +1 -1
- nautobot/core/templates/components/tab/label_wrapper.html +1 -1
- nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +10 -3
- nautobot/core/templates/generic/object_bulk_add_component.html +40 -40
- nautobot/core/templates/generic/object_bulk_create.html +3 -3
- nautobot/core/templates/generic/object_bulk_destroy.html +6 -6
- nautobot/core/templates/generic/object_bulk_update.html +52 -52
- nautobot/core/templates/generic/object_changelog.html +0 -2
- nautobot/core/templates/generic/object_import.html +33 -33
- nautobot/core/templates/generic/object_list.html +271 -268
- nautobot/core/templates/generic/object_notes.html +0 -2
- nautobot/core/templates/generic/object_retrieve.html +264 -257
- nautobot/core/templates/graphene/graphiql.html +127 -127
- nautobot/core/templates/home.html +62 -62
- nautobot/core/templates/inc/computed_fields/panel_data.html +13 -13
- nautobot/core/templates/inc/created_updated.html +8 -8
- nautobot/core/templates/inc/custom_fields/panel_data.html +13 -13
- nautobot/core/templates/inc/dynamic_groups_panel.html +11 -11
- nautobot/core/templates/inc/footer.html +19 -19
- nautobot/core/templates/inc/javascript.html +1 -1
- nautobot/core/templates/inc/media.html +46 -46
- nautobot/core/templates/inc/nav_menu.html +1 -1
- nautobot/core/templates/inc/relationships_table_rows.html +22 -22
- nautobot/core/templates/inc/tenant_table_row.html +1 -1
- nautobot/core/templates/login.html +77 -77
- nautobot/core/templates/media_failure.html +38 -38
- nautobot/core/templates/panel_table.html +1 -1
- nautobot/core/templates/rest_framework/api.html +3 -3
- nautobot/core/templates/search.html +1 -1
- nautobot/core/templates/swagger_ui.html +9 -9
- nautobot/core/templates/utilities/confirmation_form.html +18 -18
- nautobot/core/templates/utilities/render_field.html +1 -1
- nautobot/core/templates/utilities/render_jinja2.html +43 -43
- nautobot/core/templates/utilities/templatetags/filter_form_modal.html +56 -56
- nautobot/core/templates/utilities/templatetags/utilization_graph.html +1 -1
- nautobot/core/templates/utilities/theme_preview.html +799 -799
- nautobot/core/templates/utilities/worker_status.html +122 -122
- nautobot/core/templates/widgets/clearable_file.html +3 -3
- nautobot/core/templates/widgets/sluginput.html +1 -1
- nautobot/core/templatetags/buttons.py +8 -2
- nautobot/core/templatetags/helpers.py +24 -0
- nautobot/core/templatetags/ui_framework.py +40 -5
- nautobot/core/testing/filters.py +37 -21
- nautobot/core/testing/integration.py +7 -4
- nautobot/core/testing/views.py +49 -5
- nautobot/core/tests/test_breadcrumbs.py +78 -4
- nautobot/core/tests/test_commands.py +7 -4
- nautobot/core/tests/test_graphql.py +20 -5
- nautobot/core/tests/test_jobs.py +34 -21
- nautobot/core/tests/test_tables.py +43 -6
- nautobot/core/tests/test_templatetags_ui_framework.py +146 -0
- nautobot/core/tests/test_titles.py +2 -2
- nautobot/core/tests/test_ui.py +188 -1
- nautobot/core/tests/test_utils.py +35 -0
- nautobot/core/tests/test_views.py +45 -0
- nautobot/core/tests/test_views_generic.py +43 -0
- nautobot/core/tests/test_views_utils.py +239 -5
- nautobot/core/ui/breadcrumbs.py +220 -28
- nautobot/core/ui/bulk_buttons.py +8 -0
- nautobot/core/ui/object_detail.py +181 -60
- nautobot/core/ui/titles.py +10 -5
- nautobot/core/utils/requests.py +27 -2
- nautobot/core/views/__init__.py +24 -3
- nautobot/core/views/generic.py +70 -35
- nautobot/core/views/mixins.py +226 -122
- nautobot/core/views/utils.py +270 -1
- nautobot/dcim/api/serializers.py +8 -2
- nautobot/dcim/constants.py +1 -0
- nautobot/dcim/factory.py +4 -3
- nautobot/dcim/filters/mixins.py +1 -2
- nautobot/dcim/forms.py +5 -1
- nautobot/dcim/migrations/0074_alter_rack_u_height.py +21 -0
- nautobot/dcim/models/devices.py +30 -1
- nautobot/dcim/models/racks.py +2 -2
- nautobot/dcim/tables/__init__.py +2 -0
- nautobot/dcim/tables/devices.py +24 -0
- nautobot/dcim/tables/power.py +2 -2
- nautobot/dcim/templates/dcim/cable.html +53 -53
- nautobot/dcim/templates/dcim/cable_connect.html +182 -182
- nautobot/dcim/templates/dcim/cable_trace.html +1 -1
- nautobot/dcim/templates/dcim/console_port_connection_list.html +5 -5
- nautobot/dcim/templates/dcim/consoleport.html +86 -86
- nautobot/dcim/templates/dcim/consoleserverport.html +86 -86
- nautobot/dcim/templates/dcim/controller_create.html +34 -34
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +68 -68
- nautobot/dcim/templates/dcim/device/base.html +1 -114
- nautobot/dcim/templates/dcim/device/config.html +17 -17
- nautobot/dcim/templates/dcim/device/consoleports.html +1 -52
- nautobot/dcim/templates/dcim/device/consoleserverports.html +1 -52
- nautobot/dcim/templates/dcim/device/devicebays.html +1 -48
- nautobot/dcim/templates/dcim/device/frontports.html +1 -52
- nautobot/dcim/templates/dcim/device/interfaces.html +1 -56
- nautobot/dcim/templates/dcim/device/inventory.html +1 -48
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +64 -64
- nautobot/dcim/templates/dcim/device/modulebays.html +1 -48
- nautobot/dcim/templates/dcim/device/poweroutlets.html +1 -52
- nautobot/dcim/templates/dcim/device/powerports.html +1 -52
- nautobot/dcim/templates/dcim/device/rearports.html +1 -52
- nautobot/dcim/templates/dcim/device/status.html +66 -66
- nautobot/dcim/templates/dcim/device/wireless.html +1 -72
- nautobot/dcim/templates/dcim/device.html +4 -422
- nautobot/dcim/templates/dcim/device_component.html +0 -19
- nautobot/dcim/templates/dcim/device_component_add.html +25 -25
- nautobot/dcim/templates/dcim/device_create.html +229 -0
- nautobot/dcim/templates/dcim/device_edit.html +2 -227
- nautobot/dcim/templates/dcim/devicebay.html +41 -41
- nautobot/dcim/templates/dcim/devicebay_populate.html +32 -32
- nautobot/dcim/templates/dcim/devicetype_component_add.html +28 -28
- nautobot/dcim/templates/dcim/devicetype_retrieve.html +1 -3
- nautobot/dcim/templates/dcim/frontport.html +84 -84
- nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +1 -1
- nautobot/dcim/templates/dcim/inc/device_interface_filter.html +8 -0
- nautobot/dcim/templates/dcim/inc/device_napalm_tabs.html +1 -15
- nautobot/dcim/templates/dcim/inc/location_hierarchy.html +22 -22
- nautobot/dcim/templates/dcim/interface.html +206 -206
- nautobot/dcim/templates/dcim/interface_connection_list.html +5 -5
- nautobot/dcim/templates/dcim/interfaceredundancygroupassociation_create.html +6 -6
- nautobot/dcim/templates/dcim/inventoryitem.html +44 -44
- nautobot/dcim/templates/dcim/inventoryitem_add.html +32 -32
- nautobot/dcim/templates/dcim/inventoryitem_edit.html +22 -22
- nautobot/dcim/templates/dcim/location_migrate_data_to_contact.html +46 -46
- nautobot/dcim/templates/dcim/location_retrieve.html +1 -7
- nautobot/dcim/templates/dcim/locationtype.html +1 -6
- nautobot/dcim/templates/dcim/locationtype_retrieve.html +1 -7
- nautobot/dcim/templates/dcim/module/base.html +85 -85
- nautobot/dcim/templates/dcim/module_interfaces.html +1 -1
- nautobot/dcim/templates/dcim/module_modulebays.html +1 -1
- nautobot/dcim/templates/dcim/module_retrieve.html +52 -52
- nautobot/dcim/templates/dcim/module_update.html +61 -61
- nautobot/dcim/templates/dcim/modulebay_destroy.html +1 -1
- nautobot/dcim/templates/dcim/modulebay_retrieve.html +83 -99
- nautobot/dcim/templates/dcim/modulebay_update.html +33 -33
- nautobot/dcim/templates/dcim/modulefamily_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/moduletype_retrieve.html +140 -144
- nautobot/dcim/templates/dcim/platform_create.html +38 -38
- nautobot/dcim/templates/dcim/power_port_connection_list.html +5 -5
- nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -8
- nautobot/dcim/templates/dcim/poweroutlet.html +85 -85
- nautobot/dcim/templates/dcim/powerpanel_retrieve.html +1 -8
- nautobot/dcim/templates/dcim/powerport.html +91 -91
- nautobot/dcim/templates/dcim/rack_elevation_list.html +18 -18
- nautobot/dcim/templates/dcim/rack_retrieve.html +264 -274
- nautobot/dcim/templates/dcim/rackreservation_retrieve.html +0 -3
- nautobot/dcim/templates/dcim/rearport.html +78 -78
- nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +1 -50
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +1 -5
- nautobot/dcim/tests/integration/test_device_bulk_operations.py +3 -2
- nautobot/dcim/tests/integration/test_location_bulk_operations.py +6 -2
- nautobot/dcim/tests/test_api.py +33 -1
- nautobot/dcim/tests/test_views.py +189 -4
- nautobot/dcim/ui.py +29 -0
- nautobot/dcim/urls.py +1 -109
- nautobot/dcim/utils.py +30 -0
- nautobot/dcim/views.py +1149 -550
- nautobot/extras/filters/mixins.py +1 -1
- nautobot/extras/forms/forms.py +15 -0
- nautobot/extras/models/groups.py +10 -1
- nautobot/extras/models/jobs.py +2 -2
- nautobot/extras/plugins/views.py +18 -5
- nautobot/extras/tables.py +24 -2
- nautobot/extras/templates/extras/computedfield_edit.html +4 -4
- nautobot/extras/templates/extras/configcontext_update.html +1 -1
- nautobot/extras/templates/extras/configcontextschema_retrieve.html +32 -32
- nautobot/extras/templates/extras/customfield_retrieve.html +1 -128
- nautobot/extras/templates/extras/customfield_update.html +23 -23
- nautobot/extras/templates/extras/dynamicgroup.html +2 -99
- nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -199
- nautobot/extras/templates/extras/dynamicgroup_retrieve.html +99 -0
- nautobot/extras/templates/extras/dynamicgroup_update.html +199 -0
- nautobot/extras/templates/extras/gitrepository.html +2 -82
- nautobot/extras/templates/extras/gitrepository_list.html +10 -10
- nautobot/extras/templates/extras/gitrepository_object_edit.html +2 -13
- nautobot/extras/templates/extras/gitrepository_retrieve.html +82 -0
- nautobot/extras/templates/extras/gitrepository_update.html +13 -0
- nautobot/extras/templates/extras/graphqlquery_retrieve.html +73 -73
- nautobot/extras/templates/extras/inc/configcontext_format.html +2 -2
- nautobot/extras/templates/extras/inc/job_table.html +10 -10
- nautobot/extras/templates/extras/inc/jobresult.html +21 -21
- nautobot/extras/templates/extras/inc/jobresult_js.html +6 -6
- nautobot/extras/templates/extras/inc/tags_panel.html +10 -10
- nautobot/extras/templates/extras/job.html +64 -64
- nautobot/extras/templates/extras/job_approval_request.html +9 -9
- nautobot/extras/templates/extras/job_bulk_edit.html +13 -13
- nautobot/extras/templates/extras/job_edit.html +45 -45
- nautobot/extras/templates/extras/job_list.html +4 -4
- nautobot/extras/templates/extras/jobresult_retrieve.html +0 -25
- nautobot/extras/templates/extras/marketplace.html +101 -101
- nautobot/extras/templates/extras/metadatatype_create.html +20 -20
- nautobot/extras/templates/extras/note_retrieve.html +0 -52
- nautobot/extras/templates/extras/object_assign_contact_or_team.html +18 -18
- nautobot/extras/templates/extras/object_configcontext.html +1 -3
- nautobot/extras/templates/extras/objectchange.html +2 -165
- nautobot/extras/templates/extras/objectchange_retrieve.html +165 -0
- nautobot/extras/templates/extras/plugin_detail.html +44 -48
- nautobot/extras/templates/extras/plugins_list.html +9 -11
- nautobot/extras/templates/extras/plugins_tiles.html +26 -26
- nautobot/extras/templates/extras/relationship_edit.html +4 -4
- nautobot/extras/templates/extras/role_retrieve.html +13 -13
- nautobot/extras/templates/extras/scheduled_jobs_approval_queue_list.html +21 -21
- nautobot/extras/templates/extras/scheduledjob.html +128 -128
- nautobot/extras/templates/extras/secret_create.html +53 -53
- nautobot/extras/templates/extras/secretsgroup_update.html +13 -13
- nautobot/extras/templates/extras/templatetags/plugin_object_detail_tabs.html +3 -3
- nautobot/extras/templates/extras/webhook.html +79 -79
- nautobot/extras/tests/integration/test_relationships.py +6 -6
- nautobot/extras/tests/test_dynamicgroups.py +73 -18
- nautobot/extras/tests/test_filters.py +1 -1
- nautobot/extras/tests/test_jobs.py +2 -0
- nautobot/extras/tests/test_views.py +8 -3
- nautobot/extras/urls.py +3 -97
- nautobot/extras/views.py +524 -456
- nautobot/ipam/filters.py +2 -2
- nautobot/ipam/migrations/0053_alter_vrfdeviceassignment_options_and_more.py +20 -0
- nautobot/ipam/models.py +34 -0
- nautobot/ipam/querysets.py +3 -3
- nautobot/ipam/signals.py +6 -1
- nautobot/ipam/tables.py +3 -1
- nautobot/ipam/templates/ipam/inc/prefix_header_extra_content_table.html +4 -0
- nautobot/ipam/templates/ipam/inc/toggle_available.html +8 -8
- nautobot/ipam/templates/ipam/inc/vlangroup_header.html +4 -4
- nautobot/ipam/templates/ipam/ipaddress.html +119 -123
- nautobot/ipam/templates/ipam/ipaddress_assign.html +10 -10
- nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -1
- nautobot/ipam/templates/ipam/ipaddress_merge.html +180 -180
- nautobot/ipam/templates/ipam/ipaddresstointerface_retrieve.html +48 -48
- nautobot/ipam/templates/ipam/prefix.html +2 -115
- nautobot/ipam/templates/ipam/prefix_create.html +34 -0
- nautobot/ipam/templates/ipam/prefix_edit.html +1 -34
- nautobot/ipam/templates/ipam/prefix_retrieve.html +3 -0
- nautobot/ipam/templates/ipam/service_retrieve.html +1 -6
- nautobot/ipam/templates/ipam/vlan_retrieve.html +1 -7
- nautobot/ipam/templates/ipam/vrf_edit.html +1 -1
- nautobot/ipam/tests/test_api.py +5 -0
- nautobot/ipam/tests/test_models.py +387 -0
- nautobot/ipam/tests/test_querysets.py +46 -0
- nautobot/ipam/tests/test_views.py +34 -0
- nautobot/ipam/ui.py +145 -0
- nautobot/ipam/urls.py +1 -46
- nautobot/ipam/utils/__init__.py +26 -0
- nautobot/ipam/utils/migrations.py +1 -1
- nautobot/ipam/views.py +234 -112
- nautobot/project-static/docs/404.html +11 -11
- nautobot/project-static/docs/apps/index.html +11 -11
- nautobot/project-static/docs/apps/nautobot-apps.html +11 -11
- nautobot/project-static/docs/assets/javascripts/{bundle.92b07e13.min.js → bundle.f55a23d4.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.92b07e13.min.js.map → bundle.f55a23d4.min.js.map} +2 -2
- nautobot/project-static/docs/assets/stylesheets/{main.7e37652d.min.css → main.e53b48f4.min.css} +1 -1
- nautobot/project-static/docs/assets/stylesheets/{main.7e37652d.min.css.map → main.e53b48f4.min.css.map} +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +83 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1265 -281
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +12 -12
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +452 -29
- nautobot/project-static/docs/development/apps/api/configuration-view.html +11 -11
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +11 -11
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +11 -11
- nautobot/project-static/docs/development/apps/api/models/global-search.html +11 -11
- nautobot/project-static/docs/development/apps/api/models/graphql.html +11 -11
- nautobot/project-static/docs/development/apps/api/models/index.html +11 -11
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +12 -12
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/prepopulating-data.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +11 -11
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +11 -11
- nautobot/project-static/docs/development/apps/api/prometheus.html +11 -11
- nautobot/project-static/docs/development/apps/api/setup.html +11 -11
- nautobot/project-static/docs/development/apps/api/testing.html +11 -11
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +11 -11
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +11 -11
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +11 -11
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +11 -11
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/base-template.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/index.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/notes.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +11 -11
- nautobot/project-static/docs/development/apps/api/views/urls.html +11 -11
- nautobot/project-static/docs/development/apps/index.html +11 -11
- nautobot/project-static/docs/development/apps/migration/code-updates.html +11 -11
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +11 -11
- nautobot/project-static/docs/development/apps/migration/from-v1.html +11 -11
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +11 -11
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +11 -11
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +11 -11
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +11 -11
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +11 -11
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/breadcrumbs-titles.html +11 -11
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +11 -11
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +11 -11
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +11 -11
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +11 -11
- nautobot/project-static/docs/development/core/application-registry.html +11 -11
- nautobot/project-static/docs/development/core/best-practices.html +11 -11
- nautobot/project-static/docs/development/core/bootstrap-ui.html +11 -11
- nautobot/project-static/docs/development/core/caching.html +11 -11
- nautobot/project-static/docs/development/core/controllers.html +11 -11
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +11 -11
- nautobot/project-static/docs/development/core/generic-views.html +11 -11
- nautobot/project-static/docs/development/core/getting-started.html +50 -63
- nautobot/project-static/docs/development/core/homepage.html +11 -11
- nautobot/project-static/docs/development/core/index.html +11 -11
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +11 -11
- nautobot/project-static/docs/development/core/model-checklist.html +11 -11
- nautobot/project-static/docs/development/core/model-features.html +11 -11
- nautobot/project-static/docs/development/core/natural-keys.html +11 -11
- nautobot/project-static/docs/development/core/navigation-menu.html +11 -11
- nautobot/project-static/docs/development/core/release-checklist.html +11 -11
- nautobot/project-static/docs/development/core/role-internals.html +11 -11
- nautobot/project-static/docs/development/core/settings.html +11 -11
- nautobot/project-static/docs/development/core/style-guide.html +15 -11
- nautobot/project-static/docs/development/core/templates.html +11 -11
- nautobot/project-static/docs/development/core/testing.html +11 -11
- nautobot/project-static/docs/development/core/ui-component-framework.html +17 -22
- nautobot/project-static/docs/development/core/user-preferences.html +11 -11
- nautobot/project-static/docs/development/index.html +11 -11
- nautobot/project-static/docs/development/jobs/getting-started.html +11 -11
- nautobot/project-static/docs/development/jobs/index.html +11 -11
- nautobot/project-static/docs/development/jobs/installation.html +11 -11
- nautobot/project-static/docs/development/jobs/job-extensions.html +11 -11
- nautobot/project-static/docs/development/jobs/job-logging.html +11 -11
- nautobot/project-static/docs/development/jobs/job-patterns.html +11 -11
- nautobot/project-static/docs/development/jobs/job-structure.html +11 -11
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +11 -11
- nautobot/project-static/docs/development/jobs/testing.html +11 -11
- nautobot/project-static/docs/index.html +11 -11
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +11 -11
- nautobot/project-static/docs/overview/design_philosophy.html +11 -11
- nautobot/project-static/docs/release-notes/index.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.0.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.1.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.2.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.3.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.4.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.5.html +11 -11
- nautobot/project-static/docs/release-notes/version-1.6.html +11 -11
- nautobot/project-static/docs/release-notes/version-2.0.html +11 -11
- nautobot/project-static/docs/release-notes/version-2.1.html +11 -11
- nautobot/project-static/docs/release-notes/version-2.2.html +11 -11
- nautobot/project-static/docs/release-notes/version-2.3.html +11 -11
- nautobot/project-static/docs/release-notes/version-2.4.html +418 -11
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +300 -300
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +11 -11
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +11 -11
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +11 -11
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +11 -11
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +11 -11
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +38 -11
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +89 -14
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +11 -11
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/index.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +11 -11
- nautobot/project-static/docs/user-guide/administration/installation/services.html +11 -11
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +11 -11
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +11 -11
- nautobot/project-static/docs/user-guide/administration/security/index.html +11 -11
- nautobot/project-static/docs/user-guide/administration/security/notices.html +11 -11
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +11 -11
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +11 -11
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +11 -11
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +11 -11
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +11 -11
- nautobot/project-static/docs/user-guide/index.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +11 -11
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +11 -11
- nautobot/project-static/img/nautobot_icon.svg +32 -34
- nautobot/project-static/js/table_sorting_indicator.js +0 -2
- nautobot/tenancy/templates/tenancy/tenant.html +1 -7
- nautobot/tenancy/views.py +13 -0
- nautobot/users/templates/users/api_tokens.html +4 -4
- nautobot/users/templates/users/base.html +28 -28
- nautobot/virtualization/templates/virtualization/cluster.html +64 -64
- nautobot/virtualization/templates/virtualization/inc/virtualmachine_vminterface_filter.html +8 -0
- nautobot/virtualization/templates/virtualization/virtualmachine_component_add.html +25 -25
- nautobot/virtualization/templates/virtualization/virtualmachine_retrieve.html +1 -251
- nautobot/virtualization/templates/virtualization/vminterface.html +70 -70
- nautobot/virtualization/urls.py +0 -12
- nautobot/virtualization/views.py +158 -54
- nautobot/wireless/templates/wireless/wirelessnetwork_create.html +13 -13
- nautobot/wireless/tests/integration/test_radio_profile.py +1 -1
- {nautobot-2.4.17.dist-info → nautobot-2.4.19.dist-info}/METADATA +4 -4
- {nautobot-2.4.17.dist-info → nautobot-2.4.19.dist-info}/RECORD +623 -607
- nautobot/core/templates/inc/breadcrumbs.html +0 -14
- nautobot/ipam/templates/ipam/prefix_ipaddresses.html +0 -11
- nautobot/ipam/templates/ipam/prefix_prefixes.html +0 -11
- nautobot/project-static/docs/requirements.txt +0 -14
- {nautobot-2.4.17.dist-info → nautobot-2.4.19.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.17.dist-info → nautobot-2.4.19.dist-info}/NOTICE +0 -0
- {nautobot-2.4.17.dist-info → nautobot-2.4.19.dist-info}/WHEEL +0 -0
- {nautobot-2.4.17.dist-info → nautobot-2.4.19.dist-info}/entry_points.txt +0 -0
nautobot/core/views/mixins.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional, Type, Union
|
|
3
3
|
|
|
4
4
|
from django.contrib import messages
|
|
5
5
|
from django.contrib.auth.mixins import AccessMixin
|
|
@@ -12,7 +12,7 @@ from django.core.exceptions import (
|
|
|
12
12
|
ValidationError,
|
|
13
13
|
)
|
|
14
14
|
from django.db import transaction
|
|
15
|
-
from django.db.models import ManyToManyField, ProtectedError, Q
|
|
15
|
+
from django.db.models import ManyToManyField, Model, ProtectedError, Q
|
|
16
16
|
from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput
|
|
17
17
|
from django.http import HttpResponse
|
|
18
18
|
from django.shortcuts import get_object_or_404, redirect
|
|
@@ -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
|
|
47
|
-
from nautobot.core.utils.requests import
|
|
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,
|
|
@@ -217,10 +220,152 @@ class GetReturnURLMixin:
|
|
|
217
220
|
return reverse("home")
|
|
218
221
|
|
|
219
222
|
|
|
223
|
+
class UIComponentsMixin:
|
|
224
|
+
"""
|
|
225
|
+
Mixin that resolves UI components (e.g., breadcrumbs, titles) either from:
|
|
226
|
+
1) the current view class (preferred),
|
|
227
|
+
2) a related view class for a given model (via `lookup.get_view_for_model()`),
|
|
228
|
+
3) or a default component class.
|
|
229
|
+
|
|
230
|
+
The public helpers (`get_view_titles()`, `get_breadcrumbs()`) return concrete
|
|
231
|
+
component *instances* ready to use in renderers/templates.
|
|
232
|
+
|
|
233
|
+
It should be used in views that use the `nautobot.apps.views.GenericView` and standard Nautobot templates.
|
|
234
|
+
|
|
235
|
+
Example usage:
|
|
236
|
+
```
|
|
237
|
+
def get(self, request, *args, **kwargs):
|
|
238
|
+
context = {
|
|
239
|
+
...
|
|
240
|
+
"breadcrumbs": self.get_breadcrumbs(model),
|
|
241
|
+
}
|
|
242
|
+
context["title"] = self.get_view_titles(model).render(context)
|
|
243
|
+
|
|
244
|
+
return render(
|
|
245
|
+
request,
|
|
246
|
+
"extras/plugins_list.html",
|
|
247
|
+
context,
|
|
248
|
+
)
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Attributes:
|
|
252
|
+
breadcrumbs (ClassVar[Optional[Breadcrumbs]]): Optional component declared on the view class. May be:
|
|
253
|
+
- `None` (no local definition, fall back),
|
|
254
|
+
- a component *class* (will be instantiated),
|
|
255
|
+
- or a pre-instantiated component (returned as-is).
|
|
256
|
+
view_titles (ClassVar[Optional[Titles]]): Same contract as `breadcrumbs`,
|
|
257
|
+
but for titles.
|
|
258
|
+
"""
|
|
259
|
+
|
|
260
|
+
breadcrumbs: ClassVar[Optional[Breadcrumbs]] = None
|
|
261
|
+
view_titles: ClassVar[Optional[Titles]] = None
|
|
262
|
+
|
|
263
|
+
def get_view_titles(self, model: Union[None, str, Type[Model], Model] = None, view_type: str = "List") -> Titles:
|
|
264
|
+
"""
|
|
265
|
+
Resolve and return the `Titles` component instance.
|
|
266
|
+
|
|
267
|
+
Resolution order:
|
|
268
|
+
1) If `self.view_titles` is set on the current view, use it.
|
|
269
|
+
2) Else, if `model` is provided, copy the `view_titles` from the view
|
|
270
|
+
class associated with that model via `lookup.get_view_for_model(model, action)`.
|
|
271
|
+
3) Else, instantiate and return the default `Titles()`.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
model: A Django model **class**, **instance**, dotted name string, or `None`.
|
|
275
|
+
Passed to `lookup.get_view_for_model()` to find the related view class.
|
|
276
|
+
If `None`, only local/default resolution is used.
|
|
277
|
+
view_type: Logical view type used by `lookup.get_view_for_model()` (e.g., `"List"` or empty to construct `"DeviceView"` string).
|
|
278
|
+
|
|
279
|
+
Returns:
|
|
280
|
+
Titles: A concrete `Titles` component instance ready to use.
|
|
281
|
+
"""
|
|
282
|
+
return self._resolve_component("view_titles", Titles, model, view_type)
|
|
283
|
+
|
|
284
|
+
def get_breadcrumbs(
|
|
285
|
+
self, model: Union[None, str, Type[Model], Model] = None, view_type: str = "List"
|
|
286
|
+
) -> Breadcrumbs:
|
|
287
|
+
"""
|
|
288
|
+
Resolve and return the `Breadcrumbs` component instance.
|
|
289
|
+
|
|
290
|
+
Resolution order mirrors `get_view_titles()`:
|
|
291
|
+
1) Use `self.breadcrumbs` if set locally.
|
|
292
|
+
2) Else, if `model` is provided, copy the `breadcrumbs` from the view
|
|
293
|
+
class associated with that model via `lookup.get_view_for_model(model, action)`.
|
|
294
|
+
3) Else return a new default `Breadcrumbs()`.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
model: A Django model **class**, **instance**, dotted name string, or `None`.
|
|
298
|
+
Passed to `lookup.get_view_for_model()` to find the related view class.
|
|
299
|
+
If `None`, only local/default resolution is used.
|
|
300
|
+
view_type: Logical view type used by `lookup.get_view_for_model()` (e.g., `"List"` or empty to construct `"DeviceView"` string).
|
|
301
|
+
|
|
302
|
+
Returns:
|
|
303
|
+
Breadcrumbs: A concrete `Breadcrumbs` component instance.
|
|
304
|
+
"""
|
|
305
|
+
return self._resolve_component("breadcrumbs", Breadcrumbs, model, view_type)
|
|
306
|
+
|
|
307
|
+
def _resolve_component(
|
|
308
|
+
self,
|
|
309
|
+
attr_name: str,
|
|
310
|
+
default_cls: Type[Union[Breadcrumbs, Titles]],
|
|
311
|
+
model: Union[None, str, Type[Model], Model] = None,
|
|
312
|
+
view_type: str = "List",
|
|
313
|
+
) -> Union[Breadcrumbs, Titles]:
|
|
314
|
+
"""
|
|
315
|
+
Resolve a UI component by name.
|
|
316
|
+
|
|
317
|
+
Return local view's attribute defined via `attr_name` or
|
|
318
|
+
the `attr_name` defined on the view class for model via lookup.get_view_for_model(model, view_type) or
|
|
319
|
+
instantiates `default_cls`.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
attr_name (str): Attribute to resolve (e.g., "breadcrumbs").
|
|
323
|
+
default_cls: Default Breadcrumbs/Title class to instantiate if not found.
|
|
324
|
+
model (Union[None, str, Type[Model], Model]): Django model (class/instance/dotted string) to locate a related view class.
|
|
325
|
+
view_type (str): View type for lookup (e.g., "List", or empty to resolve like "DeviceView").
|
|
326
|
+
Returns:
|
|
327
|
+
Breadcrumbs/Title instance.
|
|
328
|
+
"""
|
|
329
|
+
local = getattr(self, attr_name, None)
|
|
330
|
+
if local is not None:
|
|
331
|
+
return self._instantiate_if_needed(local, default_cls)
|
|
332
|
+
|
|
333
|
+
if model is not None:
|
|
334
|
+
view_class = lookup.get_view_for_model(model, view_type)
|
|
335
|
+
view_component = getattr(view_class, attr_name, None)
|
|
336
|
+
return self._instantiate_if_needed(view_component, default_cls)
|
|
337
|
+
|
|
338
|
+
return default_cls()
|
|
339
|
+
|
|
340
|
+
@staticmethod
|
|
341
|
+
def _instantiate_if_needed(
|
|
342
|
+
attr: Union[None, Type[Union[Breadcrumbs, Titles]], Breadcrumbs, Titles],
|
|
343
|
+
default_cls: Type[Union[Breadcrumbs, Titles]],
|
|
344
|
+
) -> Union[Breadcrumbs, Titles]:
|
|
345
|
+
"""
|
|
346
|
+
Normalize a value into a component instance.
|
|
347
|
+
|
|
348
|
+
If attr is None - return default_cls().
|
|
349
|
+
If attr is a class - instantiate it.
|
|
350
|
+
Otherwise, return as is.
|
|
351
|
+
|
|
352
|
+
Args:
|
|
353
|
+
attr: None, a Breadcrumbs/Title class or an instance.
|
|
354
|
+
default_cls: Fallback class to instantiate when attr is None.
|
|
355
|
+
Returns:
|
|
356
|
+
Breadcrumbs/Title instance.
|
|
357
|
+
"""
|
|
358
|
+
if attr is None:
|
|
359
|
+
return default_cls()
|
|
360
|
+
if isinstance(attr, type):
|
|
361
|
+
return attr()
|
|
362
|
+
return attr
|
|
363
|
+
|
|
364
|
+
|
|
220
365
|
@extend_schema(exclude=True)
|
|
221
|
-
class NautobotViewSetMixin(GenericViewSet, AccessMixin, GetReturnURLMixin, FormView):
|
|
366
|
+
class NautobotViewSetMixin(GenericViewSet, UIComponentsMixin, AccessMixin, GetReturnURLMixin, FormView):
|
|
222
367
|
"""
|
|
223
|
-
NautobotViewSetMixin is an aggregation of various mixins from DRF, Django and Nautobot to
|
|
368
|
+
NautobotViewSetMixin is an aggregation of various mixins from DRF, Django and Nautobot to achieve the desired behavior pattern for NautobotUIViewSet
|
|
224
369
|
"""
|
|
225
370
|
|
|
226
371
|
renderer_classes = [NautobotHTMLRenderer]
|
|
@@ -244,14 +389,6 @@ class NautobotViewSetMixin(GenericViewSet, AccessMixin, GetReturnURLMixin, FormV
|
|
|
244
389
|
# custom view attributes used for permission checks and handling
|
|
245
390
|
custom_view_base_action = None
|
|
246
391
|
custom_view_additional_permissions = None
|
|
247
|
-
view_titles = None
|
|
248
|
-
breadcrumbs = None
|
|
249
|
-
|
|
250
|
-
def get_view_titles(self):
|
|
251
|
-
return self.instantiate_if_needed(self.view_titles, Titles)
|
|
252
|
-
|
|
253
|
-
def get_breadcrumbs(self):
|
|
254
|
-
return self.instantiate_if_needed(self.breadcrumbs, Breadcrumbs)
|
|
255
392
|
|
|
256
393
|
@staticmethod
|
|
257
394
|
def instantiate_if_needed(attr, default_cls):
|
|
@@ -537,13 +674,16 @@ class NautobotViewSetMixin(GenericViewSet, AccessMixin, GetReturnURLMixin, FormV
|
|
|
537
674
|
def get_extra_context(self, request, instance=None):
|
|
538
675
|
"""
|
|
539
676
|
Return any additional context data for the template.
|
|
540
|
-
|
|
541
|
-
|
|
677
|
+
|
|
678
|
+
Args:
|
|
679
|
+
request (Request): The current request
|
|
680
|
+
instance (Model, optional): The specific object being viewed, if any
|
|
542
681
|
"""
|
|
543
682
|
if instance is not None:
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
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)}
|
|
547
687
|
return {}
|
|
548
688
|
|
|
549
689
|
def get_template_name(self):
|
|
@@ -979,60 +1119,14 @@ class BulkEditAndBulkDeleteModelMixin:
|
|
|
979
1119
|
|
|
980
1120
|
logger = logging.getLogger(__name__)
|
|
981
1121
|
|
|
982
|
-
def
|
|
983
|
-
"""
|
|
984
|
-
Retrieve the queryset of model instances to be bulk-deleted or bulk-deleted, filtered based on request parameters.
|
|
985
|
-
|
|
986
|
-
This method handles the retrieval of a queryset of model instances that match the specified
|
|
987
|
-
filter criteria in the request parameters, allowing a bulk delete operation to be performed
|
|
988
|
-
on all matching instances.
|
|
989
|
-
"""
|
|
990
|
-
model = self.queryset.model
|
|
991
|
-
|
|
992
|
-
# This Mixin is currently been used by both NautobotUIViewSet ObjectBulkDestroyViewMixin, ObjectBulkUpdateViewMixin
|
|
993
|
-
# BulkEditView, and BulkDeleteView which uses different keys for accessing filterset
|
|
994
|
-
filterset_class = getattr(self, "filterset", None)
|
|
995
|
-
if filterset_class is None:
|
|
996
|
-
filterset_class = getattr(self, "filterset_class", None)
|
|
997
|
-
|
|
998
|
-
if request.GET and filterset_class is not None:
|
|
999
|
-
queryset = filterset_class(request.GET, model.objects.all()).qs # pylint: disable=not-callable
|
|
1000
|
-
# We take this approach because filterset.qs has already applied .distinct(),
|
|
1001
|
-
# and performing a .delete directly on a queryset with .distinct applied is not allowed.
|
|
1002
|
-
queryset = self.queryset.filter(pk__in=queryset)
|
|
1003
|
-
else:
|
|
1004
|
-
queryset = model.objects.all()
|
|
1005
|
-
return queryset
|
|
1006
|
-
|
|
1007
|
-
def send_bulk_delete_objects_to_job(self, request, pk_list, model, delete_all):
|
|
1122
|
+
def send_bulk_delete_objects_to_job(self, request):
|
|
1008
1123
|
"""Prepare and enqueue bulk delete job."""
|
|
1009
|
-
|
|
1124
|
+
from nautobot.core.jobs import BulkDeleteObjects
|
|
1010
1125
|
|
|
1011
|
-
|
|
1012
|
-
filter_query_params = normalize_querydict(request.GET, filterset=filterset_class())
|
|
1013
|
-
else:
|
|
1014
|
-
filter_query_params = {}
|
|
1015
|
-
|
|
1016
|
-
# Discarding non-filter query params
|
|
1017
|
-
new_filter_query_params = {}
|
|
1018
|
-
|
|
1019
|
-
for key, value in filter_query_params.items():
|
|
1020
|
-
try:
|
|
1021
|
-
filtering.get_filterset_field(filterset_class(), key)
|
|
1022
|
-
new_filter_query_params[key] = value
|
|
1023
|
-
except core_exceptions.FilterSetFieldNotFound:
|
|
1024
|
-
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)
|
|
1025
1127
|
|
|
1026
|
-
|
|
1128
|
+
job_form = BulkDeleteObjects.as_form(data={**self.key_params})
|
|
1027
1129
|
|
|
1028
|
-
job_form = BulkDeleteObjects.as_form(
|
|
1029
|
-
data={
|
|
1030
|
-
"pk_list": pk_list,
|
|
1031
|
-
"content_type": ContentType.objects.get_for_model(model),
|
|
1032
|
-
"delete_all": delete_all,
|
|
1033
|
-
"filter_query_params": filter_query_params,
|
|
1034
|
-
}
|
|
1035
|
-
)
|
|
1036
1130
|
# BulkDeleteObjects job form cannot be invalid; Hence no handling of invalid case.
|
|
1037
1131
|
job_form.is_valid()
|
|
1038
1132
|
job_kwargs = BulkDeleteObjects.prepare_job_kwargs(job_form.cleaned_data)
|
|
@@ -1043,39 +1137,18 @@ class BulkEditAndBulkDeleteModelMixin:
|
|
|
1043
1137
|
)
|
|
1044
1138
|
return redirect("extras:jobresult", pk=job_result.pk)
|
|
1045
1139
|
|
|
1046
|
-
def send_bulk_edit_objects_to_job(self, request, form_data
|
|
1140
|
+
def send_bulk_edit_objects_to_job(self, request, form_data):
|
|
1047
1141
|
"""Prepare and enqueue a bulk edit job."""
|
|
1048
|
-
|
|
1049
|
-
if filterset_class := lookup.get_filterset_for_model(model):
|
|
1050
|
-
filter_query_params = normalize_querydict(request.GET, filterset=filterset_class())
|
|
1051
|
-
else:
|
|
1052
|
-
filter_query_params = {}
|
|
1053
|
-
|
|
1054
|
-
# Discarding non-filter query params
|
|
1055
|
-
new_filter_query_params = {}
|
|
1142
|
+
from nautobot.core.jobs import BulkEditObjects
|
|
1056
1143
|
|
|
1057
|
-
|
|
1058
|
-
try:
|
|
1059
|
-
filtering.get_filterset_field(filterset_class(), key)
|
|
1060
|
-
new_filter_query_params[key] = value
|
|
1061
|
-
except core_exceptions.FilterSetFieldNotFound:
|
|
1062
|
-
self.logger.debug(f"Query parameter `{key}` not found in `{filterset_class}`, discarding it")
|
|
1063
|
-
|
|
1064
|
-
filter_query_params = new_filter_query_params
|
|
1144
|
+
job_model = Job.objects.get_for_class_path(BulkEditObjects.class_path)
|
|
1065
1145
|
|
|
1066
1146
|
if nullified_fields := request.POST.getlist("_nullify"):
|
|
1067
1147
|
form_data["_nullify"] = nullified_fields
|
|
1068
1148
|
else:
|
|
1069
1149
|
form_data["_nullify"] = []
|
|
1070
1150
|
|
|
1071
|
-
job_form = BulkEditObjects.as_form(
|
|
1072
|
-
data={
|
|
1073
|
-
"form_data": form_data,
|
|
1074
|
-
"content_type": ContentType.objects.get_for_model(model),
|
|
1075
|
-
"edit_all": request.POST.get("_all") is not None,
|
|
1076
|
-
"filter_query_params": filter_query_params,
|
|
1077
|
-
}
|
|
1078
|
-
)
|
|
1151
|
+
job_form = BulkEditObjects.as_form(data={"form_data": form_data, **self.key_params})
|
|
1079
1152
|
# NOTE: BulkEditObjects cant be invalid, so there is no need for handling invalid error
|
|
1080
1153
|
job_form.is_valid()
|
|
1081
1154
|
job_kwargs = BulkEditObjects.prepare_job_kwargs(job_form.cleaned_data)
|
|
@@ -1094,17 +1167,25 @@ class ObjectBulkDestroyViewMixin(NautobotViewSetMixin, BulkDestroyModelMixin, Bu
|
|
|
1094
1167
|
|
|
1095
1168
|
bulk_destroy_form_class: Optional[type[Form]] = None
|
|
1096
1169
|
filterset_class: Optional[type[FilterSet]] = None
|
|
1170
|
+
logger = logging.getLogger(__name__)
|
|
1097
1171
|
|
|
1098
1172
|
def _process_bulk_destroy_form(self, form):
|
|
1099
1173
|
request = self.request
|
|
1100
|
-
pk_list = self.pk_list
|
|
1101
1174
|
queryset = self.get_queryset()
|
|
1102
1175
|
model = queryset.model
|
|
1103
1176
|
# Delete objects
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
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)
|
|
1108
1189
|
|
|
1109
1190
|
try:
|
|
1110
1191
|
with transaction.atomic():
|
|
@@ -1133,21 +1214,26 @@ class ObjectBulkDestroyViewMixin(NautobotViewSetMixin, BulkDestroyModelMixin, Bu
|
|
|
1133
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.
|
|
1134
1215
|
"""
|
|
1135
1216
|
queryset = self.get_queryset()
|
|
1217
|
+
model = queryset.model
|
|
1218
|
+
self.pk_list = list(request.POST.getlist("pk"))
|
|
1136
1219
|
delete_all = bool(request.POST.get("_all"))
|
|
1220
|
+
saved_view_id = request.GET.get("saved_view", "")
|
|
1137
1221
|
data = {}
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
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)
|
|
1145
1231
|
|
|
1146
1232
|
if "_confirm" in request.POST:
|
|
1147
1233
|
form_class = self.get_form_class(**kwargs)
|
|
1148
1234
|
form = form_class(request.POST, initial=normalize_querydict(request.GET, form_class=form_class))
|
|
1149
1235
|
if form.is_valid():
|
|
1150
|
-
return self.send_bulk_delete_objects_to_job(request
|
|
1236
|
+
return self.send_bulk_delete_objects_to_job(request)
|
|
1151
1237
|
else:
|
|
1152
1238
|
return self.form_invalid(form)
|
|
1153
1239
|
table = None
|
|
@@ -1234,12 +1320,25 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
|
|
|
1234
1320
|
"""
|
|
1235
1321
|
|
|
1236
1322
|
filterset_class: ClassVar[Optional[type[FilterSet]]] = None
|
|
1323
|
+
logger = logging.getLogger(__name__)
|
|
1237
1324
|
|
|
1238
1325
|
# NOTE: Performing BulkEdit Objects has been moved to a system job, but the logic remains here to ensure backward compatibility.
|
|
1239
1326
|
def _process_bulk_update_form(self, form):
|
|
1240
1327
|
request = self.request
|
|
1328
|
+
self.pk_list = list(request.POST.getlist("pk"))
|
|
1241
1329
|
queryset = self.get_queryset()
|
|
1242
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
|
+
|
|
1243
1342
|
form_custom_fields = getattr(form, "custom_fields", [])
|
|
1244
1343
|
form_relationships = getattr(form, "relationships", [])
|
|
1245
1344
|
# Standard fields are those that are intrinsic to self.model in the form
|
|
@@ -1251,14 +1350,12 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
|
|
|
1251
1350
|
if field not in form_custom_fields + form_relationships + ["pk"] + ["object_note"]
|
|
1252
1351
|
]
|
|
1253
1352
|
nullified_fields = request.POST.getlist("_nullify") or []
|
|
1353
|
+
|
|
1254
1354
|
with deferred_change_logging_for_bulk_operation():
|
|
1255
1355
|
updated_objects = []
|
|
1256
|
-
edit_all = self.request.POST.get("_all")
|
|
1257
1356
|
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
else:
|
|
1261
|
-
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
|
+
|
|
1262
1359
|
for obj in queryset:
|
|
1263
1360
|
self.obj = obj
|
|
1264
1361
|
# Update standard fields. If a field is listed in _nullify, delete its value.
|
|
@@ -1330,14 +1427,21 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
|
|
|
1330
1427
|
request.POST "_edit": Function to render the user selection of objects in a table form/BulkUpdateForm via Response that is passed to NautobotHTMLRenderer.
|
|
1331
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.
|
|
1332
1429
|
"""
|
|
1333
|
-
|
|
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
|
+
}
|
|
1334
1443
|
|
|
1335
|
-
|
|
1336
|
-
self.pk_list = None
|
|
1337
|
-
queryset = self._get_bulk_edit_delete_all_queryset(request)
|
|
1338
|
-
else:
|
|
1339
|
-
self.pk_list = list(request.POST.getlist("pk"))
|
|
1340
|
-
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)
|
|
1341
1445
|
|
|
1342
1446
|
data = {}
|
|
1343
1447
|
form_class = self.get_form_class()
|
|
@@ -1346,7 +1450,7 @@ class ObjectBulkUpdateViewMixin(NautobotViewSetMixin, BulkUpdateModelMixin, Bulk
|
|
|
1346
1450
|
form = form_class(queryset.model, request.POST, edit_all=edit_all)
|
|
1347
1451
|
restrict_form_fields(form, request.user)
|
|
1348
1452
|
if form.is_valid():
|
|
1349
|
-
return self.send_bulk_edit_objects_to_job(
|
|
1453
|
+
return self.send_bulk_edit_objects_to_job(request, form.cleaned_data)
|
|
1350
1454
|
else:
|
|
1351
1455
|
return self.form_invalid(form)
|
|
1352
1456
|
table = None
|