nautobot 2.4.0__py3-none-any.whl → 2.4.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/apps/__init__.py +1 -1
- nautobot/apps/api.py +8 -8
- nautobot/apps/change_logging.py +2 -2
- nautobot/apps/choices.py +4 -4
- nautobot/apps/events.py +3 -3
- nautobot/apps/factory.py +2 -2
- nautobot/apps/filters.py +1 -1
- nautobot/apps/forms.py +20 -20
- nautobot/apps/graphql.py +2 -2
- nautobot/apps/jobs.py +8 -8
- nautobot/apps/models.py +19 -19
- nautobot/apps/tables.py +1 -1
- nautobot/apps/testing.py +10 -10
- nautobot/apps/ui.py +2 -2
- nautobot/apps/utils.py +7 -7
- nautobot/apps/views.py +7 -7
- nautobot/circuits/api/serializers.py +0 -1
- nautobot/circuits/api/views.py +8 -4
- nautobot/circuits/tables.py +1 -2
- nautobot/circuits/templates/circuits/circuit_create.html +7 -1
- nautobot/circuits/views.py +3 -3
- nautobot/cloud/api/views.py +10 -6
- nautobot/cloud/models.py +1 -1
- nautobot/cloud/views.py +16 -0
- nautobot/core/api/fields.py +5 -5
- nautobot/core/api/filter_backends.py +9 -3
- nautobot/core/api/schema.py +2 -13
- nautobot/core/api/serializers.py +34 -40
- nautobot/core/api/views.py +4 -56
- nautobot/core/celery/log.py +4 -4
- nautobot/core/celery/schedulers.py +1 -1
- nautobot/core/choices.py +2 -2
- nautobot/core/events/__init__.py +3 -3
- nautobot/core/filters.py +16 -21
- nautobot/core/fixtures/user-data.json +59 -0
- nautobot/core/forms/__init__.py +19 -19
- nautobot/core/forms/fields.py +11 -14
- nautobot/core/forms/forms.py +2 -33
- nautobot/core/graphql/types.py +1 -1
- nautobot/core/jobs/__init__.py +7 -28
- nautobot/core/jobs/cleanup.py +12 -48
- nautobot/core/jobs/groups.py +1 -1
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/models/__init__.py +1 -1
- nautobot/core/models/query_functions.py +2 -2
- nautobot/core/models/tree_queries.py +3 -6
- nautobot/core/settings.py +2 -29
- nautobot/core/settings.yaml +0 -21
- nautobot/core/tables.py +60 -74
- nautobot/core/templates/inc/media.html +0 -3
- nautobot/core/templates/inc/nav_menu.html +0 -1
- nautobot/core/templates/nautobot_config.py.j2 +0 -13
- nautobot/core/templates/search.html +0 -7
- nautobot/core/templates/utilities/render_jinja2.html +1 -1
- nautobot/core/templates/utilities/templatetags/tag.html +1 -1
- nautobot/core/templates/utilities/theme_preview.html +0 -7
- nautobot/core/templatetags/helpers.py +2 -11
- nautobot/core/testing/__init__.py +8 -8
- nautobot/core/testing/api.py +15 -170
- nautobot/core/testing/filters.py +2 -25
- nautobot/core/testing/forms.py +0 -2
- nautobot/core/testing/mixins.py +2 -7
- nautobot/core/testing/views.py +29 -44
- nautobot/core/tests/integration/test_app_home.py +1 -0
- nautobot/core/tests/integration/test_app_navbar.py +1 -0
- nautobot/core/tests/integration/test_filters.py +2 -0
- nautobot/core/tests/integration/test_home.py +1 -0
- nautobot/core/tests/integration/test_navbar.py +1 -0
- nautobot/core/tests/integration/test_view_authentication.py +0 -1
- nautobot/core/tests/runner.py +1 -1
- nautobot/core/tests/test_api.py +1 -98
- nautobot/core/tests/test_csv.py +3 -25
- nautobot/core/tests/test_forms.py +0 -1
- nautobot/core/tests/test_jobs.py +1 -303
- nautobot/core/tests/test_settings_schema.py +0 -7
- nautobot/core/tests/test_tables.py +0 -100
- nautobot/core/tests/test_utils.py +1 -63
- nautobot/core/tests/test_views.py +3 -30
- nautobot/core/ui/nav.py +0 -1
- nautobot/core/ui/object_detail.py +1 -15
- nautobot/core/urls.py +0 -11
- nautobot/core/utils/lookup.py +8 -11
- nautobot/core/utils/requests.py +9 -24
- nautobot/core/views/__init__.py +0 -42
- nautobot/core/views/generic.py +176 -78
- nautobot/core/views/mixins.py +34 -94
- nautobot/core/views/renderers.py +6 -6
- nautobot/dcim/api/serializers.py +62 -54
- nautobot/dcim/api/views.py +113 -47
- nautobot/dcim/filters/__init__.py +2 -31
- nautobot/dcim/forms.py +17 -36
- nautobot/dcim/graphql/types.py +2 -2
- nautobot/dcim/models/__init__.py +1 -1
- nautobot/dcim/models/device_component_templates.py +2 -2
- nautobot/dcim/models/device_components.py +20 -22
- nautobot/dcim/models/devices.py +1 -10
- nautobot/dcim/models/locations.py +3 -3
- nautobot/dcim/models/power.py +5 -6
- nautobot/dcim/models/racks.py +4 -4
- nautobot/dcim/tables/__init__.py +3 -3
- nautobot/dcim/tables/devices.py +5 -7
- nautobot/dcim/tables/devicetypes.py +2 -2
- nautobot/dcim/tables/racks.py +1 -1
- nautobot/dcim/templates/dcim/controller_create.html +7 -1
- nautobot/dcim/templates/dcim/controller_retrieve.html +9 -1
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -2
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -5
- nautobot/dcim/templates/dcim/device.html +9 -1
- nautobot/dcim/templates/dcim/device_edit.html +37 -36
- nautobot/dcim/templates/dcim/location.html +9 -1
- nautobot/dcim/templates/dcim/location_edit.html +7 -1
- nautobot/dcim/templates/dcim/rack.html +9 -1
- nautobot/dcim/templates/dcim/rack_edit.html +7 -1
- nautobot/dcim/templates/dcim/rackreservation.html +9 -1
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +9 -1
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +7 -1
- nautobot/dcim/tests/test_api.py +3 -16
- nautobot/dcim/tests/test_filters.py +0 -33
- nautobot/dcim/tests/test_forms.py +2 -51
- nautobot/dcim/tests/test_graphql.py +0 -52
- nautobot/dcim/tests/test_models.py +5 -34
- nautobot/dcim/tests/test_views.py +83 -21
- nautobot/dcim/views.py +13 -1
- nautobot/extras/api/customfields.py +2 -2
- nautobot/extras/api/serializers.py +85 -90
- nautobot/extras/api/views.py +27 -22
- nautobot/extras/constants.py +0 -2
- nautobot/extras/filters/__init__.py +6 -8
- nautobot/extras/forms/base.py +2 -2
- nautobot/extras/forms/forms.py +31 -139
- nautobot/extras/forms/mixins.py +5 -13
- nautobot/extras/group_sync.py +3 -3
- nautobot/extras/health_checks.py +2 -1
- nautobot/extras/jobs.py +12 -70
- nautobot/extras/managers.py +1 -3
- nautobot/extras/migrations/0018_joblog_data_migration.py +9 -7
- nautobot/extras/models/__init__.py +1 -1
- nautobot/extras/models/contacts.py +1 -1
- nautobot/extras/models/customfields.py +11 -12
- nautobot/extras/models/groups.py +9 -11
- nautobot/extras/models/jobs.py +4 -23
- nautobot/extras/models/models.py +2 -2
- nautobot/extras/plugins/__init__.py +2 -13
- nautobot/extras/plugins/marketplace_manifest.yml +79 -84
- nautobot/extras/plugins/tables.py +14 -16
- nautobot/extras/plugins/views.py +69 -65
- nautobot/extras/registry.py +1 -1
- nautobot/extras/secrets/__init__.py +2 -2
- nautobot/extras/tables.py +5 -7
- nautobot/extras/templates/extras/dynamicgroup.html +9 -1
- nautobot/extras/templates/extras/job_detail.html +0 -16
- nautobot/extras/templates/extras/job_edit.html +0 -1
- nautobot/extras/templates/extras/jobqueue_retrieve.html +9 -1
- nautobot/extras/templates/extras/marketplace.html +11 -29
- nautobot/extras/templates/extras/plugin_detail.html +15 -32
- nautobot/extras/templates/extras/plugins_tiles.html +10 -21
- nautobot/extras/test_jobs/api_test_job.py +1 -1
- nautobot/extras/test_jobs/atomic_transaction.py +2 -2
- nautobot/extras/test_jobs/dry_run.py +1 -1
- nautobot/extras/test_jobs/fail.py +5 -5
- nautobot/extras/test_jobs/file_output.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -1
- nautobot/extras/test_jobs/file_upload_pass.py +1 -1
- nautobot/extras/test_jobs/ipaddress_vars.py +1 -3
- nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
- nautobot/extras/test_jobs/log_redaction.py +1 -1
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
- nautobot/extras/test_jobs/modify_db.py +1 -1
- nautobot/extras/test_jobs/object_var_optional.py +1 -1
- nautobot/extras/test_jobs/object_var_required.py +1 -1
- nautobot/extras/test_jobs/object_vars.py +1 -1
- nautobot/extras/test_jobs/pass.py +3 -3
- nautobot/extras/test_jobs/profiling.py +1 -1
- nautobot/extras/test_jobs/relative_import.py +3 -3
- nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
- nautobot/extras/test_jobs/task_queues.py +1 -1
- nautobot/extras/tests/integration/test_plugin_banner.py +2 -0
- nautobot/extras/tests/test_api.py +13 -13
- nautobot/extras/tests/test_customfields.py +1 -1
- nautobot/extras/tests/test_datasources.py +1 -2
- nautobot/extras/tests/test_dynamicgroups.py +1 -1
- nautobot/extras/tests/test_filters.py +6 -6
- nautobot/extras/tests/test_forms.py +1 -20
- nautobot/extras/tests/test_jobs.py +19 -160
- nautobot/extras/tests/test_models.py +10 -10
- nautobot/extras/tests/test_plugins.py +9 -62
- nautobot/extras/tests/test_relationships.py +9 -120
- nautobot/extras/tests/test_views.py +191 -52
- nautobot/extras/utils.py +2 -3
- nautobot/extras/views.py +98 -30
- nautobot/ipam/api/fields.py +3 -3
- nautobot/ipam/api/serializers.py +33 -41
- nautobot/ipam/api/views.py +117 -68
- nautobot/ipam/factory.py +1 -1
- nautobot/ipam/filters.py +2 -3
- nautobot/ipam/lookups.py +62 -101
- nautobot/ipam/models.py +16 -66
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +7 -23
- nautobot/ipam/templates/ipam/ipaddress.html +9 -1
- nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +7 -1
- nautobot/ipam/templates/ipam/ipaddress_edit.html +7 -1
- nautobot/ipam/templates/ipam/prefix.html +9 -1
- nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
- nautobot/ipam/templates/ipam/vlan.html +9 -1
- nautobot/ipam/templates/ipam/vlan_edit.html +7 -1
- nautobot/ipam/templates/ipam/vrf_edit.html +7 -1
- nautobot/ipam/tests/test_api.py +3 -416
- nautobot/ipam/tests/test_forms.py +47 -49
- nautobot/ipam/tests/test_migrations.py +30 -30
- nautobot/ipam/tests/test_models.py +34 -95
- nautobot/ipam/tests/test_querysets.py +1 -63
- nautobot/ipam/tests/test_views.py +0 -3
- nautobot/ipam/utils/__init__.py +6 -36
- nautobot/ipam/views.py +87 -61
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +2 -40
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
- nautobot/project-static/docs/404.html +4 -46
- nautobot/project-static/docs/apps/index.html +4 -46
- nautobot/project-static/docs/apps/nautobot-apps.html +6 -47
- nautobot/project-static/docs/assets/_mkdocstrings.css +1 -25
- nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js → bundle.83f73b43.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js.map → bundle.83f73b43.min.js.map} +2 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +10 -62
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +7 -59
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +122 -374
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +18 -90
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +21 -95
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +6 -53
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +5 -52
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +17 -79
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +28 -102
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +21 -108
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +38 -131
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +65 -239
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +165 -581
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +36 -109
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +167 -453
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +211 -493
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +8 -60
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +15 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +55 -407
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +205 -585
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +412 -858
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +7 -59
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +186 -448
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +147 -365
- nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -46
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +7 -68
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -46
- nautobot/project-static/docs/development/apps/api/prometheus.html +4 -46
- nautobot/project-static/docs/development/apps/api/setup.html +4 -46
- nautobot/project-static/docs/development/apps/api/testing.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/notes.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +6 -52
- nautobot/project-static/docs/development/apps/api/views/urls.html +4 -46
- nautobot/project-static/docs/development/apps/index.html +4 -46
- nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -46
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -46
- nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -46
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +8 -50
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -46
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +14 -211
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -46
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -46
- nautobot/project-static/docs/development/core/application-registry.html +4 -46
- nautobot/project-static/docs/development/core/best-practices.html +4 -46
- nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -46
- nautobot/project-static/docs/development/core/caching.html +4 -46
- nautobot/project-static/docs/development/core/controllers.html +4 -46
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +74 -73
- nautobot/project-static/docs/development/core/generic-views.html +4 -46
- nautobot/project-static/docs/development/core/getting-started.html +224 -249
- nautobot/project-static/docs/development/core/homepage.html +7 -49
- nautobot/project-static/docs/development/core/index.html +4 -46
- nautobot/project-static/docs/development/core/{minikube-dev-environment-for-k8s-jobs.html → local-k8s.html} +168 -469
- nautobot/project-static/docs/development/core/model-checklist.html +12 -56
- nautobot/project-static/docs/development/core/model-features.html +4 -46
- nautobot/project-static/docs/development/core/natural-keys.html +4 -46
- nautobot/project-static/docs/development/core/navigation-menu.html +4 -46
- nautobot/project-static/docs/development/core/release-checklist.html +7 -49
- nautobot/project-static/docs/development/core/role-internals.html +4 -46
- nautobot/project-static/docs/development/core/settings.html +4 -46
- nautobot/project-static/docs/development/core/style-guide.html +7 -49
- nautobot/project-static/docs/development/core/templates.html +4 -46
- nautobot/project-static/docs/development/core/testing.html +4 -46
- nautobot/project-static/docs/development/core/ui-component-framework.html +273 -369
- nautobot/project-static/docs/development/core/user-preferences.html +4 -46
- nautobot/project-static/docs/development/index.html +4 -46
- nautobot/project-static/docs/development/jobs/index.html +122 -216
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -46
- nautobot/project-static/docs/index.html +23 -54
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +7 -47
- nautobot/project-static/docs/overview/design_philosophy.html +4 -46
- nautobot/project-static/docs/release-notes/index.html +12 -52
- nautobot/project-static/docs/release-notes/version-1.0.html +193 -234
- nautobot/project-static/docs/release-notes/version-1.1.html +190 -231
- nautobot/project-static/docs/release-notes/version-1.2.html +265 -306
- nautobot/project-static/docs/release-notes/version-1.3.html +291 -332
- nautobot/project-static/docs/release-notes/version-1.4.html +377 -417
- nautobot/project-static/docs/release-notes/version-1.5.html +566 -605
- nautobot/project-static/docs/release-notes/version-1.6.html +447 -904
- nautobot/project-static/docs/release-notes/version-2.0.html +489 -528
- nautobot/project-static/docs/release-notes/version-2.1.html +324 -363
- nautobot/project-static/docs/release-notes/version-2.2.html +317 -356
- nautobot/project-static/docs/release-notes/version-2.3.html +352 -997
- nautobot/project-static/docs/release-notes/version-2.4.html +101 -417
- nautobot/project-static/docs/requirements.txt +2 -2
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +287 -295
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +6 -48
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +8 -110
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +6 -48
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +8 -66
- nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +5 -47
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -46
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -46
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -46
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -46
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +8 -49
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +12 -50
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +7 -49
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +7 -51
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +7 -49
- nautobot/project-static/docs/user-guide/index.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +8 -50
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +7 -50
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +7 -49
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +5 -47
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +25 -94
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +5 -74
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -46
- nautobot/project-static/js/forms.js +1 -1
- nautobot/tenancy/api/views.py +13 -9
- nautobot/tenancy/views.py +2 -4
- nautobot/users/admin.py +1 -1
- nautobot/users/api/serializers.py +4 -5
- nautobot/users/api/views.py +3 -3
- nautobot/virtualization/api/serializers.py +4 -4
- nautobot/virtualization/api/views.py +24 -5
- nautobot/virtualization/filters.py +3 -20
- nautobot/virtualization/models.py +1 -1
- nautobot/virtualization/tables.py +2 -2
- nautobot/virtualization/templates/virtualization/cluster_edit.html +7 -1
- nautobot/virtualization/templates/virtualization/virtualmachine.html +9 -1
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +8 -2
- nautobot/virtualization/tests/test_filters.py +0 -17
- nautobot/wireless/filters.py +2 -2
- nautobot/wireless/forms.py +1 -1
- nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +9 -1
- nautobot/wireless/tests/test_filters.py +1 -29
- nautobot/wireless/views.py +10 -0
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/METADATA +6 -6
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/RECORD +543 -591
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/WHEEL +1 -1
- nautobot/core/api/constants.py +0 -11
- nautobot/core/jobs/bulk_actions.py +0 -248
- nautobot/core/templates/about.html +0 -67
- nautobot/core/templates/inc/tenancy_form_panel.html +0 -9
- nautobot/core/templates/inc/tenant_table_row.html +0 -11
- nautobot/core/utils/querysets.py +0 -64
- nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +0 -25
- nautobot/dcim/tests/integration/test_controller.py +0 -62
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +0 -71
- nautobot/dcim/tests/test_jobs.py +0 -118
- nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +0 -22
- nautobot/extras/migrations/0121_alter_team_contacts.py +0 -17
- nautobot/extras/test_jobs/singleton.py +0 -16
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -9444
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -9722
- nautobot/wireless/tests/integration/__init__.py +0 -0
- nautobot/wireless/tests/integration/test_radio_profile.py +0 -42
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/NOTICE +0 -0
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/entry_points.txt +0 -0
nautobot/extras/views.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from urllib.parse import parse_qs
|
|
3
3
|
|
|
4
|
+
from celery import chain
|
|
5
|
+
from django.conf import settings
|
|
4
6
|
from django.contrib import messages
|
|
5
7
|
from django.contrib.contenttypes.models import ContentType
|
|
6
8
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
|
@@ -66,7 +68,10 @@ from nautobot.dcim.tables import (
|
|
|
66
68
|
RackTable,
|
|
67
69
|
VirtualDeviceContextTable,
|
|
68
70
|
)
|
|
71
|
+
from nautobot.extras.constants import JOB_OVERRIDABLE_FIELDS
|
|
69
72
|
from nautobot.extras.context_managers import deferred_change_logging_for_bulk_operation
|
|
73
|
+
from nautobot.extras.signals import change_context_state
|
|
74
|
+
from nautobot.extras.tasks import delete_custom_field_data
|
|
70
75
|
from nautobot.extras.utils import get_base_template, get_job_queue, get_worker_count
|
|
71
76
|
from nautobot.ipam.models import IPAddress, Prefix, VLAN
|
|
72
77
|
from nautobot.ipam.tables import IPAddressTable, PrefixTable, VLANTable
|
|
@@ -654,7 +659,37 @@ class CustomFieldBulkDeleteView(generic.BulkDeleteView):
|
|
|
654
659
|
queryset = CustomField.objects.all()
|
|
655
660
|
table = tables.CustomFieldTable
|
|
656
661
|
filterset = filters.CustomFieldFilterSet
|
|
657
|
-
|
|
662
|
+
|
|
663
|
+
def construct_custom_field_delete_tasks(self, queryset):
|
|
664
|
+
"""
|
|
665
|
+
Helper method to construct a list of celery tasks to execute when bulk deleting custom fields.
|
|
666
|
+
"""
|
|
667
|
+
change_context = change_context_state.get()
|
|
668
|
+
if change_context is None:
|
|
669
|
+
context = None
|
|
670
|
+
else:
|
|
671
|
+
context = change_context.as_dict(queryset)
|
|
672
|
+
context["context_detail"] = "bulk delete custom field data"
|
|
673
|
+
tasks = [
|
|
674
|
+
delete_custom_field_data.si(obj.key, set(obj.content_types.values_list("pk", flat=True)), context)
|
|
675
|
+
for obj in queryset
|
|
676
|
+
]
|
|
677
|
+
return tasks
|
|
678
|
+
|
|
679
|
+
def perform_pre_delete(self, request, queryset):
|
|
680
|
+
"""
|
|
681
|
+
Remove all Custom Field Keys/Values from _custom_field_data of the related ContentType in the background.
|
|
682
|
+
"""
|
|
683
|
+
if not get_worker_count():
|
|
684
|
+
messages.error(
|
|
685
|
+
request, "Celery worker process not running. Object custom fields may fail to reflect this deletion."
|
|
686
|
+
)
|
|
687
|
+
return
|
|
688
|
+
tasks = self.construct_custom_field_delete_tasks(queryset)
|
|
689
|
+
# Executing the tasks in the background sequentially using chain() aligns with how a single
|
|
690
|
+
# CustomField object is deleted. We decided to not check the result because it needs at least one worker
|
|
691
|
+
# to be active and comes with extra performance penalty.
|
|
692
|
+
chain(*tasks).apply_async()
|
|
658
693
|
|
|
659
694
|
|
|
660
695
|
#
|
|
@@ -1062,10 +1097,10 @@ class GitRepositoryEditView(generic.ObjectEditView):
|
|
|
1062
1097
|
obj.user = request.user
|
|
1063
1098
|
return super().alter_obj(obj, request, url_args, url_kwargs)
|
|
1064
1099
|
|
|
1065
|
-
def get_return_url(self, request, obj
|
|
1100
|
+
def get_return_url(self, request, obj):
|
|
1066
1101
|
if request.method == "POST":
|
|
1067
1102
|
return reverse("extras:gitrepository_result", kwargs={"pk": obj.pk})
|
|
1068
|
-
return super().get_return_url(request, obj
|
|
1103
|
+
return super().get_return_url(request, obj)
|
|
1069
1104
|
|
|
1070
1105
|
|
|
1071
1106
|
class GitRepositoryDeleteView(generic.ObjectDeleteView):
|
|
@@ -1213,27 +1248,27 @@ class ImageAttachmentEditView(generic.ObjectEditView):
|
|
|
1213
1248
|
return get_object_or_404(self.queryset, pk=kwargs["pk"])
|
|
1214
1249
|
return self.queryset.model()
|
|
1215
1250
|
|
|
1216
|
-
def alter_obj(self,
|
|
1217
|
-
if not
|
|
1251
|
+
def alter_obj(self, imageattachment, request, args, kwargs):
|
|
1252
|
+
if not imageattachment.present_in_database:
|
|
1218
1253
|
# Assign the parent object based on URL kwargs
|
|
1219
|
-
model =
|
|
1220
|
-
if "object_id" in
|
|
1221
|
-
|
|
1222
|
-
elif "slug" in
|
|
1223
|
-
|
|
1254
|
+
model = kwargs.get("model")
|
|
1255
|
+
if "object_id" in kwargs:
|
|
1256
|
+
imageattachment.parent = get_object_or_404(model, pk=kwargs["object_id"])
|
|
1257
|
+
elif "slug" in kwargs:
|
|
1258
|
+
imageattachment.parent = get_object_or_404(model, slug=kwargs["slug"])
|
|
1224
1259
|
else:
|
|
1225
1260
|
raise RuntimeError("Neither object_id nor slug were provided?")
|
|
1226
|
-
return
|
|
1261
|
+
return imageattachment
|
|
1227
1262
|
|
|
1228
|
-
def get_return_url(self, request,
|
|
1229
|
-
return
|
|
1263
|
+
def get_return_url(self, request, imageattachment):
|
|
1264
|
+
return imageattachment.parent.get_absolute_url()
|
|
1230
1265
|
|
|
1231
1266
|
|
|
1232
1267
|
class ImageAttachmentDeleteView(generic.ObjectDeleteView):
|
|
1233
1268
|
queryset = ImageAttachment.objects.all()
|
|
1234
1269
|
|
|
1235
|
-
def get_return_url(self, request,
|
|
1236
|
-
return
|
|
1270
|
+
def get_return_url(self, request, imageattachment):
|
|
1271
|
+
return imageattachment.parent.get_absolute_url()
|
|
1237
1272
|
|
|
1238
1273
|
|
|
1239
1274
|
#
|
|
@@ -1330,9 +1365,6 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1330
1365
|
pass
|
|
1331
1366
|
initial["_job_queue"] = jq
|
|
1332
1367
|
initial["_profile"] = job_result.celery_kwargs.get("nautobot_job_profile", False)
|
|
1333
|
-
initial["_ignore_singleton_lock"] = job_result.celery_kwargs.get(
|
|
1334
|
-
"nautobot_job_ignore_singleton_lock", False
|
|
1335
|
-
)
|
|
1336
1368
|
initial.update(explicit_initial)
|
|
1337
1369
|
except JobResult.DoesNotExist:
|
|
1338
1370
|
messages.warning(
|
|
@@ -1347,9 +1379,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1347
1379
|
get_template(job_class.template_name)
|
|
1348
1380
|
template_name = job_class.template_name
|
|
1349
1381
|
except TemplateDoesNotExist as err:
|
|
1350
|
-
messages.error(
|
|
1351
|
-
request, f'Unable to render requested custom job template "{job_class.template_name}": {err}'
|
|
1352
|
-
)
|
|
1382
|
+
messages.error(request, f'Unable to render requested custom job template "{template_name}": {err}')
|
|
1353
1383
|
except RuntimeError as err:
|
|
1354
1384
|
messages.error(request, f"Unable to run or schedule '{job_model}': {err}")
|
|
1355
1385
|
return redirect("extras:job_list")
|
|
@@ -1417,7 +1447,6 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1417
1447
|
dryrun = job_form.cleaned_data.get("dryrun", False)
|
|
1418
1448
|
# Run the job. A new JobResult is created.
|
|
1419
1449
|
profile = job_form.cleaned_data.pop("_profile")
|
|
1420
|
-
ignore_singleton_lock = job_form.cleaned_data.pop("_ignore_singleton_lock", False)
|
|
1421
1450
|
schedule_type = schedule_form.cleaned_data["_schedule_type"]
|
|
1422
1451
|
|
|
1423
1452
|
if (not dryrun and job_model.approval_required) or schedule_type in JobExecutionType.SCHEDULE_CHOICES:
|
|
@@ -1431,7 +1460,6 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1431
1460
|
approval_required=job_model.approval_required,
|
|
1432
1461
|
task_queue=jq.name if jq else None,
|
|
1433
1462
|
profile=profile,
|
|
1434
|
-
ignore_singleton_lock=ignore_singleton_lock,
|
|
1435
1463
|
**job_class.serialize_data(job_form.cleaned_data),
|
|
1436
1464
|
)
|
|
1437
1465
|
|
|
@@ -1449,7 +1477,6 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1449
1477
|
job_model,
|
|
1450
1478
|
request.user,
|
|
1451
1479
|
profile=profile,
|
|
1452
|
-
ignore_singleton_lock=ignore_singleton_lock,
|
|
1453
1480
|
task_queue=jq.name if jq else None,
|
|
1454
1481
|
**job_class.serialize_data(job_kwargs),
|
|
1455
1482
|
)
|
|
@@ -1475,9 +1502,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1475
1502
|
get_template(job_class.template_name)
|
|
1476
1503
|
template_name = job_class.template_name
|
|
1477
1504
|
except TemplateDoesNotExist as err:
|
|
1478
|
-
messages.error(
|
|
1479
|
-
request, f'Unable to render requested custom job template "{job_class.template_name}": {err}'
|
|
1480
|
-
)
|
|
1505
|
+
messages.error(request, f'Unable to render requested custom job template "{template_name}": {err}')
|
|
1481
1506
|
|
|
1482
1507
|
return render(
|
|
1483
1508
|
request,
|
|
@@ -1508,6 +1533,52 @@ class JobBulkEditView(generic.BulkEditView):
|
|
|
1508
1533
|
form = forms.JobBulkEditForm
|
|
1509
1534
|
template_name = "extras/job_bulk_edit.html"
|
|
1510
1535
|
|
|
1536
|
+
def extra_post_save_action(self, obj, form):
|
|
1537
|
+
cleaned_data = form.cleaned_data
|
|
1538
|
+
|
|
1539
|
+
# Handle text related fields
|
|
1540
|
+
for overridable_field in JOB_OVERRIDABLE_FIELDS:
|
|
1541
|
+
override_field = overridable_field + "_override"
|
|
1542
|
+
clear_override_field = "clear_" + overridable_field + "_override"
|
|
1543
|
+
reset_override = cleaned_data.get(clear_override_field, False)
|
|
1544
|
+
override_value = cleaned_data.get(overridable_field)
|
|
1545
|
+
if reset_override:
|
|
1546
|
+
setattr(obj, override_field, False)
|
|
1547
|
+
elif not reset_override and override_value not in [None, ""]:
|
|
1548
|
+
setattr(obj, override_field, True)
|
|
1549
|
+
setattr(obj, overridable_field, override_value)
|
|
1550
|
+
|
|
1551
|
+
# Handle job queues
|
|
1552
|
+
clear_override_field = "clear_job_queues_override"
|
|
1553
|
+
reset_override = cleaned_data.get(clear_override_field, False)
|
|
1554
|
+
if reset_override:
|
|
1555
|
+
meta_task_queues = obj.job_class.task_queues
|
|
1556
|
+
job_queues = []
|
|
1557
|
+
for queue_name in meta_task_queues:
|
|
1558
|
+
try:
|
|
1559
|
+
job_queues.append(JobQueue.objects.get(name=queue_name))
|
|
1560
|
+
except JobQueue.DoesNotExist:
|
|
1561
|
+
# Do we want to create the Job Queue for the users here if we do not have it in the database?
|
|
1562
|
+
pass
|
|
1563
|
+
obj.job_queues_override = False
|
|
1564
|
+
obj.job_queues.set(job_queues)
|
|
1565
|
+
elif cleaned_data["job_queues"]:
|
|
1566
|
+
obj.job_queues_override = True
|
|
1567
|
+
|
|
1568
|
+
# Handle default job queue
|
|
1569
|
+
clear_override_field = "clear_default_job_queue_override"
|
|
1570
|
+
reset_override = cleaned_data.get(clear_override_field, False)
|
|
1571
|
+
if reset_override:
|
|
1572
|
+
meta_task_queues = obj.job_class.task_queues
|
|
1573
|
+
obj.default_job_queue_override = False
|
|
1574
|
+
obj.default_job_queue, _ = JobQueue.objects.get_or_create(
|
|
1575
|
+
name=meta_task_queues[0] if meta_task_queues else settings.CELERY_TASK_DEFAULT_QUEUE
|
|
1576
|
+
)
|
|
1577
|
+
elif cleaned_data["default_job_queue"]:
|
|
1578
|
+
obj.default_job_queue_override = True
|
|
1579
|
+
|
|
1580
|
+
obj.validated_save()
|
|
1581
|
+
|
|
1511
1582
|
|
|
1512
1583
|
class JobDeleteView(generic.ObjectDeleteView):
|
|
1513
1584
|
queryset = JobModel.objects.all()
|
|
@@ -2027,9 +2098,6 @@ def get_annotated_jobresult_queryset():
|
|
|
2027
2098
|
debug_log_count=count_related(
|
|
2028
2099
|
JobLogEntry, "job_result", filter_dict={"log_level": LogLevelChoices.LOG_DEBUG}
|
|
2029
2100
|
),
|
|
2030
|
-
success_log_count=count_related(
|
|
2031
|
-
JobLogEntry, "job_result", filter_dict={"log_level": LogLevelChoices.LOG_SUCCESS}
|
|
2032
|
-
),
|
|
2033
2101
|
info_log_count=count_related(
|
|
2034
2102
|
JobLogEntry, "job_result", filter_dict={"log_level": LogLevelChoices.LOG_INFO}
|
|
2035
2103
|
),
|
nautobot/ipam/api/fields.py
CHANGED
|
@@ -7,11 +7,11 @@ class IPFieldSerializer(serializers.CharField):
|
|
|
7
7
|
"""Convert internal (IPNetwork) representation to API (string) representation."""
|
|
8
8
|
return str(value)
|
|
9
9
|
|
|
10
|
-
def to_internal_value(self,
|
|
10
|
+
def to_internal_value(self, value):
|
|
11
11
|
"""Convert API (string) representation to internal (IPNetwork) representation."""
|
|
12
12
|
try:
|
|
13
|
-
return netaddr.IPNetwork(
|
|
13
|
+
return netaddr.IPNetwork(value)
|
|
14
14
|
except netaddr.AddrFormatError:
|
|
15
|
-
raise serializers.ValidationError(f"Invalid IP address format: {
|
|
15
|
+
raise serializers.ValidationError(f"Invalid IP address format: {value}")
|
|
16
16
|
except (TypeError, ValueError) as e:
|
|
17
17
|
raise serializers.ValidationError(e)
|
nautobot/ipam/api/serializers.py
CHANGED
|
@@ -62,16 +62,16 @@ class VRFDeviceAssignmentSerializer(ValidatedModelSerializer):
|
|
|
62
62
|
fields = "__all__"
|
|
63
63
|
validators = []
|
|
64
64
|
|
|
65
|
-
def validate(self,
|
|
66
|
-
if
|
|
65
|
+
def validate(self, data):
|
|
66
|
+
if data.get("device"):
|
|
67
67
|
validator = UniqueTogetherValidator(queryset=VRFDeviceAssignment.objects.all(), fields=("device", "vrf"))
|
|
68
|
-
validator(
|
|
69
|
-
if
|
|
68
|
+
validator(data, self)
|
|
69
|
+
if data.get("virtual_machine"):
|
|
70
70
|
validator = UniqueTogetherValidator(
|
|
71
71
|
queryset=VRFDeviceAssignment.objects.all(), fields=("virtual_machine", "vrf")
|
|
72
72
|
)
|
|
73
|
-
validator(
|
|
74
|
-
return super().validate(
|
|
73
|
+
validator(data, self)
|
|
74
|
+
return super().validate(data)
|
|
75
75
|
|
|
76
76
|
|
|
77
77
|
class VRFPrefixAssignmentSerializer(ValidatedModelSerializer):
|
|
@@ -133,17 +133,17 @@ class VLANSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
133
133
|
validators = []
|
|
134
134
|
extra_kwargs = {"locations": {"read_only": True}}
|
|
135
135
|
|
|
136
|
-
def validate(self,
|
|
136
|
+
def validate(self, data):
|
|
137
137
|
# Validate uniqueness of vid and name if a group has been assigned.
|
|
138
|
-
if
|
|
138
|
+
if data.get("vlan_group", None):
|
|
139
139
|
for field in ["vid", "name"]:
|
|
140
140
|
validator = UniqueTogetherValidator(queryset=VLAN.objects.all(), fields=("vlan_group", field))
|
|
141
|
-
validator(
|
|
141
|
+
validator(data, self)
|
|
142
142
|
|
|
143
143
|
# Enforce model validation
|
|
144
|
-
super().validate(
|
|
144
|
+
super().validate(data)
|
|
145
145
|
|
|
146
|
-
return
|
|
146
|
+
return data
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
class VLANLegacySerializer(VLANSerializer):
|
|
@@ -205,12 +205,6 @@ class PrefixSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
205
205
|
write_only=True,
|
|
206
206
|
)
|
|
207
207
|
|
|
208
|
-
def get_field_names(self, declared_fields, info):
|
|
209
|
-
"""Add reverse M2M for VRF's to the fields for this serializer."""
|
|
210
|
-
field_names = list(super().get_field_names(declared_fields, info))
|
|
211
|
-
self.extend_field_names(field_names, "vrfs")
|
|
212
|
-
return field_names
|
|
213
|
-
|
|
214
208
|
class Meta:
|
|
215
209
|
model = Prefix
|
|
216
210
|
fields = "__all__"
|
|
@@ -219,7 +213,6 @@ class PrefixSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
219
213
|
"namespace": {"default": get_default_namespace},
|
|
220
214
|
"prefix_length": {"read_only": True},
|
|
221
215
|
"locations": {"read_only": True},
|
|
222
|
-
"vrfs": {"read_only": True},
|
|
223
216
|
}
|
|
224
217
|
|
|
225
218
|
|
|
@@ -327,16 +320,16 @@ class IPAddressSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
327
320
|
"parent": {"required": False},
|
|
328
321
|
}
|
|
329
322
|
|
|
330
|
-
def validate(self,
|
|
331
|
-
namespace =
|
|
332
|
-
parent =
|
|
323
|
+
def validate(self, data):
|
|
324
|
+
namespace = data.get("namespace", None)
|
|
325
|
+
parent = data.get("parent", None)
|
|
333
326
|
|
|
334
327
|
# Only assert namespace/parent on create.
|
|
335
328
|
if self.instance is None and not any([namespace, parent]):
|
|
336
329
|
raise ValidationError({"__all__": "One of parent or namespace must be provided"})
|
|
337
330
|
|
|
338
|
-
super().validate(
|
|
339
|
-
return
|
|
331
|
+
super().validate(data)
|
|
332
|
+
return data
|
|
340
333
|
|
|
341
334
|
def get_field_names(self, declared_fields, info):
|
|
342
335
|
"""Add reverse relations to the automatically discovered fields."""
|
|
@@ -386,9 +379,9 @@ class IPAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMixin
|
|
|
386
379
|
"custom_fields",
|
|
387
380
|
)
|
|
388
381
|
|
|
389
|
-
def validate(self,
|
|
390
|
-
|
|
391
|
-
return super().validate(
|
|
382
|
+
def validate(self, data):
|
|
383
|
+
data["mask_length"] = self.context["prefix"].prefix_length
|
|
384
|
+
return super().validate(data)
|
|
392
385
|
|
|
393
386
|
|
|
394
387
|
class VLANAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
@@ -398,13 +391,12 @@ class VLANAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMix
|
|
|
398
391
|
|
|
399
392
|
vid = serializers.IntegerField(required=False, min_value=constants.VLAN_VID_MIN, max_value=constants.VLAN_VID_MAX)
|
|
400
393
|
|
|
401
|
-
def validate(self,
|
|
394
|
+
def validate(self, data):
|
|
402
395
|
"""
|
|
403
396
|
Skip `ValidatedModel` validation.
|
|
404
|
-
|
|
405
397
|
This allows to skip `vid` attribute of `VLAN` model, while validate name and status.
|
|
406
398
|
"""
|
|
407
|
-
return
|
|
399
|
+
return data
|
|
408
400
|
|
|
409
401
|
class Meta(VLANSerializer.Meta):
|
|
410
402
|
model = VLAN
|
|
@@ -433,19 +425,19 @@ class IPAddressToInterfaceSerializer(ValidatedModelSerializer):
|
|
|
433
425
|
fields = "__all__"
|
|
434
426
|
validators = []
|
|
435
427
|
|
|
436
|
-
def validate(self,
|
|
428
|
+
def validate(self, data):
|
|
437
429
|
# Validate uniqueness of (parent, name) since we omitted the automatically created validator from Meta.
|
|
438
|
-
if
|
|
430
|
+
if data.get("interface"):
|
|
439
431
|
validator = UniqueTogetherValidator(
|
|
440
432
|
queryset=IPAddressToInterface.objects.all(), fields=("interface", "ip_address")
|
|
441
433
|
)
|
|
442
|
-
validator(
|
|
443
|
-
if
|
|
434
|
+
validator(data, self)
|
|
435
|
+
if data.get("vm_interface"):
|
|
444
436
|
validator = UniqueTogetherValidator(
|
|
445
437
|
queryset=IPAddressToInterface.objects.all(), fields=("vm_interface", "ip_address")
|
|
446
438
|
)
|
|
447
|
-
validator(
|
|
448
|
-
return super().validate(
|
|
439
|
+
validator(data, self)
|
|
440
|
+
return super().validate(data)
|
|
449
441
|
|
|
450
442
|
|
|
451
443
|
#
|
|
@@ -472,11 +464,11 @@ class ServiceSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
472
464
|
"virtual_machine": {"help_text": "Required if no device is specified"},
|
|
473
465
|
}
|
|
474
466
|
|
|
475
|
-
def validate(self,
|
|
476
|
-
if
|
|
467
|
+
def validate(self, data):
|
|
468
|
+
if data.get("device"):
|
|
477
469
|
validator = UniqueTogetherValidator(queryset=Service.objects.all(), fields=("name", "device"))
|
|
478
|
-
validator(
|
|
479
|
-
if
|
|
470
|
+
validator(data, self)
|
|
471
|
+
if data.get("virtual_machine"):
|
|
480
472
|
validator = UniqueTogetherValidator(queryset=Service.objects.all(), fields=("name", "virtual_machine"))
|
|
481
|
-
validator(
|
|
482
|
-
return super().validate(
|
|
473
|
+
validator(data, self)
|
|
474
|
+
return super().validate(data)
|