nautobot 2.4.0b1__py3-none-any.whl → 2.4.1__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 +1 -0
- nautobot/circuits/api/views.py +4 -8
- nautobot/circuits/tables.py +2 -1
- nautobot/circuits/templates/circuits/circuit_create.html +1 -7
- nautobot/circuits/views.py +3 -3
- nautobot/cloud/api/views.py +6 -10
- nautobot/cloud/models.py +1 -1
- nautobot/cloud/views.py +0 -16
- nautobot/core/api/constants.py +11 -0
- nautobot/core/api/fields.py +5 -5
- nautobot/core/api/filter_backends.py +3 -9
- nautobot/core/api/schema.py +13 -2
- nautobot/core/api/serializers.py +40 -34
- nautobot/core/api/views.py +56 -4
- nautobot/core/celery/log.py +4 -4
- nautobot/core/celery/schedulers.py +2 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/events/__init__.py +3 -3
- nautobot/core/filters.py +67 -35
- nautobot/core/forms/__init__.py +19 -19
- nautobot/core/forms/fields.py +14 -11
- nautobot/core/forms/forms.py +33 -2
- nautobot/core/graphql/types.py +1 -1
- nautobot/core/jobs/__init__.py +28 -7
- nautobot/core/jobs/bulk_actions.py +285 -0
- nautobot/core/jobs/cleanup.py +48 -12
- nautobot/core/jobs/groups.py +1 -1
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/models/__init__.py +3 -1
- nautobot/core/models/query_functions.py +2 -2
- nautobot/core/models/tree_queries.py +6 -3
- nautobot/core/settings.py +29 -2
- nautobot/core/settings.yaml +21 -0
- nautobot/core/tables.py +79 -61
- nautobot/core/templates/about.html +67 -0
- nautobot/core/templates/inc/media.html +3 -0
- nautobot/core/templates/inc/nav_menu.html +1 -0
- nautobot/core/templates/inc/tenancy_form_panel.html +9 -0
- nautobot/core/templates/inc/tenant_table_row.html +11 -0
- nautobot/core/templates/nautobot_config.py.j2 +13 -0
- nautobot/core/templates/search.html +7 -0
- 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 +7 -0
- nautobot/core/templatetags/helpers.py +11 -2
- nautobot/core/testing/__init__.py +8 -8
- nautobot/core/testing/api.py +170 -15
- nautobot/core/testing/filters.py +45 -10
- nautobot/core/testing/forms.py +2 -0
- nautobot/core/testing/integration.py +86 -4
- nautobot/core/testing/mixins.py +7 -2
- nautobot/core/testing/views.py +44 -29
- nautobot/core/tests/integration/test_app_home.py +0 -1
- nautobot/core/tests/integration/test_app_navbar.py +0 -1
- nautobot/core/tests/integration/test_filters.py +0 -2
- nautobot/core/tests/integration/test_home.py +0 -1
- nautobot/core/tests/integration/test_navbar.py +0 -1
- nautobot/core/tests/integration/test_view_authentication.py +1 -0
- nautobot/core/tests/runner.py +1 -1
- nautobot/core/tests/test_api.py +98 -1
- nautobot/core/tests/test_csv.py +25 -3
- nautobot/core/tests/test_filters.py +209 -246
- nautobot/core/tests/test_forms.py +1 -0
- nautobot/core/tests/test_jobs.py +460 -1
- nautobot/core/tests/test_models.py +9 -0
- nautobot/core/tests/test_settings_schema.py +7 -0
- nautobot/core/tests/test_tables.py +100 -0
- nautobot/core/tests/test_utils.py +63 -1
- nautobot/core/tests/test_views.py +30 -3
- nautobot/core/ui/nav.py +1 -0
- nautobot/core/ui/object_detail.py +15 -1
- nautobot/core/urls.py +11 -0
- nautobot/core/utils/lookup.py +11 -8
- nautobot/core/utils/querysets.py +64 -0
- nautobot/core/utils/requests.py +24 -9
- nautobot/core/views/__init__.py +42 -0
- nautobot/core/views/generic.py +131 -197
- nautobot/core/views/mixins.py +126 -38
- nautobot/core/views/renderers.py +6 -6
- nautobot/dcim/api/serializers.py +56 -64
- nautobot/dcim/api/views.py +47 -113
- nautobot/dcim/constants.py +6 -13
- nautobot/dcim/factory.py +6 -1
- nautobot/dcim/filters/__init__.py +31 -2
- nautobot/dcim/forms.py +36 -17
- nautobot/dcim/graphql/types.py +2 -2
- nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +25 -0
- nautobot/dcim/models/__init__.py +1 -1
- nautobot/dcim/models/device_component_templates.py +2 -2
- nautobot/dcim/models/device_components.py +22 -20
- nautobot/dcim/models/devices.py +10 -1
- nautobot/dcim/models/locations.py +3 -3
- nautobot/dcim/models/power.py +6 -5
- nautobot/dcim/models/racks.py +4 -4
- nautobot/dcim/tables/__init__.py +3 -3
- nautobot/dcim/tables/devices.py +7 -5
- nautobot/dcim/tables/devicetypes.py +2 -2
- nautobot/dcim/tables/racks.py +1 -1
- nautobot/dcim/templates/dcim/controller_create.html +1 -7
- nautobot/dcim/templates/dcim/controller_retrieve.html +1 -9
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +2 -0
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +5 -0
- nautobot/dcim/templates/dcim/device.html +1 -9
- nautobot/dcim/templates/dcim/device_edit.html +36 -37
- nautobot/dcim/templates/dcim/location.html +1 -9
- nautobot/dcim/templates/dcim/location_edit.html +1 -7
- nautobot/dcim/templates/dcim/rack.html +1 -9
- nautobot/dcim/templates/dcim/rack_edit.html +1 -7
- nautobot/dcim/templates/dcim/rackreservation.html +1 -9
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +1 -9
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +1 -7
- nautobot/dcim/tests/integration/test_controller.py +62 -0
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +71 -0
- nautobot/dcim/tests/integration/test_device_bulk_delete.py +189 -0
- nautobot/dcim/tests/integration/test_device_bulk_edit.py +181 -0
- nautobot/dcim/tests/test_api.py +16 -5
- nautobot/dcim/tests/test_filters.py +33 -0
- nautobot/dcim/tests/test_forms.py +51 -2
- nautobot/dcim/tests/test_graphql.py +52 -0
- nautobot/dcim/tests/test_jobs.py +118 -0
- nautobot/dcim/tests/test_models.py +52 -9
- nautobot/dcim/tests/test_views.py +21 -83
- nautobot/dcim/views.py +1 -13
- nautobot/extras/api/customfields.py +2 -2
- nautobot/extras/api/serializers.py +90 -85
- nautobot/extras/api/views.py +22 -27
- nautobot/extras/constants.py +2 -0
- nautobot/extras/filters/__init__.py +8 -6
- nautobot/extras/forms/base.py +2 -2
- nautobot/extras/forms/forms.py +139 -31
- nautobot/extras/forms/mixins.py +14 -6
- nautobot/extras/group_sync.py +3 -3
- nautobot/extras/health_checks.py +1 -2
- nautobot/extras/jobs.py +85 -18
- nautobot/extras/managers.py +3 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +7 -9
- nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +22 -0
- nautobot/extras/migrations/0121_alter_team_contacts.py +17 -0
- nautobot/extras/models/__init__.py +1 -1
- nautobot/extras/models/contacts.py +1 -1
- nautobot/extras/models/customfields.py +12 -11
- nautobot/extras/models/groups.py +11 -9
- nautobot/extras/models/jobs.py +23 -4
- nautobot/extras/models/models.py +2 -2
- nautobot/extras/plugins/__init__.py +13 -2
- nautobot/extras/plugins/marketplace_manifest.yml +84 -79
- nautobot/extras/plugins/tables.py +16 -14
- nautobot/extras/plugins/views.py +65 -69
- nautobot/extras/registry.py +1 -1
- nautobot/extras/secrets/__init__.py +2 -2
- nautobot/extras/tables.py +7 -5
- nautobot/extras/templates/extras/dynamicgroup.html +1 -9
- nautobot/extras/templates/extras/job_detail.html +16 -0
- nautobot/extras/templates/extras/job_edit.html +1 -0
- nautobot/extras/templates/extras/jobqueue_retrieve.html +1 -9
- nautobot/extras/templates/extras/marketplace.html +29 -11
- nautobot/extras/templates/extras/plugin_detail.html +32 -15
- nautobot/extras/templates/extras/plugins_tiles.html +21 -10
- nautobot/extras/templatetags/job_buttons.py +4 -4
- 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 +3 -1
- 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/singleton.py +16 -0
- 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 +0 -2
- nautobot/extras/tests/test_api.py +13 -13
- nautobot/extras/tests/test_customfields.py +1 -1
- nautobot/extras/tests/test_datasources.py +2 -1
- nautobot/extras/tests/test_dynamicgroups.py +1 -1
- nautobot/extras/tests/test_filters.py +6 -6
- nautobot/extras/tests/test_forms.py +33 -1
- nautobot/extras/tests/test_jobs.py +178 -32
- nautobot/extras/tests/test_models.py +16 -10
- nautobot/extras/tests/test_plugins.py +62 -9
- nautobot/extras/tests/test_relationships.py +120 -9
- nautobot/extras/tests/test_views.py +56 -194
- nautobot/extras/utils.py +3 -2
- nautobot/extras/views.py +30 -98
- nautobot/ipam/api/fields.py +3 -3
- nautobot/ipam/api/serializers.py +41 -33
- nautobot/ipam/api/views.py +68 -117
- nautobot/ipam/factory.py +1 -1
- nautobot/ipam/filters.py +3 -2
- nautobot/ipam/lookups.py +101 -62
- nautobot/ipam/models.py +66 -16
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +23 -7
- nautobot/ipam/templates/ipam/ipaddress.html +1 -9
- nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +1 -7
- nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -7
- nautobot/ipam/templates/ipam/prefix.html +1 -9
- nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
- nautobot/ipam/templates/ipam/vlan.html +1 -9
- nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
- nautobot/ipam/templates/ipam/vrf_edit.html +1 -7
- nautobot/ipam/tests/test_api.py +436 -3
- nautobot/ipam/tests/test_forms.py +49 -47
- nautobot/ipam/tests/test_migrations.py +30 -30
- nautobot/ipam/tests/test_models.py +95 -34
- nautobot/ipam/tests/test_querysets.py +63 -1
- nautobot/ipam/tests/test_views.py +3 -0
- nautobot/ipam/utils/__init__.py +36 -6
- nautobot/ipam/views.py +61 -87
- 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 +40 -2
- 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 +46 -4
- nautobot/project-static/docs/apps/index.html +46 -4
- nautobot/project-static/docs/apps/nautobot-apps.html +47 -6
- nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
- nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js → bundle.88dd0f4e.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js.map → bundle.88dd0f4e.min.js.map} +2 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +62 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +59 -7
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +374 -122
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +90 -18
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +95 -21
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +53 -6
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +52 -5
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +79 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +102 -28
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +108 -21
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +131 -38
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +239 -65
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +581 -165
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +109 -36
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +453 -167
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +493 -211
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +60 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +71 -15
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +407 -55
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +620 -205
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +858 -412
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +59 -7
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +448 -186
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +365 -147
- nautobot/project-static/docs/development/apps/api/configuration-view.html +46 -4
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +46 -4
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +46 -4
- nautobot/project-static/docs/development/apps/api/models/global-search.html +46 -4
- nautobot/project-static/docs/development/apps/api/models/graphql.html +46 -4
- nautobot/project-static/docs/development/apps/api/models/index.html +46 -4
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +46 -4
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +68 -7
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +46 -4
- nautobot/project-static/docs/development/apps/api/prometheus.html +46 -4
- nautobot/project-static/docs/development/apps/api/setup.html +46 -4
- nautobot/project-static/docs/development/apps/api/testing.html +46 -4
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +46 -4
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +46 -4
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +46 -4
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +46 -4
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/base-template.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/index.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/notes.html +46 -4
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +52 -6
- nautobot/project-static/docs/development/apps/api/views/urls.html +46 -4
- nautobot/project-static/docs/development/apps/index.html +46 -4
- nautobot/project-static/docs/development/apps/migration/code-updates.html +46 -4
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +46 -4
- nautobot/project-static/docs/development/apps/migration/from-v1.html +46 -4
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +46 -4
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +46 -4
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +46 -4
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +46 -4
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +50 -8
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +46 -4
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +211 -14
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +46 -4
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +46 -4
- nautobot/project-static/docs/development/core/application-registry.html +46 -4
- nautobot/project-static/docs/development/core/best-practices.html +46 -4
- nautobot/project-static/docs/development/core/bootstrap-ui.html +46 -4
- nautobot/project-static/docs/development/core/caching.html +46 -4
- nautobot/project-static/docs/development/core/controllers.html +46 -4
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +73 -74
- nautobot/project-static/docs/development/core/generic-views.html +46 -4
- nautobot/project-static/docs/development/core/getting-started.html +249 -224
- nautobot/project-static/docs/development/core/homepage.html +49 -7
- nautobot/project-static/docs/development/core/index.html +46 -4
- nautobot/project-static/docs/development/core/{local-k8s.html → minikube-dev-environment-for-k8s-jobs.html} +469 -168
- nautobot/project-static/docs/development/core/model-checklist.html +56 -12
- nautobot/project-static/docs/development/core/model-features.html +46 -4
- nautobot/project-static/docs/development/core/natural-keys.html +46 -4
- nautobot/project-static/docs/development/core/navigation-menu.html +46 -4
- nautobot/project-static/docs/development/core/release-checklist.html +49 -7
- nautobot/project-static/docs/development/core/role-internals.html +46 -4
- nautobot/project-static/docs/development/core/settings.html +46 -4
- nautobot/project-static/docs/development/core/style-guide.html +49 -7
- nautobot/project-static/docs/development/core/templates.html +46 -4
- nautobot/project-static/docs/development/core/testing.html +46 -4
- nautobot/project-static/docs/development/core/ui-component-framework.html +369 -273
- nautobot/project-static/docs/development/core/user-preferences.html +46 -4
- nautobot/project-static/docs/development/index.html +46 -4
- nautobot/project-static/docs/development/jobs/index.html +216 -122
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +46 -4
- nautobot/project-static/docs/index.html +54 -23
- 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/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +47 -7
- nautobot/project-static/docs/overview/design_philosophy.html +46 -4
- nautobot/project-static/docs/release-notes/index.html +52 -12
- nautobot/project-static/docs/release-notes/version-1.0.html +234 -193
- nautobot/project-static/docs/release-notes/version-1.1.html +231 -190
- nautobot/project-static/docs/release-notes/version-1.2.html +306 -265
- nautobot/project-static/docs/release-notes/version-1.3.html +332 -291
- nautobot/project-static/docs/release-notes/version-1.4.html +417 -377
- nautobot/project-static/docs/release-notes/version-1.5.html +605 -566
- nautobot/project-static/docs/release-notes/version-1.6.html +904 -447
- nautobot/project-static/docs/release-notes/version-2.0.html +528 -489
- nautobot/project-static/docs/release-notes/version-2.1.html +363 -324
- nautobot/project-static/docs/release-notes/version-2.2.html +356 -317
- nautobot/project-static/docs/release-notes/version-2.3.html +997 -352
- nautobot/project-static/docs/release-notes/version-2.4.html +525 -101
- nautobot/project-static/docs/requirements.txt +2 -2
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +295 -287
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +46 -4
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +46 -4
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +48 -6
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +46 -4
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +46 -4
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +110 -8
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +46 -4
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +48 -6
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +46 -4
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +46 -4
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +46 -4
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +66 -8
- nautobot/project-static/docs/user-guide/administration/installation/index.html +46 -4
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +47 -5
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +46 -4
- nautobot/project-static/docs/user-guide/administration/installation/services.html +46 -4
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +46 -4
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +46 -4
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +46 -4
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +49 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +46 -4
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +50 -12
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +49 -7
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +46 -4
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +51 -7
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +46 -4
- 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/ip-address-merge-tool.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +46 -4
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +49 -7
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +9444 -0
- nautobot/project-static/docs/user-guide/index.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +50 -8
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +50 -7
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +49 -7
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9722 -0
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +47 -5
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +94 -25
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +74 -5
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +46 -4
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +46 -4
- nautobot/project-static/js/forms.js +1 -1
- nautobot/tenancy/api/views.py +9 -13
- nautobot/tenancy/views.py +4 -2
- nautobot/users/admin.py +1 -1
- nautobot/users/api/serializers.py +5 -4
- nautobot/users/api/views.py +3 -3
- nautobot/virtualization/api/serializers.py +4 -4
- nautobot/virtualization/api/views.py +5 -24
- nautobot/virtualization/filters.py +20 -3
- nautobot/virtualization/models.py +1 -1
- nautobot/virtualization/tables.py +2 -2
- nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
- nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -9
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
- nautobot/virtualization/tests/test_filters.py +17 -0
- nautobot/wireless/filters.py +2 -2
- nautobot/wireless/forms.py +1 -1
- nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +1 -9
- nautobot/wireless/tests/integration/__init__.py +0 -0
- nautobot/wireless/tests/integration/test_radio_profile.py +42 -0
- nautobot/wireless/tests/test_filters.py +29 -1
- nautobot/wireless/tests/test_views.py +22 -1
- nautobot/wireless/views.py +0 -10
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/METADATA +6 -6
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/RECORD +600 -550
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/WHEEL +1 -1
- nautobot/core/fixtures/user-data.json +0 -59
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/NOTICE +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/entry_points.txt +0 -0
nautobot/extras/views.py
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
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
|
|
6
4
|
from django.contrib import messages
|
|
7
5
|
from django.contrib.contenttypes.models import ContentType
|
|
8
6
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
|
@@ -68,10 +66,7 @@ from nautobot.dcim.tables import (
|
|
|
68
66
|
RackTable,
|
|
69
67
|
VirtualDeviceContextTable,
|
|
70
68
|
)
|
|
71
|
-
from nautobot.extras.constants import JOB_OVERRIDABLE_FIELDS
|
|
72
69
|
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
|
|
75
70
|
from nautobot.extras.utils import get_base_template, get_job_queue, get_worker_count
|
|
76
71
|
from nautobot.ipam.models import IPAddress, Prefix, VLAN
|
|
77
72
|
from nautobot.ipam.tables import IPAddressTable, PrefixTable, VLANTable
|
|
@@ -659,37 +654,7 @@ class CustomFieldBulkDeleteView(generic.BulkDeleteView):
|
|
|
659
654
|
queryset = CustomField.objects.all()
|
|
660
655
|
table = tables.CustomFieldTable
|
|
661
656
|
filterset = filters.CustomFieldFilterSet
|
|
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()
|
|
657
|
+
form = forms.CustomFieldBulkDeleteForm
|
|
693
658
|
|
|
694
659
|
|
|
695
660
|
#
|
|
@@ -1097,10 +1062,10 @@ class GitRepositoryEditView(generic.ObjectEditView):
|
|
|
1097
1062
|
obj.user = request.user
|
|
1098
1063
|
return super().alter_obj(obj, request, url_args, url_kwargs)
|
|
1099
1064
|
|
|
1100
|
-
def get_return_url(self, request, obj):
|
|
1065
|
+
def get_return_url(self, request, obj=None, default_return_url=None):
|
|
1101
1066
|
if request.method == "POST":
|
|
1102
1067
|
return reverse("extras:gitrepository_result", kwargs={"pk": obj.pk})
|
|
1103
|
-
return super().get_return_url(request, obj)
|
|
1068
|
+
return super().get_return_url(request, obj=obj, default_return_url=default_return_url)
|
|
1104
1069
|
|
|
1105
1070
|
|
|
1106
1071
|
class GitRepositoryDeleteView(generic.ObjectDeleteView):
|
|
@@ -1248,27 +1213,27 @@ class ImageAttachmentEditView(generic.ObjectEditView):
|
|
|
1248
1213
|
return get_object_or_404(self.queryset, pk=kwargs["pk"])
|
|
1249
1214
|
return self.queryset.model()
|
|
1250
1215
|
|
|
1251
|
-
def alter_obj(self,
|
|
1252
|
-
if not
|
|
1216
|
+
def alter_obj(self, obj, request, url_args, url_kwargs):
|
|
1217
|
+
if not obj.present_in_database:
|
|
1253
1218
|
# Assign the parent object based on URL kwargs
|
|
1254
|
-
model =
|
|
1255
|
-
if "object_id" in
|
|
1256
|
-
|
|
1257
|
-
elif "slug" in
|
|
1258
|
-
|
|
1219
|
+
model = url_kwargs.get("model")
|
|
1220
|
+
if "object_id" in url_kwargs:
|
|
1221
|
+
obj.parent = get_object_or_404(model, pk=url_kwargs["object_id"])
|
|
1222
|
+
elif "slug" in url_kwargs:
|
|
1223
|
+
obj.parent = get_object_or_404(model, slug=url_kwargs["slug"])
|
|
1259
1224
|
else:
|
|
1260
1225
|
raise RuntimeError("Neither object_id nor slug were provided?")
|
|
1261
|
-
return
|
|
1226
|
+
return obj
|
|
1262
1227
|
|
|
1263
|
-
def get_return_url(self, request,
|
|
1264
|
-
return
|
|
1228
|
+
def get_return_url(self, request, obj=None, default_return_url=None):
|
|
1229
|
+
return obj.parent.get_absolute_url()
|
|
1265
1230
|
|
|
1266
1231
|
|
|
1267
1232
|
class ImageAttachmentDeleteView(generic.ObjectDeleteView):
|
|
1268
1233
|
queryset = ImageAttachment.objects.all()
|
|
1269
1234
|
|
|
1270
|
-
def get_return_url(self, request,
|
|
1271
|
-
return
|
|
1235
|
+
def get_return_url(self, request, obj=None, default_return_url=None):
|
|
1236
|
+
return obj.parent.get_absolute_url()
|
|
1272
1237
|
|
|
1273
1238
|
|
|
1274
1239
|
#
|
|
@@ -1365,6 +1330,9 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1365
1330
|
pass
|
|
1366
1331
|
initial["_job_queue"] = jq
|
|
1367
1332
|
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
|
+
)
|
|
1368
1336
|
initial.update(explicit_initial)
|
|
1369
1337
|
except JobResult.DoesNotExist:
|
|
1370
1338
|
messages.warning(
|
|
@@ -1379,7 +1347,9 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1379
1347
|
get_template(job_class.template_name)
|
|
1380
1348
|
template_name = job_class.template_name
|
|
1381
1349
|
except TemplateDoesNotExist as err:
|
|
1382
|
-
messages.error(
|
|
1350
|
+
messages.error(
|
|
1351
|
+
request, f'Unable to render requested custom job template "{job_class.template_name}": {err}'
|
|
1352
|
+
)
|
|
1383
1353
|
except RuntimeError as err:
|
|
1384
1354
|
messages.error(request, f"Unable to run or schedule '{job_model}': {err}")
|
|
1385
1355
|
return redirect("extras:job_list")
|
|
@@ -1447,6 +1417,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1447
1417
|
dryrun = job_form.cleaned_data.get("dryrun", False)
|
|
1448
1418
|
# Run the job. A new JobResult is created.
|
|
1449
1419
|
profile = job_form.cleaned_data.pop("_profile")
|
|
1420
|
+
ignore_singleton_lock = job_form.cleaned_data.pop("_ignore_singleton_lock", False)
|
|
1450
1421
|
schedule_type = schedule_form.cleaned_data["_schedule_type"]
|
|
1451
1422
|
|
|
1452
1423
|
if (not dryrun and job_model.approval_required) or schedule_type in JobExecutionType.SCHEDULE_CHOICES:
|
|
@@ -1460,6 +1431,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1460
1431
|
approval_required=job_model.approval_required,
|
|
1461
1432
|
task_queue=jq.name if jq else None,
|
|
1462
1433
|
profile=profile,
|
|
1434
|
+
ignore_singleton_lock=ignore_singleton_lock,
|
|
1463
1435
|
**job_class.serialize_data(job_form.cleaned_data),
|
|
1464
1436
|
)
|
|
1465
1437
|
|
|
@@ -1477,6 +1449,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1477
1449
|
job_model,
|
|
1478
1450
|
request.user,
|
|
1479
1451
|
profile=profile,
|
|
1452
|
+
ignore_singleton_lock=ignore_singleton_lock,
|
|
1480
1453
|
task_queue=jq.name if jq else None,
|
|
1481
1454
|
**job_class.serialize_data(job_kwargs),
|
|
1482
1455
|
)
|
|
@@ -1502,7 +1475,9 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
|
|
|
1502
1475
|
get_template(job_class.template_name)
|
|
1503
1476
|
template_name = job_class.template_name
|
|
1504
1477
|
except TemplateDoesNotExist as err:
|
|
1505
|
-
messages.error(
|
|
1478
|
+
messages.error(
|
|
1479
|
+
request, f'Unable to render requested custom job template "{job_class.template_name}": {err}'
|
|
1480
|
+
)
|
|
1506
1481
|
|
|
1507
1482
|
return render(
|
|
1508
1483
|
request,
|
|
@@ -1533,52 +1508,6 @@ class JobBulkEditView(generic.BulkEditView):
|
|
|
1533
1508
|
form = forms.JobBulkEditForm
|
|
1534
1509
|
template_name = "extras/job_bulk_edit.html"
|
|
1535
1510
|
|
|
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
|
-
|
|
1582
1511
|
|
|
1583
1512
|
class JobDeleteView(generic.ObjectDeleteView):
|
|
1584
1513
|
queryset = JobModel.objects.all()
|
|
@@ -2098,6 +2027,9 @@ def get_annotated_jobresult_queryset():
|
|
|
2098
2027
|
debug_log_count=count_related(
|
|
2099
2028
|
JobLogEntry, "job_result", filter_dict={"log_level": LogLevelChoices.LOG_DEBUG}
|
|
2100
2029
|
),
|
|
2030
|
+
success_log_count=count_related(
|
|
2031
|
+
JobLogEntry, "job_result", filter_dict={"log_level": LogLevelChoices.LOG_SUCCESS}
|
|
2032
|
+
),
|
|
2101
2033
|
info_log_count=count_related(
|
|
2102
2034
|
JobLogEntry, "job_result", filter_dict={"log_level": LogLevelChoices.LOG_INFO}
|
|
2103
2035
|
),
|
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, data):
|
|
11
11
|
"""Convert API (string) representation to internal (IPNetwork) representation."""
|
|
12
12
|
try:
|
|
13
|
-
return netaddr.IPNetwork(
|
|
13
|
+
return netaddr.IPNetwork(data)
|
|
14
14
|
except netaddr.AddrFormatError:
|
|
15
|
-
raise serializers.ValidationError(f"Invalid IP address format: {
|
|
15
|
+
raise serializers.ValidationError(f"Invalid IP address format: {data}")
|
|
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, attrs):
|
|
66
|
+
if attrs.get("device"):
|
|
67
67
|
validator = UniqueTogetherValidator(queryset=VRFDeviceAssignment.objects.all(), fields=("device", "vrf"))
|
|
68
|
-
validator(
|
|
69
|
-
if
|
|
68
|
+
validator(attrs, self)
|
|
69
|
+
if attrs.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(attrs, self)
|
|
74
|
+
return super().validate(attrs)
|
|
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, attrs):
|
|
137
137
|
# Validate uniqueness of vid and name if a group has been assigned.
|
|
138
|
-
if
|
|
138
|
+
if attrs.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(attrs, self)
|
|
142
142
|
|
|
143
143
|
# Enforce model validation
|
|
144
|
-
super().validate(
|
|
144
|
+
super().validate(attrs)
|
|
145
145
|
|
|
146
|
-
return
|
|
146
|
+
return attrs
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
class VLANLegacySerializer(VLANSerializer):
|
|
@@ -205,6 +205,12 @@ 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
|
+
|
|
208
214
|
class Meta:
|
|
209
215
|
model = Prefix
|
|
210
216
|
fields = "__all__"
|
|
@@ -213,6 +219,7 @@ class PrefixSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
213
219
|
"namespace": {"default": get_default_namespace},
|
|
214
220
|
"prefix_length": {"read_only": True},
|
|
215
221
|
"locations": {"read_only": True},
|
|
222
|
+
"vrfs": {"read_only": True},
|
|
216
223
|
}
|
|
217
224
|
|
|
218
225
|
|
|
@@ -320,16 +327,16 @@ class IPAddressSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
320
327
|
"parent": {"required": False},
|
|
321
328
|
}
|
|
322
329
|
|
|
323
|
-
def validate(self,
|
|
324
|
-
namespace =
|
|
325
|
-
parent =
|
|
330
|
+
def validate(self, attrs):
|
|
331
|
+
namespace = attrs.get("namespace", None)
|
|
332
|
+
parent = attrs.get("parent", None)
|
|
326
333
|
|
|
327
334
|
# Only assert namespace/parent on create.
|
|
328
335
|
if self.instance is None and not any([namespace, parent]):
|
|
329
336
|
raise ValidationError({"__all__": "One of parent or namespace must be provided"})
|
|
330
337
|
|
|
331
|
-
super().validate(
|
|
332
|
-
return
|
|
338
|
+
super().validate(attrs)
|
|
339
|
+
return attrs
|
|
333
340
|
|
|
334
341
|
def get_field_names(self, declared_fields, info):
|
|
335
342
|
"""Add reverse relations to the automatically discovered fields."""
|
|
@@ -379,9 +386,9 @@ class IPAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMixin
|
|
|
379
386
|
"custom_fields",
|
|
380
387
|
)
|
|
381
388
|
|
|
382
|
-
def validate(self,
|
|
383
|
-
|
|
384
|
-
return super().validate(
|
|
389
|
+
def validate(self, attrs):
|
|
390
|
+
attrs["mask_length"] = self.context["prefix"].prefix_length
|
|
391
|
+
return super().validate(attrs)
|
|
385
392
|
|
|
386
393
|
|
|
387
394
|
class VLANAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
@@ -391,12 +398,13 @@ class VLANAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMix
|
|
|
391
398
|
|
|
392
399
|
vid = serializers.IntegerField(required=False, min_value=constants.VLAN_VID_MIN, max_value=constants.VLAN_VID_MAX)
|
|
393
400
|
|
|
394
|
-
def validate(self,
|
|
401
|
+
def validate(self, attrs):
|
|
395
402
|
"""
|
|
396
403
|
Skip `ValidatedModel` validation.
|
|
404
|
+
|
|
397
405
|
This allows to skip `vid` attribute of `VLAN` model, while validate name and status.
|
|
398
406
|
"""
|
|
399
|
-
return
|
|
407
|
+
return attrs
|
|
400
408
|
|
|
401
409
|
class Meta(VLANSerializer.Meta):
|
|
402
410
|
model = VLAN
|
|
@@ -425,19 +433,19 @@ class IPAddressToInterfaceSerializer(ValidatedModelSerializer):
|
|
|
425
433
|
fields = "__all__"
|
|
426
434
|
validators = []
|
|
427
435
|
|
|
428
|
-
def validate(self,
|
|
436
|
+
def validate(self, attrs):
|
|
429
437
|
# Validate uniqueness of (parent, name) since we omitted the automatically created validator from Meta.
|
|
430
|
-
if
|
|
438
|
+
if attrs.get("interface"):
|
|
431
439
|
validator = UniqueTogetherValidator(
|
|
432
440
|
queryset=IPAddressToInterface.objects.all(), fields=("interface", "ip_address")
|
|
433
441
|
)
|
|
434
|
-
validator(
|
|
435
|
-
if
|
|
442
|
+
validator(attrs, self)
|
|
443
|
+
if attrs.get("vm_interface"):
|
|
436
444
|
validator = UniqueTogetherValidator(
|
|
437
445
|
queryset=IPAddressToInterface.objects.all(), fields=("vm_interface", "ip_address")
|
|
438
446
|
)
|
|
439
|
-
validator(
|
|
440
|
-
return super().validate(
|
|
447
|
+
validator(attrs, self)
|
|
448
|
+
return super().validate(attrs)
|
|
441
449
|
|
|
442
450
|
|
|
443
451
|
#
|
|
@@ -464,11 +472,11 @@ class ServiceSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
|
|
|
464
472
|
"virtual_machine": {"help_text": "Required if no device is specified"},
|
|
465
473
|
}
|
|
466
474
|
|
|
467
|
-
def validate(self,
|
|
468
|
-
if
|
|
475
|
+
def validate(self, attrs):
|
|
476
|
+
if attrs.get("device"):
|
|
469
477
|
validator = UniqueTogetherValidator(queryset=Service.objects.all(), fields=("name", "device"))
|
|
470
|
-
validator(
|
|
471
|
-
if
|
|
478
|
+
validator(attrs, self)
|
|
479
|
+
if attrs.get("virtual_machine"):
|
|
472
480
|
validator = UniqueTogetherValidator(queryset=Service.objects.all(), fields=("name", "virtual_machine"))
|
|
473
|
-
validator(
|
|
474
|
-
return super().validate(
|
|
481
|
+
validator(attrs, self)
|
|
482
|
+
return super().validate(attrs)
|