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
|
@@ -19,6 +19,7 @@ from nautobot.core.api import (
|
|
|
19
19
|
ValidatedModelSerializer,
|
|
20
20
|
)
|
|
21
21
|
from nautobot.core.api.exceptions import SerializerNotFound
|
|
22
|
+
from nautobot.core.api.fields import NautobotHyperlinkedRelatedField
|
|
22
23
|
from nautobot.core.api.serializers import PolymorphicProxySerializer
|
|
23
24
|
from nautobot.core.api.utils import (
|
|
24
25
|
get_nested_serializer_depth,
|
|
@@ -135,12 +136,12 @@ class ConfigContextSerializer(ValidatedModelSerializer, TaggedModelSerializerMix
|
|
|
135
136
|
owner = serializers.SerializerMethodField(read_only=True)
|
|
136
137
|
|
|
137
138
|
# Conditional enablement of dynamic groups filtering
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
def __init__(self, *args, **kwargs):
|
|
140
|
+
super().__init__(*args, **kwargs)
|
|
141
|
+
|
|
141
142
|
if not settings.CONFIG_CONTEXT_DYNAMIC_GROUPS_ENABLED:
|
|
142
|
-
|
|
143
|
-
|
|
143
|
+
# In the case of a nested serializer, we won't have a `dynamic_groups` field at all.
|
|
144
|
+
self.fields.pop("dynamic_groups", None)
|
|
144
145
|
|
|
145
146
|
class Meta:
|
|
146
147
|
model = ConfigContext
|
|
@@ -199,7 +200,10 @@ class ConfigContextSchemaSerializer(NautobotModelSerializer):
|
|
|
199
200
|
#
|
|
200
201
|
|
|
201
202
|
|
|
202
|
-
class ContactSerializer(
|
|
203
|
+
class ContactSerializer(NautobotModelSerializer):
|
|
204
|
+
# needed since this is the reverse side of the M2M field.
|
|
205
|
+
teams = NautobotHyperlinkedRelatedField(queryset=Team.objects.all(), many=True, required=False)
|
|
206
|
+
|
|
203
207
|
class Meta:
|
|
204
208
|
model = Contact
|
|
205
209
|
fields = "__all__"
|
|
@@ -208,22 +212,15 @@ class ContactSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
|
|
|
208
212
|
extra_kwargs = {
|
|
209
213
|
"email": {"default": ""},
|
|
210
214
|
"phone": {"default": ""},
|
|
211
|
-
"teams": {"required": False},
|
|
212
215
|
}
|
|
213
216
|
|
|
214
|
-
def
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
self.extend_field_names(field_names, "teams")
|
|
218
|
-
return field_names
|
|
219
|
-
|
|
220
|
-
def validate(self, attrs):
|
|
221
|
-
local_attrs = attrs.copy()
|
|
222
|
-
local_attrs.pop("teams", None)
|
|
217
|
+
def validate(self, data):
|
|
218
|
+
attrs = data.copy()
|
|
219
|
+
attrs.pop("teams", None)
|
|
223
220
|
validator = UniqueTogetherValidator(queryset=Contact.objects.all(), fields=("name", "phone", "email"))
|
|
224
|
-
validator(
|
|
225
|
-
super().validate(
|
|
226
|
-
return
|
|
221
|
+
validator(attrs, self)
|
|
222
|
+
super().validate(attrs)
|
|
223
|
+
return data
|
|
227
224
|
|
|
228
225
|
|
|
229
226
|
class ContactAssociationSerializer(NautobotModelSerializer):
|
|
@@ -238,18 +235,18 @@ class ContactAssociationSerializer(NautobotModelSerializer):
|
|
|
238
235
|
"team": {"required": False},
|
|
239
236
|
}
|
|
240
237
|
|
|
241
|
-
def validate(self,
|
|
238
|
+
def validate(self, data):
|
|
242
239
|
# Validate uniqueness of (associated object, associated object type, contact/team, role)
|
|
243
240
|
unique_together_fields = None
|
|
244
241
|
|
|
245
|
-
if
|
|
242
|
+
if data.get("contact") and data.get("role"):
|
|
246
243
|
unique_together_fields = (
|
|
247
244
|
"associated_object_type",
|
|
248
245
|
"associated_object_id",
|
|
249
246
|
"contact",
|
|
250
247
|
"role",
|
|
251
248
|
)
|
|
252
|
-
elif
|
|
249
|
+
elif data.get("team") and data.get("role"):
|
|
253
250
|
unique_together_fields = (
|
|
254
251
|
"associated_object_type",
|
|
255
252
|
"associated_object_id",
|
|
@@ -262,11 +259,11 @@ class ContactAssociationSerializer(NautobotModelSerializer):
|
|
|
262
259
|
queryset=ContactAssociation.objects.all(),
|
|
263
260
|
fields=unique_together_fields,
|
|
264
261
|
)
|
|
265
|
-
validator(
|
|
262
|
+
validator(data, self)
|
|
266
263
|
|
|
267
|
-
super().validate(
|
|
264
|
+
super().validate(data)
|
|
268
265
|
|
|
269
|
-
return
|
|
266
|
+
return data
|
|
270
267
|
|
|
271
268
|
|
|
272
269
|
#
|
|
@@ -275,7 +272,6 @@ class ContactAssociationSerializer(NautobotModelSerializer):
|
|
|
275
272
|
|
|
276
273
|
|
|
277
274
|
class ContentTypeSerializer(BaseModelSerializer):
|
|
278
|
-
id = serializers.IntegerField(read_only=True)
|
|
279
275
|
url = serializers.HyperlinkedIdentityField(view_name="extras-api:contenttype-detail")
|
|
280
276
|
display = serializers.SerializerMethodField()
|
|
281
277
|
|
|
@@ -284,8 +280,8 @@ class ContentTypeSerializer(BaseModelSerializer):
|
|
|
284
280
|
fields = "__all__"
|
|
285
281
|
|
|
286
282
|
@extend_schema_field(serializers.CharField)
|
|
287
|
-
def get_display(self,
|
|
288
|
-
return
|
|
283
|
+
def get_display(self, obj):
|
|
284
|
+
return obj.app_labeled_name
|
|
289
285
|
|
|
290
286
|
|
|
291
287
|
#
|
|
@@ -437,7 +433,7 @@ class ExportTemplateSerializer(RelationshipModelSerializerMixin, ValidatedModelS
|
|
|
437
433
|
#
|
|
438
434
|
|
|
439
435
|
|
|
440
|
-
class ExternalIntegrationSerializer(
|
|
436
|
+
class ExternalIntegrationSerializer(NautobotModelSerializer):
|
|
441
437
|
class Meta:
|
|
442
438
|
model = ExternalIntegration
|
|
443
439
|
fields = "__all__"
|
|
@@ -459,7 +455,7 @@ class FileProxySerializer(BaseModelSerializer):
|
|
|
459
455
|
#
|
|
460
456
|
|
|
461
457
|
|
|
462
|
-
class GitRepositorySerializer(
|
|
458
|
+
class GitRepositorySerializer(NautobotModelSerializer):
|
|
463
459
|
"""Git repositories defined as a data source."""
|
|
464
460
|
|
|
465
461
|
provided_contents = MultipleChoiceJSONField(
|
|
@@ -506,17 +502,17 @@ class ImageAttachmentSerializer(ValidatedModelSerializer):
|
|
|
506
502
|
model = ImageAttachment
|
|
507
503
|
fields = "__all__"
|
|
508
504
|
|
|
509
|
-
def validate(self,
|
|
505
|
+
def validate(self, data):
|
|
510
506
|
# Validate that the parent object exists
|
|
511
507
|
try:
|
|
512
|
-
|
|
508
|
+
data["content_type"].get_object_for_this_type(id=data["object_id"])
|
|
513
509
|
except ObjectDoesNotExist:
|
|
514
|
-
raise serializers.ValidationError(f"Invalid parent object: {
|
|
510
|
+
raise serializers.ValidationError(f"Invalid parent object: {data['content_type']} ID {data['object_id']}")
|
|
515
511
|
|
|
516
512
|
# Enforce model validation
|
|
517
|
-
super().validate(
|
|
513
|
+
super().validate(data)
|
|
518
514
|
|
|
519
|
-
return
|
|
515
|
+
return data
|
|
520
516
|
|
|
521
517
|
@extend_schema_field(
|
|
522
518
|
PolymorphicProxySerializer(
|
|
@@ -548,24 +544,24 @@ class JobSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
548
544
|
model = Job
|
|
549
545
|
fields = "__all__"
|
|
550
546
|
|
|
551
|
-
def validate(self,
|
|
547
|
+
def validate(self, data):
|
|
552
548
|
# note no validation for on creation of jobs because we do not support user creation of Job records via API
|
|
553
549
|
if self.instance:
|
|
554
|
-
has_sensitive_variables =
|
|
555
|
-
approval_required =
|
|
550
|
+
has_sensitive_variables = data.get("has_sensitive_variables", self.instance.has_sensitive_variables)
|
|
551
|
+
approval_required = data.get("approval_required", self.instance.approval_required)
|
|
556
552
|
|
|
557
553
|
if approval_required and has_sensitive_variables:
|
|
558
554
|
error_message = "A job with sensitive variables cannot also be marked as requiring approval"
|
|
559
555
|
errors = {}
|
|
560
556
|
|
|
561
|
-
if "approval_required" in
|
|
557
|
+
if "approval_required" in data:
|
|
562
558
|
errors["approval_required"] = [error_message]
|
|
563
|
-
if "has_sensitive_variables" in
|
|
559
|
+
if "has_sensitive_variables" in data:
|
|
564
560
|
errors["has_sensitive_variables"] = [error_message]
|
|
565
561
|
|
|
566
562
|
raise serializers.ValidationError(errors)
|
|
567
563
|
|
|
568
|
-
return super().validate(
|
|
564
|
+
return super().validate(data)
|
|
569
565
|
|
|
570
566
|
|
|
571
567
|
class JobQueueSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
@@ -691,22 +687,22 @@ class JobHookSerializer(NautobotModelSerializer):
|
|
|
691
687
|
model = JobHook
|
|
692
688
|
fields = "__all__"
|
|
693
689
|
|
|
694
|
-
def validate(self,
|
|
695
|
-
|
|
690
|
+
def validate(self, data):
|
|
691
|
+
validated_data = super().validate(data)
|
|
696
692
|
|
|
697
693
|
conflicts = JobHook.check_for_conflicts(
|
|
698
694
|
instance=self.instance,
|
|
699
|
-
content_types=
|
|
700
|
-
job=
|
|
701
|
-
type_create=
|
|
702
|
-
type_update=
|
|
703
|
-
type_delete=
|
|
695
|
+
content_types=data.get("content_types"),
|
|
696
|
+
job=data.get("job"),
|
|
697
|
+
type_create=data.get("type_create"),
|
|
698
|
+
type_update=data.get("type_update"),
|
|
699
|
+
type_delete=data.get("type_delete"),
|
|
704
700
|
)
|
|
705
701
|
|
|
706
702
|
if conflicts:
|
|
707
703
|
raise serializers.ValidationError(conflicts)
|
|
708
704
|
|
|
709
|
-
return
|
|
705
|
+
return validated_data
|
|
710
706
|
|
|
711
707
|
|
|
712
708
|
class JobCreationSerializer(BaseModelSerializer):
|
|
@@ -725,15 +721,15 @@ class JobCreationSerializer(BaseModelSerializer):
|
|
|
725
721
|
model = ScheduledJob
|
|
726
722
|
fields = ["url", "name", "start_time", "interval", "crontab"]
|
|
727
723
|
|
|
728
|
-
def validate(self,
|
|
729
|
-
|
|
724
|
+
def validate(self, data):
|
|
725
|
+
data = super().validate(data)
|
|
730
726
|
|
|
731
|
-
if
|
|
732
|
-
if "name" not in
|
|
727
|
+
if data["interval"] in choices.JobExecutionType.SCHEDULE_CHOICES:
|
|
728
|
+
if "name" not in data:
|
|
733
729
|
raise serializers.ValidationError({"name": "Please provide a name for the job schedule."})
|
|
734
730
|
|
|
735
|
-
if ("start_time" not in
|
|
736
|
-
"start_time" in
|
|
731
|
+
if ("start_time" not in data and data["interval"] != choices.JobExecutionType.TYPE_CUSTOM) or (
|
|
732
|
+
"start_time" in data and data["start_time"] < models.ScheduledJob.earliest_possible_time()
|
|
737
733
|
):
|
|
738
734
|
raise serializers.ValidationError(
|
|
739
735
|
{
|
|
@@ -741,15 +737,15 @@ class JobCreationSerializer(BaseModelSerializer):
|
|
|
741
737
|
}
|
|
742
738
|
)
|
|
743
739
|
|
|
744
|
-
if
|
|
745
|
-
if
|
|
740
|
+
if data["interval"] == choices.JobExecutionType.TYPE_CUSTOM:
|
|
741
|
+
if data.get("crontab") is None:
|
|
746
742
|
raise serializers.ValidationError({"crontab": "Please enter a valid crontab."})
|
|
747
743
|
try:
|
|
748
|
-
models.ScheduledJob.get_crontab(
|
|
744
|
+
models.ScheduledJob.get_crontab(data["crontab"])
|
|
749
745
|
except Exception as e:
|
|
750
746
|
raise serializers.ValidationError({"crontab": e})
|
|
751
747
|
|
|
752
|
-
return
|
|
748
|
+
return data
|
|
753
749
|
|
|
754
750
|
|
|
755
751
|
class JobInputSerializer(serializers.Serializer):
|
|
@@ -769,18 +765,15 @@ class JobMultiPartInputSerializer(serializers.Serializer):
|
|
|
769
765
|
_task_queue = serializers.CharField(required=False, allow_blank=True)
|
|
770
766
|
_job_queue = serializers.CharField(required=False, allow_blank=True)
|
|
771
767
|
|
|
772
|
-
def validate(self,
|
|
773
|
-
|
|
768
|
+
def validate(self, data):
|
|
769
|
+
data = super().validate(data)
|
|
774
770
|
|
|
775
|
-
if "_schedule_interval" in
|
|
776
|
-
if "_schedule_name" not in
|
|
771
|
+
if "_schedule_interval" in data and data["_schedule_interval"] != JobExecutionType.TYPE_IMMEDIATELY:
|
|
772
|
+
if "_schedule_name" not in data:
|
|
777
773
|
raise serializers.ValidationError({"_schedule_name": "Please provide a name for the job schedule."})
|
|
778
774
|
|
|
779
|
-
if (
|
|
780
|
-
"_schedule_start_time"
|
|
781
|
-
) or (
|
|
782
|
-
"_schedule_start_time" in attrs
|
|
783
|
-
and attrs["_schedule_start_time"] < ScheduledJob.earliest_possible_time()
|
|
775
|
+
if ("_schedule_start_time" not in data and data["_schedule_interval"] != JobExecutionType.TYPE_CUSTOM) or (
|
|
776
|
+
"_schedule_start_time" in data and data["_schedule_start_time"] < ScheduledJob.earliest_possible_time()
|
|
784
777
|
):
|
|
785
778
|
raise serializers.ValidationError(
|
|
786
779
|
{
|
|
@@ -788,15 +781,15 @@ class JobMultiPartInputSerializer(serializers.Serializer):
|
|
|
788
781
|
}
|
|
789
782
|
)
|
|
790
783
|
|
|
791
|
-
if
|
|
792
|
-
if
|
|
784
|
+
if data["_schedule_interval"] == JobExecutionType.TYPE_CUSTOM:
|
|
785
|
+
if data.get("_schedule_crontab") is None:
|
|
793
786
|
raise serializers.ValidationError({"_schedule_crontab": "Please enter a valid crontab."})
|
|
794
787
|
try:
|
|
795
|
-
ScheduledJob.get_crontab(
|
|
788
|
+
ScheduledJob.get_crontab(data["_schedule_crontab"])
|
|
796
789
|
except Exception as e:
|
|
797
790
|
raise serializers.ValidationError({"_schedule_crontab": e})
|
|
798
791
|
|
|
799
|
-
return
|
|
792
|
+
return data
|
|
800
793
|
|
|
801
794
|
|
|
802
795
|
class JobLogEntrySerializer(BaseModelSerializer):
|
|
@@ -823,7 +816,7 @@ class JobButtonSerializer(ValidatedModelSerializer, NotesSerializerMixin):
|
|
|
823
816
|
#
|
|
824
817
|
|
|
825
818
|
|
|
826
|
-
class MetadataTypeSerializer(
|
|
819
|
+
class MetadataTypeSerializer(NautobotModelSerializer):
|
|
827
820
|
content_types = ContentTypeField(
|
|
828
821
|
queryset=ContentType.objects.filter(FeatureQuery("metadata").get_query()),
|
|
829
822
|
many=True,
|
|
@@ -1080,18 +1073,18 @@ class TagSerializer(NautobotModelSerializer):
|
|
|
1080
1073
|
"color": {"help_text": "RGB color in hexadecimal (e.g. 00ff00)"},
|
|
1081
1074
|
}
|
|
1082
1075
|
|
|
1083
|
-
def validate(self,
|
|
1084
|
-
|
|
1076
|
+
def validate(self, data):
|
|
1077
|
+
data = super().validate(data)
|
|
1085
1078
|
|
|
1086
1079
|
# check if tag is assigned to any of the removed content_types
|
|
1087
|
-
if self.instance is not None and self.instance.present_in_database and "content_types" in
|
|
1088
|
-
content_types_id = [content_type.id for content_type in
|
|
1080
|
+
if self.instance is not None and self.instance.present_in_database and "content_types" in data:
|
|
1081
|
+
content_types_id = [content_type.id for content_type in data["content_types"]]
|
|
1089
1082
|
errors = self.instance.validate_content_types_removal(content_types_id)
|
|
1090
1083
|
|
|
1091
1084
|
if errors:
|
|
1092
1085
|
raise serializers.ValidationError(errors)
|
|
1093
1086
|
|
|
1094
|
-
return
|
|
1087
|
+
return data
|
|
1095
1088
|
|
|
1096
1089
|
|
|
1097
1090
|
#
|
|
@@ -1099,7 +1092,9 @@ class TagSerializer(NautobotModelSerializer):
|
|
|
1099
1092
|
#
|
|
1100
1093
|
|
|
1101
1094
|
|
|
1102
|
-
class TeamSerializer(
|
|
1095
|
+
class TeamSerializer(NautobotModelSerializer):
|
|
1096
|
+
contacts = NautobotHyperlinkedRelatedField(queryset=Contact.objects.all(), many=True, required=False)
|
|
1097
|
+
|
|
1103
1098
|
class Meta:
|
|
1104
1099
|
model = Team
|
|
1105
1100
|
fields = "__all__"
|
|
@@ -1111,10 +1106,10 @@ class TeamSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
|
|
|
1111
1106
|
# https://www.django-rest-framework.org/api-guide/validators/#optional-fields
|
|
1112
1107
|
validators = []
|
|
1113
1108
|
|
|
1114
|
-
def validate(self,
|
|
1109
|
+
def validate(self, data):
|
|
1115
1110
|
validator = UniqueTogetherValidator(queryset=Team.objects.all(), fields=("name", "phone", "email"))
|
|
1116
|
-
validator(
|
|
1117
|
-
return super().validate(
|
|
1111
|
+
validator(data, self)
|
|
1112
|
+
return super().validate(data)
|
|
1118
1113
|
|
|
1119
1114
|
|
|
1120
1115
|
#
|
|
@@ -1132,19 +1127,19 @@ class WebhookSerializer(ValidatedModelSerializer, NotesSerializerMixin):
|
|
|
1132
1127
|
model = Webhook
|
|
1133
1128
|
fields = "__all__"
|
|
1134
1129
|
|
|
1135
|
-
def validate(self,
|
|
1136
|
-
|
|
1130
|
+
def validate(self, data):
|
|
1131
|
+
validated_data = super().validate(data)
|
|
1137
1132
|
|
|
1138
1133
|
conflicts = Webhook.check_for_conflicts(
|
|
1139
1134
|
instance=self.instance,
|
|
1140
|
-
content_types=
|
|
1141
|
-
payload_url=
|
|
1142
|
-
type_create=
|
|
1143
|
-
type_update=
|
|
1144
|
-
type_delete=
|
|
1135
|
+
content_types=data.get("content_types"),
|
|
1136
|
+
payload_url=data.get("payload_url"),
|
|
1137
|
+
type_create=data.get("type_create"),
|
|
1138
|
+
type_update=data.get("type_update"),
|
|
1139
|
+
type_delete=data.get("type_delete"),
|
|
1145
1140
|
)
|
|
1146
1141
|
|
|
1147
1142
|
if conflicts:
|
|
1148
1143
|
raise serializers.ValidationError(conflicts)
|
|
1149
1144
|
|
|
1150
|
-
return
|
|
1145
|
+
return validated_data
|
nautobot/extras/api/views.py
CHANGED
|
@@ -17,7 +17,6 @@ from rest_framework.permissions import IsAuthenticated
|
|
|
17
17
|
from rest_framework.response import Response
|
|
18
18
|
|
|
19
19
|
from nautobot.core.api.authentication import TokenPermissions
|
|
20
|
-
from nautobot.core.api.parsers import NautobotCSVParser
|
|
21
20
|
from nautobot.core.api.utils import get_serializer_for_model
|
|
22
21
|
from nautobot.core.api.views import (
|
|
23
22
|
BulkDestroyModelMixin,
|
|
@@ -181,7 +180,14 @@ class ConfigContextQuerySetMixin:
|
|
|
181
180
|
|
|
182
181
|
|
|
183
182
|
class ConfigContextViewSet(NotesViewSetMixin, ModelViewSet):
|
|
184
|
-
queryset = ConfigContext.objects.
|
|
183
|
+
queryset = ConfigContext.objects.prefetch_related(
|
|
184
|
+
"locations",
|
|
185
|
+
"roles",
|
|
186
|
+
"device_types",
|
|
187
|
+
"platforms",
|
|
188
|
+
"tenant_groups",
|
|
189
|
+
"tenants",
|
|
190
|
+
)
|
|
185
191
|
serializer_class = serializers.ConfigContextSerializer
|
|
186
192
|
filterset_class = filters.ConfigContextFilterSet
|
|
187
193
|
|
|
@@ -298,7 +304,7 @@ class DynamicGroupViewSet(NotesViewSetMixin, ModelViewSet):
|
|
|
298
304
|
Manage Dynamic Groups through DELETE, GET, POST, PUT, and PATCH requests.
|
|
299
305
|
"""
|
|
300
306
|
|
|
301
|
-
queryset = DynamicGroup.objects.
|
|
307
|
+
queryset = DynamicGroup.objects.select_related("content_type")
|
|
302
308
|
serializer_class = serializers.DynamicGroupSerializer
|
|
303
309
|
filterset_class = filters.DynamicGroupFilterSet
|
|
304
310
|
|
|
@@ -323,7 +329,7 @@ class DynamicGroupMembershipViewSet(ModelViewSet):
|
|
|
323
329
|
Manage Dynamic Group Memberships through DELETE, GET, POST, PUT, and PATCH requests.
|
|
324
330
|
"""
|
|
325
331
|
|
|
326
|
-
queryset = DynamicGroupMembership.objects.
|
|
332
|
+
queryset = DynamicGroupMembership.objects.select_related("group", "parent_group")
|
|
327
333
|
serializer_class = serializers.DynamicGroupMembershipSerializer
|
|
328
334
|
filterset_class = filters.DynamicGroupMembershipFilterSet
|
|
329
335
|
|
|
@@ -334,13 +340,13 @@ class DynamicGroupMembershipViewSet(ModelViewSet):
|
|
|
334
340
|
|
|
335
341
|
|
|
336
342
|
class SavedViewViewSet(ModelViewSet):
|
|
337
|
-
queryset = SavedView.objects.
|
|
343
|
+
queryset = SavedView.objects.select_related("owner")
|
|
338
344
|
serializer_class = serializers.SavedViewSerializer
|
|
339
345
|
filterset_class = filters.SavedViewFilterSet
|
|
340
346
|
|
|
341
347
|
|
|
342
348
|
class UserSavedViewAssociationViewSet(ModelViewSet):
|
|
343
|
-
queryset = UserSavedViewAssociation.objects.
|
|
349
|
+
queryset = UserSavedViewAssociation.objects.select_related("user", "saved_view")
|
|
344
350
|
serializer_class = serializers.UserSavedViewAssociationSerializer
|
|
345
351
|
filterset_class = filters.UserSavedViewAssociationFilterSet
|
|
346
352
|
|
|
@@ -350,7 +356,7 @@ class StaticGroupAssociationViewSet(NautobotModelViewSet):
|
|
|
350
356
|
Manage Static Group Associations through DELETE, GET, POST, PUT, and PATCH requests.
|
|
351
357
|
"""
|
|
352
358
|
|
|
353
|
-
queryset = StaticGroupAssociation.objects.
|
|
359
|
+
queryset = StaticGroupAssociation.objects.select_related("associated_object_type", "dynamic_group")
|
|
354
360
|
serializer_class = serializers.StaticGroupAssociationSerializer
|
|
355
361
|
filterset_class = filters.StaticGroupAssociationFilterSet
|
|
356
362
|
|
|
@@ -361,7 +367,7 @@ class StaticGroupAssociationViewSet(NautobotModelViewSet):
|
|
|
361
367
|
and "dynamic_group" in self.request.GET
|
|
362
368
|
and self.action in ["list", "retrieve"]
|
|
363
369
|
):
|
|
364
|
-
self.queryset = StaticGroupAssociation.all_objects.
|
|
370
|
+
self.queryset = StaticGroupAssociation.all_objects.select_related("associated_object_type", "dynamic_group")
|
|
365
371
|
return super().get_queryset()
|
|
366
372
|
|
|
367
373
|
|
|
@@ -382,7 +388,7 @@ class ExportTemplateViewSet(NotesViewSetMixin, ModelViewSet):
|
|
|
382
388
|
|
|
383
389
|
|
|
384
390
|
class ExternalIntegrationViewSet(NautobotModelViewSet):
|
|
385
|
-
queryset = ExternalIntegration.objects.
|
|
391
|
+
queryset = ExternalIntegration.objects.select_related("secrets_group")
|
|
386
392
|
serializer_class = serializers.ExternalIntegrationSerializer
|
|
387
393
|
filterset_class = filters.ExternalIntegrationFilterSet
|
|
388
394
|
|
|
@@ -393,7 +399,7 @@ class ExternalIntegrationViewSet(NautobotModelViewSet):
|
|
|
393
399
|
|
|
394
400
|
|
|
395
401
|
class FileProxyViewSet(ReadOnlyModelViewSet):
|
|
396
|
-
queryset = FileProxy.objects.
|
|
402
|
+
queryset = FileProxy.objects.select_related("job_result")
|
|
397
403
|
serializer_class = serializers.FileProxySerializer
|
|
398
404
|
filterset_class = filters.FileProxyFilterSet
|
|
399
405
|
|
|
@@ -482,7 +488,6 @@ class ImageAttachmentViewSet(ModelViewSet):
|
|
|
482
488
|
queryset = ImageAttachment.objects.all()
|
|
483
489
|
serializer_class = serializers.ImageAttachmentSerializer
|
|
484
490
|
filterset_class = filters.ImageAttachmentFilterSet
|
|
485
|
-
parser_classes = [JSONParser, NautobotCSVParser, MultiPartParser]
|
|
486
491
|
|
|
487
492
|
|
|
488
493
|
#
|
|
@@ -761,13 +766,13 @@ class JobViewSet(
|
|
|
761
766
|
):
|
|
762
767
|
lookup_value_regex = r"[-0-9a-fA-F]+"
|
|
763
768
|
|
|
764
|
-
def perform_destroy(self,
|
|
765
|
-
if
|
|
769
|
+
def perform_destroy(self, obj):
|
|
770
|
+
if obj.module_name.startswith("nautobot."):
|
|
766
771
|
raise ProtectedError(
|
|
767
|
-
f"Unable to delete Job {
|
|
772
|
+
f"Unable to delete Job {obj}. System Job cannot be deleted",
|
|
768
773
|
[],
|
|
769
774
|
)
|
|
770
|
-
super().perform_destroy(
|
|
775
|
+
super().perform_destroy(obj)
|
|
771
776
|
|
|
772
777
|
|
|
773
778
|
@extend_schema_view(
|
|
@@ -833,7 +838,7 @@ class JobQueueAssignmentViewSet(NautobotModelViewSet):
|
|
|
833
838
|
Manage job queue assignments through DELETE, GET, POST, PUT, and PATCH requests.
|
|
834
839
|
"""
|
|
835
840
|
|
|
836
|
-
queryset = JobQueueAssignment.objects.
|
|
841
|
+
queryset = JobQueueAssignment.objects.select_related("job", "job_queue")
|
|
837
842
|
serializer_class = serializers.JobQueueAssignmentSerializer
|
|
838
843
|
filterset_class = filters.JobQueueAssignmentFilterSet
|
|
839
844
|
|
|
@@ -848,7 +853,7 @@ class JobLogEntryViewSet(ReadOnlyModelViewSet):
|
|
|
848
853
|
Retrieve a list of job log entries.
|
|
849
854
|
"""
|
|
850
855
|
|
|
851
|
-
queryset = JobLogEntry.objects.
|
|
856
|
+
queryset = JobLogEntry.objects.select_related("job_result")
|
|
852
857
|
serializer_class = serializers.JobLogEntrySerializer
|
|
853
858
|
filterset_class = filters.JobLogEntryFilterSet
|
|
854
859
|
|
|
@@ -866,7 +871,7 @@ class JobResultViewSet(
|
|
|
866
871
|
Retrieve a list of job results
|
|
867
872
|
"""
|
|
868
873
|
|
|
869
|
-
queryset = JobResult.objects.
|
|
874
|
+
queryset = JobResult.objects.select_related("job_model", "user")
|
|
870
875
|
serializer_class = serializers.JobResultSerializer
|
|
871
876
|
filterset_class = filters.JobResultFilterSet
|
|
872
877
|
|
|
@@ -903,7 +908,7 @@ class ScheduledJobViewSet(ReadOnlyModelViewSet):
|
|
|
903
908
|
Retrieve a list of scheduled jobs
|
|
904
909
|
"""
|
|
905
910
|
|
|
906
|
-
queryset = ScheduledJob.objects.
|
|
911
|
+
queryset = ScheduledJob.objects.select_related("user")
|
|
907
912
|
serializer_class = serializers.ScheduledJobSerializer
|
|
908
913
|
filterset_class = filters.ScheduledJobFilterSet
|
|
909
914
|
|
|
@@ -1056,7 +1061,7 @@ class MetadataTypeViewSet(NautobotModelViewSet):
|
|
|
1056
1061
|
|
|
1057
1062
|
|
|
1058
1063
|
class MetadataChoiceViewSet(ModelViewSet):
|
|
1059
|
-
queryset = MetadataChoice.objects.
|
|
1064
|
+
queryset = MetadataChoice.objects.select_related("metadata_type")
|
|
1060
1065
|
serializer_class = serializers.MetadataChoiceSerializer
|
|
1061
1066
|
filterset_class = filters.MetadataChoiceFilterSet
|
|
1062
1067
|
|
|
@@ -1073,7 +1078,7 @@ class ObjectMetadataViewSet(NautobotModelViewSet):
|
|
|
1073
1078
|
|
|
1074
1079
|
|
|
1075
1080
|
class NoteViewSet(ModelViewSet):
|
|
1076
|
-
queryset = Note.objects.
|
|
1081
|
+
queryset = Note.objects.select_related("user")
|
|
1077
1082
|
serializer_class = serializers.NoteSerializer
|
|
1078
1083
|
filterset_class = filters.NoteFilterSet
|
|
1079
1084
|
|
|
@@ -1092,7 +1097,7 @@ class ObjectChangeViewSet(ReadOnlyModelViewSet):
|
|
|
1092
1097
|
Retrieve a list of recent changes.
|
|
1093
1098
|
"""
|
|
1094
1099
|
|
|
1095
|
-
queryset = ObjectChange.objects.
|
|
1100
|
+
queryset = ObjectChange.objects.select_related("user")
|
|
1096
1101
|
serializer_class = serializers.ObjectChangeSerializer
|
|
1097
1102
|
filterset_class = filters.ObjectChangeFilterSet
|
|
1098
1103
|
|
nautobot/extras/constants.py
CHANGED
|
@@ -30,7 +30,6 @@ JOB_OVERRIDABLE_FIELDS = (
|
|
|
30
30
|
"soft_time_limit",
|
|
31
31
|
"time_limit",
|
|
32
32
|
"has_sensitive_variables",
|
|
33
|
-
"is_singleton",
|
|
34
33
|
)
|
|
35
34
|
|
|
36
35
|
|
|
@@ -53,5 +52,4 @@ JOB_RESULT_CUSTOM_CELERY_KWARGS = (
|
|
|
53
52
|
"nautobot_job_job_model_id",
|
|
54
53
|
"nautobot_job_scheduled_job_id",
|
|
55
54
|
"nautobot_job_user_id",
|
|
56
|
-
"nautobot_job_ignore_singleton_lock",
|
|
57
55
|
)
|
|
@@ -119,13 +119,13 @@ __all__ = (
|
|
|
119
119
|
"CustomFieldDateFilter",
|
|
120
120
|
"CustomFieldFilterMixin",
|
|
121
121
|
"CustomFieldJSONFilter",
|
|
122
|
-
"CustomFieldModelFilterSet",
|
|
123
|
-
"CustomFieldModelFilterSetMixin",
|
|
124
122
|
"CustomFieldMultiSelectFilter",
|
|
125
123
|
"CustomFieldMultiValueCharFilter",
|
|
126
124
|
"CustomFieldMultiValueDateFilter",
|
|
127
125
|
"CustomFieldMultiValueNumberFilter",
|
|
128
126
|
"CustomFieldNumberFilter",
|
|
127
|
+
"CustomFieldModelFilterSet",
|
|
128
|
+
"CustomFieldModelFilterSetMixin",
|
|
129
129
|
"CustomLinkFilterSet",
|
|
130
130
|
"DynamicGroupFilterSet",
|
|
131
131
|
"DynamicGroupMembershipFilterSet",
|
|
@@ -136,25 +136,25 @@ __all__ = (
|
|
|
136
136
|
"ImageAttachmentFilterSet",
|
|
137
137
|
"JobFilterSet",
|
|
138
138
|
"JobLogEntryFilterSet",
|
|
139
|
-
"JobQueueAssignmentFilterSet",
|
|
140
139
|
"JobQueueFilterSet",
|
|
140
|
+
"JobQueueAssignmentFilterSet",
|
|
141
141
|
"JobResultFilterSet",
|
|
142
142
|
"LocalContextFilterSet",
|
|
143
143
|
"LocalContextModelFilterSetMixin",
|
|
144
|
-
"MetadataChoiceFilterSet",
|
|
145
144
|
"MetadataTypeFilterSet",
|
|
145
|
+
"MetadataChoiceFilterSet",
|
|
146
146
|
"NautobotFilterSet",
|
|
147
147
|
"NoteFilterSet",
|
|
148
148
|
"ObjectChangeFilterSet",
|
|
149
|
-
"RelationshipAssociationFilterSet",
|
|
150
149
|
"RelationshipFilter",
|
|
151
150
|
"RelationshipFilterSet",
|
|
151
|
+
"RelationshipAssociationFilterSet",
|
|
152
152
|
"RoleFilterSet",
|
|
153
153
|
"RoleModelFilterSetMixin",
|
|
154
154
|
"ScheduledJobFilterSet",
|
|
155
155
|
"SecretFilterSet",
|
|
156
|
-
"SecretsGroupAssociationFilterSet",
|
|
157
156
|
"SecretsGroupFilterSet",
|
|
157
|
+
"SecretsGroupAssociationFilterSet",
|
|
158
158
|
"StatusFilter",
|
|
159
159
|
"StatusFilterSet",
|
|
160
160
|
"StatusModelFilterSetMixin",
|
|
@@ -874,7 +874,6 @@ class JobFilterSet(BaseFilterSet, CustomFieldModelFilterSetMixin):
|
|
|
874
874
|
"is_job_button_receiver",
|
|
875
875
|
"soft_time_limit",
|
|
876
876
|
"time_limit",
|
|
877
|
-
"is_singleton",
|
|
878
877
|
"grouping_override",
|
|
879
878
|
"name_override",
|
|
880
879
|
"approval_required_override",
|
|
@@ -884,7 +883,6 @@ class JobFilterSet(BaseFilterSet, CustomFieldModelFilterSetMixin):
|
|
|
884
883
|
"soft_time_limit_override",
|
|
885
884
|
"time_limit_override",
|
|
886
885
|
"has_sensitive_variables_override",
|
|
887
|
-
"is_singleton_override",
|
|
888
886
|
"tags",
|
|
889
887
|
]
|
|
890
888
|
|