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.
- nautobot/apps/ui.py +6 -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/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 +7 -7
- nautobot/circuits/templates/circuits/providernetwork_retrieve.html +1 -3
- nautobot/circuits/views.py +26 -9
- 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/graphql/generators.py +5 -2
- nautobot/core/jobs/bulk_actions.py +48 -85
- nautobot/core/models/querysets.py +2 -1
- 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 +5 -5
- 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_import.html +33 -33
- nautobot/core/templates/generic/object_list.html +267 -267
- nautobot/core/templates/generic/object_retrieve.html +261 -261
- 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 +1 -1
- nautobot/core/testing/integration.py +7 -4
- nautobot/core/testing/views.py +24 -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_ui.py +175 -1
- nautobot/core/tests/test_utils.py +35 -0
- nautobot/core/tests/test_views_generic.py +43 -0
- nautobot/core/tests/test_views_utils.py +239 -5
- nautobot/core/ui/breadcrumbs.py +208 -21
- nautobot/core/ui/bulk_buttons.py +8 -0
- nautobot/core/ui/object_detail.py +138 -55
- nautobot/core/ui/titles.py +1 -0
- nautobot/core/utils/requests.py +27 -2
- nautobot/core/views/generic.py +41 -31
- nautobot/core/views/mixins.py +80 -110
- nautobot/core/views/utils.py +153 -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 +26 -1
- nautobot/dcim/models/racks.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 -104
- 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_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 +85 -85
- 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/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 +148 -4
- nautobot/dcim/ui.py +29 -0
- nautobot/dcim/urls.py +1 -109
- nautobot/dcim/utils.py +30 -0
- nautobot/dcim/views.py +1009 -531
- nautobot/extras/tables.py +20 -0
- 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_update.html +23 -23
- nautobot/extras/templates/extras/dynamicgroup_retrieve.html +38 -38
- nautobot/extras/templates/extras/dynamicgroup_update.html +62 -62
- nautobot/extras/templates/extras/gitrepository_list.html +10 -10
- nautobot/extras/templates/extras/gitrepository_retrieve.html +68 -68
- 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/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 +41 -41
- nautobot/extras/templates/extras/plugins_list.html +9 -9
- 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_filters.py +1 -1
- nautobot/extras/tests/test_jobs.py +2 -0
- nautobot/extras/tests/test_views.py +3 -3
- nautobot/extras/urls.py +1 -3
- nautobot/extras/views.py +101 -27
- 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/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 -107
- 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_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/views.py +219 -106
- 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 +11 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +2174 -1226
- 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 +72 -27
- 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 +11 -11
- 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 -48
- 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 +11 -11
- 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 +196 -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 +11 -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/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.18.dist-info → nautobot-2.4.19.dist-info}/METADATA +1 -1
- {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/RECORD +581 -570
- nautobot/ipam/templates/ipam/prefix_ipaddresses.html +0 -11
- nautobot/ipam/templates/ipam/prefix_prefixes.html +0 -11
- {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/NOTICE +0 -0
- {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/WHEEL +0 -0
- {nautobot-2.4.18.dist-info → nautobot-2.4.19.dist-info}/entry_points.txt +0 -0
nautobot/core/views/generic.py
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
"""
|
nautobot/core/views/mixins.py
CHANGED
|
@@ -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,
|
|
@@ -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
|
-
|
|
675
|
-
|
|
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
|
-
|
|
679
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1140
|
+
def send_bulk_edit_objects_to_job(self, request, form_data):
|
|
1181
1141
|
"""Prepare and enqueue a bulk edit job."""
|
|
1182
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
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
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
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
|
|
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
|
-
|
|
1393
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|