nautobot 2.4.0b1__py3-none-any.whl → 2.4.2__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/tests/integration/test_circuits_bulk_operations.py +43 -0
- nautobot/circuits/tests/integration/test_relationships.py +1 -1
- 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/apps/__init__.py +0 -5
- 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/generic/object_bulk_destroy.html +1 -1
- 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 +514 -5
- 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 +492 -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/git.py +7 -2
- 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 +136 -41
- nautobot/core/views/renderers.py +6 -6
- nautobot/core/views/utils.py +2 -2
- 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 +48 -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 +9 -6
- nautobot/dcim/tables/devicetypes.py +2 -2
- nautobot/dcim/tables/racks.py +1 -1
- nautobot/dcim/templates/dcim/cable.html +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/base.html +1 -1
- nautobot/dcim/templates/dcim/device.html +3 -11
- nautobot/dcim/templates/dcim/device_component.html +1 -1
- nautobot/dcim/templates/dcim/device_edit.html +36 -37
- nautobot/dcim/templates/dcim/devicetype.html +1 -1
- nautobot/dcim/templates/dcim/location.html +2 -10
- nautobot/dcim/templates/dcim/location_edit.html +1 -7
- nautobot/dcim/templates/dcim/locationtype.html +1 -1
- nautobot/dcim/templates/dcim/locationtype_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/manufacturer.html +1 -1
- nautobot/dcim/templates/dcim/platform.html +1 -1
- nautobot/dcim/templates/dcim/powerfeed.html +1 -1
- nautobot/dcim/templates/dcim/powerpanel.html +1 -1
- nautobot/dcim/templates/dcim/rack.html +2 -10
- nautobot/dcim/templates/dcim/rack_edit.html +1 -7
- nautobot/dcim/templates/dcim/rackgroup.html +1 -1
- nautobot/dcim/templates/dcim/rackreservation.html +3 -11
- nautobot/dcim/templates/dcim/virtualchassis.html +1 -1
- 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_operations.py +30 -0
- nautobot/dcim/tests/integration/test_location_bulk_operations.py +43 -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 +30 -84
- nautobot/dcim/views.py +13 -28
- nautobot/extras/api/customfields.py +2 -2
- nautobot/extras/api/serializers.py +123 -85
- nautobot/extras/api/views.py +33 -30
- nautobot/extras/constants.py +3 -0
- nautobot/extras/datasources/git.py +125 -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/migrations/0122_add_graphqlquery_owner_content_type.py +34 -0
- nautobot/extras/models/__init__.py +1 -1
- nautobot/extras/models/contacts.py +1 -1
- nautobot/extras/models/customfields.py +41 -23
- nautobot/extras/models/datasources.py +85 -0
- nautobot/extras/models/groups.py +11 -9
- nautobot/extras/models/jobs.py +23 -4
- nautobot/extras/models/models.py +17 -2
- nautobot/extras/models/relationships.py +17 -5
- 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/signals.py +15 -1
- nautobot/extras/tables.py +7 -5
- nautobot/extras/templates/extras/computedfield.html +1 -1
- nautobot/extras/templates/extras/configcontext.html +1 -1
- nautobot/extras/templates/extras/configcontextschema.html +1 -1
- nautobot/extras/templates/extras/customfield.html +1 -1
- nautobot/extras/templates/extras/customlink.html +1 -1
- nautobot/extras/templates/extras/dynamicgroup.html +2 -10
- nautobot/extras/templates/extras/exporttemplate.html +1 -1
- nautobot/extras/templates/extras/gitrepository.html +1 -1
- nautobot/extras/templates/extras/graphqlquery.html +1 -1
- nautobot/extras/templates/extras/job_detail.html +17 -1
- nautobot/extras/templates/extras/job_edit.html +1 -0
- nautobot/extras/templates/extras/jobbutton_retrieve.html +1 -1
- nautobot/extras/templates/extras/jobhook.html +1 -1
- nautobot/extras/templates/extras/jobqueue_retrieve.html +1 -9
- nautobot/extras/templates/extras/jobresult.html +1 -1
- nautobot/extras/templates/extras/marketplace.html +29 -11
- nautobot/extras/templates/extras/objectchange.html +1 -1
- nautobot/extras/templates/extras/plugin_detail.html +33 -16
- nautobot/extras/templates/extras/plugins_tiles.html +21 -10
- nautobot/extras/templates/extras/relationship.html +1 -63
- nautobot/extras/templates/extras/role_retrieve.html +1 -1
- nautobot/extras/templates/extras/scheduledjob.html +1 -1
- nautobot/extras/templates/extras/secret.html +1 -1
- nautobot/extras/templates/extras/secretsgroup.html +1 -1
- nautobot/extras/templates/extras/status.html +1 -1
- nautobot/extras/templates/extras/tag.html +1 -1
- nautobot/extras/templates/extras/webhook.html +1 -1
- 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/git_data/01-valid-files/graphql_queries/device_interfaces.gql +8 -0
- nautobot/extras/tests/git_data/01-valid-files/graphql_queries/device_names.gql +5 -0
- nautobot/extras/tests/git_data/02-invalid-files/graphql_queries/bad_device_names.gql +5 -0
- nautobot/extras/tests/git_helper.py +9 -1
- nautobot/extras/tests/integration/__init__.py +29 -16
- nautobot/extras/tests/integration/test_plugin_banner.py +0 -2
- nautobot/extras/tests/test_api.py +19 -13
- nautobot/extras/tests/test_customfields.py +50 -52
- nautobot/extras/tests/test_datasources.py +29 -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 +299 -10
- nautobot/extras/tests/test_plugins.py +62 -9
- nautobot/extras/tests/test_relationships.py +120 -9
- nautobot/extras/tests/test_utils.py +22 -1
- nautobot/extras/tests/test_views.py +56 -194
- nautobot/extras/utils.py +20 -10
- nautobot/extras/views.py +85 -110
- 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 +74 -18
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +25 -9
- nautobot/ipam/templates/ipam/ipaddress.html +2 -10
- 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 +2 -10
- nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
- nautobot/ipam/templates/ipam/rir.html +1 -1
- nautobot/ipam/templates/ipam/routetarget.html +1 -1
- nautobot/ipam/templates/ipam/service.html +1 -1
- nautobot/ipam/templates/ipam/vlan.html +2 -10
- nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
- nautobot/ipam/templates/ipam/vlangroup.html +1 -1
- nautobot/ipam/templates/ipam/vrf.html +1 -1
- 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 +119 -34
- nautobot/ipam/tests/test_querysets.py +63 -1
- nautobot/ipam/tests/test_utils.py +41 -2
- nautobot/ipam/tests/test_views.py +3 -0
- nautobot/ipam/utils/__init__.py +54 -17
- 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 +131 -14
- nautobot/project-static/docs/apps/index.html +131 -14
- nautobot/project-static/docs/apps/nautobot-apps.html +132 -16
- nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
- nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js → bundle.60a45f97.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js.map → bundle.60a45f97.min.js.map} +2 -2
- nautobot/project-static/docs/assets/javascripts/workers/{search.6ce7567c.min.js → search.f8cc74c7.min.js} +1 -1
- nautobot/project-static/docs/assets/javascripts/workers/{search.6ce7567c.min.js.map → search.f8cc74c7.min.js.map} +1 -1
- nautobot/project-static/docs/assets/stylesheets/{main.6f8fc17f.min.css → main.a40c8224.min.css} +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +147 -20
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +144 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +459 -132
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +175 -28
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +180 -31
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +138 -16
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +137 -15
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +164 -27
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +187 -38
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +193 -31
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +216 -48
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +324 -75
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +666 -175
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +194 -46
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +538 -177
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +578 -221
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +145 -18
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +156 -25
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +492 -65
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +705 -215
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +943 -422
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +144 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +619 -200
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +474 -159
- nautobot/project-static/docs/development/apps/api/configuration-view.html +131 -14
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/global-search.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/graphql.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +153 -17
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +131 -14
- nautobot/project-static/docs/development/apps/api/prometheus.html +131 -14
- nautobot/project-static/docs/development/apps/api/setup.html +131 -14
- nautobot/project-static/docs/development/apps/api/testing.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/base-template.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/notes.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +137 -16
- nautobot/project-static/docs/development/apps/api/views/urls.html +131 -14
- nautobot/project-static/docs/development/apps/index.html +131 -14
- nautobot/project-static/docs/development/apps/migration/code-updates.html +131 -14
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +131 -14
- nautobot/project-static/docs/development/apps/migration/from-v1.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +131 -14
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +135 -18
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +131 -14
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +297 -25
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +131 -14
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +131 -14
- nautobot/project-static/docs/development/core/application-registry.html +131 -14
- nautobot/project-static/docs/development/core/best-practices.html +131 -14
- nautobot/project-static/docs/development/core/bootstrap-ui.html +131 -14
- nautobot/project-static/docs/development/core/caching.html +131 -14
- nautobot/project-static/docs/development/core/controllers.html +131 -14
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +158 -84
- nautobot/project-static/docs/development/core/generic-views.html +131 -14
- nautobot/project-static/docs/development/core/getting-started.html +334 -234
- nautobot/project-static/docs/development/core/homepage.html +134 -17
- nautobot/project-static/docs/development/core/index.html +131 -14
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +9829 -0
- nautobot/project-static/docs/development/core/model-checklist.html +141 -22
- nautobot/project-static/docs/development/core/model-features.html +131 -14
- nautobot/project-static/docs/development/core/natural-keys.html +131 -14
- nautobot/project-static/docs/development/core/navigation-menu.html +131 -14
- nautobot/project-static/docs/development/core/release-checklist.html +134 -17
- nautobot/project-static/docs/development/core/role-internals.html +131 -14
- nautobot/project-static/docs/development/core/settings.html +131 -14
- nautobot/project-static/docs/development/core/style-guide.html +134 -17
- nautobot/project-static/docs/development/core/templates.html +132 -15
- nautobot/project-static/docs/development/core/testing.html +131 -14
- nautobot/project-static/docs/development/core/ui-component-framework.html +454 -283
- nautobot/project-static/docs/development/core/user-preferences.html +131 -14
- nautobot/project-static/docs/development/index.html +131 -14
- nautobot/project-static/docs/development/jobs/index.html +301 -132
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +131 -14
- nautobot/project-static/docs/index.html +139 -33
- 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 +132 -17
- nautobot/project-static/docs/overview/design_philosophy.html +131 -14
- nautobot/project-static/docs/release-notes/index.html +137 -22
- nautobot/project-static/docs/release-notes/version-1.0.html +319 -203
- nautobot/project-static/docs/release-notes/version-1.1.html +316 -200
- nautobot/project-static/docs/release-notes/version-1.2.html +391 -275
- nautobot/project-static/docs/release-notes/version-1.3.html +417 -301
- nautobot/project-static/docs/release-notes/version-1.4.html +502 -387
- nautobot/project-static/docs/release-notes/version-1.5.html +690 -576
- nautobot/project-static/docs/release-notes/version-1.6.html +989 -457
- nautobot/project-static/docs/release-notes/version-2.0.html +613 -499
- nautobot/project-static/docs/release-notes/version-2.1.html +448 -334
- nautobot/project-static/docs/release-notes/version-2.2.html +441 -327
- nautobot/project-static/docs/release-notes/version-2.3.html +1171 -451
- nautobot/project-static/docs/release-notes/version-2.4.html +800 -111
- nautobot/project-static/docs/requirements.txt +2 -2
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +303 -287
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +133 -16
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +195 -18
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +134 -17
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +133 -16
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +151 -18
- nautobot/project-static/docs/user-guide/administration/installation/index.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +132 -15
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/services.html +131 -14
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +131 -14
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +131 -14
- nautobot/project-static/docs/user-guide/administration/security/index.html +9420 -0
- nautobot/project-static/docs/user-guide/administration/security/notices.html +9843 -0
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +131 -14
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +134 -18
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +135 -22
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +134 -17
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +134 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +236 -34
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +131 -14
- 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 +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +134 -17
- nautobot/project-static/docs/{development/core/local-k8s.html → user-guide/feature-guides/wireless-networks-and-controllers.html} +632 -566
- nautobot/project-static/docs/user-guide/index.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +135 -18
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +451 -16
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +135 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +134 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9797 -0
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +132 -15
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +179 -35
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +159 -15
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +131 -14
- nautobot/project-static/js/forms.js +1 -1
- nautobot/tenancy/api/views.py +9 -13
- nautobot/tenancy/templates/tenancy/tenant.html +1 -2
- nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
- 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.html +1 -1
- nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
- nautobot/virtualization/templates/virtualization/clustergroup.html +1 -1
- nautobot/virtualization/templates/virtualization/clustertype.html +1 -1
- nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -10
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
- nautobot/virtualization/templates/virtualization/vminterface.html +1 -1
- 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.2.dist-info}/METADATA +9 -9
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/RECORD +667 -610
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/WHEEL +1 -1
- nautobot/core/fixtures/user-data.json +0 -59
- /nautobot/project-static/docs/assets/stylesheets/{main.6f8fc17f.min.css.map → main.a40c8224.min.css.map} +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/NOTICE +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/entry_points.txt +0 -0
nautobot/cloud/api/views.py
CHANGED
|
@@ -9,40 +9,36 @@ from . import serializers
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class CloudAccountViewSet(NautobotModelViewSet):
|
|
12
|
-
queryset = models.CloudAccount.objects.
|
|
12
|
+
queryset = models.CloudAccount.objects.all()
|
|
13
13
|
serializer_class = serializers.CloudAccountSerializer
|
|
14
14
|
filterset_class = filters.CloudAccountFilterSet
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class CloudResourceTypeViewSet(NautobotModelViewSet):
|
|
18
|
-
queryset = models.CloudResourceType.objects.
|
|
18
|
+
queryset = models.CloudResourceType.objects.all()
|
|
19
19
|
serializer_class = serializers.CloudResourceTypeSerializer
|
|
20
20
|
filterset_class = filters.CloudResourceTypeFilterSet
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class CloudNetworkViewSet(NautobotModelViewSet):
|
|
24
|
-
queryset = models.CloudNetwork.objects.
|
|
25
|
-
"cloud_resource_type", "cloud_account", "parent"
|
|
26
|
-
).prefetch_related("prefixes")
|
|
24
|
+
queryset = models.CloudNetwork.objects.all()
|
|
27
25
|
serializer_class = serializers.CloudNetworkSerializer
|
|
28
26
|
filterset_class = filters.CloudNetworkFilterSet
|
|
29
27
|
|
|
30
28
|
|
|
31
29
|
class CloudNetworkPrefixAssignmentViewSet(NautobotModelViewSet):
|
|
32
|
-
queryset = models.CloudNetworkPrefixAssignment.objects.
|
|
30
|
+
queryset = models.CloudNetworkPrefixAssignment.objects.all()
|
|
33
31
|
serializer_class = serializers.CloudNetworkPrefixAssignmentSerializer
|
|
34
32
|
filterset_class = filters.CloudNetworkPrefixAssignmentFilterSet
|
|
35
33
|
|
|
36
34
|
|
|
37
35
|
class CloudServiceViewSet(NautobotModelViewSet):
|
|
38
|
-
queryset = models.CloudService.objects.
|
|
39
|
-
"cloud_networks"
|
|
40
|
-
)
|
|
36
|
+
queryset = models.CloudService.objects.all()
|
|
41
37
|
serializer_class = serializers.CloudServiceSerializer
|
|
42
38
|
filterset_class = filters.CloudServiceFilterSet
|
|
43
39
|
|
|
44
40
|
|
|
45
41
|
class CloudServiceNetworkAssignmentViewSet(NautobotModelViewSet):
|
|
46
|
-
queryset = models.CloudServiceNetworkAssignment.objects.
|
|
42
|
+
queryset = models.CloudServiceNetworkAssignment.objects.all()
|
|
47
43
|
serializer_class = serializers.CloudServiceNetworkAssignmentSerializer
|
|
48
44
|
filterset_class = filters.CloudServiceNetworkAssignmentFilterSet
|
nautobot/cloud/models.py
CHANGED
|
@@ -109,7 +109,7 @@ class CloudResourceTypeMixin(models.Model):
|
|
|
109
109
|
super().clean()
|
|
110
110
|
|
|
111
111
|
# Copied from nautobot.extras.models.models.ConfigContextSchemaValidationMixin
|
|
112
|
-
schema = self.cloud_resource_type.config_schema
|
|
112
|
+
schema = self.cloud_resource_type.config_schema # pylint: disable=no-member
|
|
113
113
|
if schema:
|
|
114
114
|
try:
|
|
115
115
|
Draft7Validator(schema, format_checker=Draft7Validator.FORMAT_CHECKER).validate(self.extra_config)
|
nautobot/cloud/views.py
CHANGED
|
@@ -100,16 +100,6 @@ class CloudNetworkUIViewSet(NautobotUIViewSet):
|
|
|
100
100
|
|
|
101
101
|
return context
|
|
102
102
|
|
|
103
|
-
def extra_post_save_action(self, obj, form):
|
|
104
|
-
if form.cleaned_data.get("add_prefixes", None):
|
|
105
|
-
obj.prefixes.add(*form.cleaned_data["add_prefixes"])
|
|
106
|
-
if form.cleaned_data.get("remove_prefixes", None):
|
|
107
|
-
obj.prefixes.remove(*form.cleaned_data["remove_prefixes"])
|
|
108
|
-
if form.cleaned_data.get("add_cloud_services", None):
|
|
109
|
-
obj.cloud_services.add(*form.cleaned_data["add_cloud_services"])
|
|
110
|
-
if form.cleaned_data.get("remove_cloud_services", None):
|
|
111
|
-
obj.cloud_services.remove(*form.cleaned_data["remove_cloud_services"])
|
|
112
|
-
|
|
113
103
|
|
|
114
104
|
class CloudResourceTypeUIViewSet(NautobotUIViewSet):
|
|
115
105
|
queryset = CloudResourceType.objects.all()
|
|
@@ -173,9 +163,3 @@ class CloudServiceUIViewSet(NautobotUIViewSet):
|
|
|
173
163
|
)
|
|
174
164
|
|
|
175
165
|
return context
|
|
176
|
-
|
|
177
|
-
def extra_post_save_action(self, obj, form):
|
|
178
|
-
if form.cleaned_data.get("add_cloud_networks", None):
|
|
179
|
-
obj.cloud_networks.add(*form.cleaned_data["add_cloud_networks"])
|
|
180
|
-
if form.cleaned_data.get("remove_cloud_networks", None):
|
|
181
|
-
obj.cloud_networks.remove(*form.cleaned_data["remove_cloud_networks"])
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Query parameters that are *not* filterset filters
|
|
2
|
+
NON_FILTER_QUERY_PARAMS = (
|
|
3
|
+
"api_version", # used to select the Nautobot API version
|
|
4
|
+
"depth", # nested levels of the serializers default to depth=0
|
|
5
|
+
"exclude_m2m", # used to exclude many-to-many fields from the REST API
|
|
6
|
+
"format", # "json" or "api", used in the interactive HTML REST API views
|
|
7
|
+
"include", # used to include computed fields, relationships, config-contexts, etc. (excluded by default)
|
|
8
|
+
"limit", # pagination
|
|
9
|
+
"offset", # pagination
|
|
10
|
+
"sort", # sorting of results
|
|
11
|
+
)
|
nautobot/core/api/fields.py
CHANGED
|
@@ -53,10 +53,10 @@ class ChoiceField(serializers.Field):
|
|
|
53
53
|
data = ""
|
|
54
54
|
return super().validate_empty_values(data)
|
|
55
55
|
|
|
56
|
-
def to_representation(self,
|
|
57
|
-
if
|
|
56
|
+
def to_representation(self, value):
|
|
57
|
+
if value == "":
|
|
58
58
|
return None
|
|
59
|
-
return OrderedDict([("value",
|
|
59
|
+
return OrderedDict([("value", value), ("label", self._choices[value])])
|
|
60
60
|
|
|
61
61
|
def to_internal_value(self, data):
|
|
62
62
|
if data == "":
|
|
@@ -123,8 +123,8 @@ class ContentTypeField(RelatedField):
|
|
|
123
123
|
self.fail("invalid")
|
|
124
124
|
return None
|
|
125
125
|
|
|
126
|
-
def to_representation(self,
|
|
127
|
-
return f"{
|
|
126
|
+
def to_representation(self, value):
|
|
127
|
+
return f"{value.app_label}.{value.model}"
|
|
128
128
|
|
|
129
129
|
|
|
130
130
|
class LaxURLField(URLField):
|
|
@@ -2,6 +2,8 @@ from django_filters.rest_framework.backends import DjangoFilterBackend
|
|
|
2
2
|
from rest_framework.filters import OrderingFilter
|
|
3
3
|
from tree_queries.models import TreeNode
|
|
4
4
|
|
|
5
|
+
from nautobot.core.api.constants import NON_FILTER_QUERY_PARAMS
|
|
6
|
+
|
|
5
7
|
|
|
6
8
|
class NautobotFilterBackend(DjangoFilterBackend):
|
|
7
9
|
"""Custom filtering backend for use with django-rest-framework and django-filters."""
|
|
@@ -17,15 +19,7 @@ class NautobotFilterBackend(DjangoFilterBackend):
|
|
|
17
19
|
# The default 'data' is a reference to request.GET, which is immutable; copies of this data are mutable
|
|
18
20
|
data = kwargs["data"].copy()
|
|
19
21
|
|
|
20
|
-
for non_filter_param in
|
|
21
|
-
"api_version", # used to select the Nautobot API version
|
|
22
|
-
"depth", # nested levels of the serializers default to depth=0
|
|
23
|
-
"format", # "json" or "api", used in the interactive HTML REST API views
|
|
24
|
-
"include", # used to include computed fields, relationships, config-contexts, etc. (excluded by default)
|
|
25
|
-
"limit", # pagination
|
|
26
|
-
"offset", # pagination
|
|
27
|
-
"sort", # sorting of results
|
|
28
|
-
):
|
|
22
|
+
for non_filter_param in NON_FILTER_QUERY_PARAMS:
|
|
29
23
|
data.pop(non_filter_param, None)
|
|
30
24
|
|
|
31
25
|
kwargs["data"] = data
|
nautobot/core/api/schema.py
CHANGED
|
@@ -112,13 +112,13 @@ class NautobotAutoSchema(AutoSchema):
|
|
|
112
112
|
"required": True,
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
# Inject a custom description for the "id" parameter since ours has custom lookup behavior.
|
|
116
115
|
if operation is not None and "parameters" in operation:
|
|
117
116
|
for param in operation["parameters"]:
|
|
117
|
+
# Inject a custom description for the "id" parameter since ours has custom lookup behavior.
|
|
118
118
|
if param["name"] == "id" and "description" not in param:
|
|
119
119
|
param["description"] = "Unique object identifier, either a UUID primary key or a composite key."
|
|
120
120
|
if self.method == "GET":
|
|
121
|
-
if "depth"
|
|
121
|
+
if not any(param["name"] == "depth" for param in operation["parameters"]):
|
|
122
122
|
operation["parameters"].append(
|
|
123
123
|
{
|
|
124
124
|
"in": "query",
|
|
@@ -128,6 +128,17 @@ class NautobotAutoSchema(AutoSchema):
|
|
|
128
128
|
"schema": {"type": "integer", "minimum": 0, "maximum": 10, "default": 1},
|
|
129
129
|
}
|
|
130
130
|
)
|
|
131
|
+
if not any(param["name"] == "exclude_m2m" for param in operation["parameters"]):
|
|
132
|
+
operation["parameters"].append(
|
|
133
|
+
{
|
|
134
|
+
"in": "query",
|
|
135
|
+
"name": "exclude_m2m",
|
|
136
|
+
"required": False,
|
|
137
|
+
"description": "Exclude many-to-many fields from the response",
|
|
138
|
+
"schema": {"type": "boolean", "default": False},
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
# TODO: add "include" parameter to the schema where relevant - nautobot/nautobot#685
|
|
131
142
|
return operation
|
|
132
143
|
|
|
133
144
|
def get_operation_id(self):
|
nautobot/core/api/serializers.py
CHANGED
|
@@ -33,6 +33,7 @@ from nautobot.core.api.utils import (
|
|
|
33
33
|
from nautobot.core.models.fields import LaxURLField as LaxURLModelField
|
|
34
34
|
from nautobot.core.models.managers import TagsManager
|
|
35
35
|
from nautobot.core.models.utils import construct_composite_key, construct_natural_slug
|
|
36
|
+
from nautobot.core.settings_funcs import is_truthy
|
|
36
37
|
from nautobot.core.utils.lookup import get_route_for_model
|
|
37
38
|
from nautobot.core.utils.requests import normalize_querydict
|
|
38
39
|
from nautobot.extras.api.customfields import CustomFieldDefaultValues, CustomFieldsDataField
|
|
@@ -46,8 +47,9 @@ logger = logging.getLogger(__name__)
|
|
|
46
47
|
|
|
47
48
|
class OptInFieldsMixin:
|
|
48
49
|
"""
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
Serializer mixin that adjusts its fields based on the `include` and `exclude_m2m` query parameters in a request.
|
|
51
|
+
|
|
52
|
+
The serializer's `Meta.opt_in_fields` controls which fields are influenced by `include`.
|
|
51
53
|
"""
|
|
52
54
|
|
|
53
55
|
def __init__(self, *args, **kwargs):
|
|
@@ -57,8 +59,11 @@ class OptInFieldsMixin:
|
|
|
57
59
|
@property
|
|
58
60
|
def fields(self):
|
|
59
61
|
"""
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
Dynamically adjust the dictionary of fields attributed to this serializer instance.
|
|
63
|
+
|
|
64
|
+
- Removes all serializer fields specified in `Meta.opt_in_fields` list that aren't specified in the
|
|
65
|
+
`include` query parameter. (applies to GET requests only)
|
|
66
|
+
- If the `exclude_m2m` query parameter is truthy, remove all many-to-many serializer fields for performance.
|
|
62
67
|
|
|
63
68
|
As an example, if the serializer specifies that `opt_in_fields = ["computed_fields"]`
|
|
64
69
|
but `computed_fields` is not specified in the `?include` query parameter, `computed_fields` will be popped
|
|
@@ -66,12 +71,7 @@ class OptInFieldsMixin:
|
|
|
66
71
|
"""
|
|
67
72
|
if self.__pruned_fields is None:
|
|
68
73
|
fields = dict(super().fields)
|
|
69
|
-
serializer_opt_in_fields = getattr(self.Meta, "opt_in_fields",
|
|
70
|
-
|
|
71
|
-
if not serializer_opt_in_fields:
|
|
72
|
-
# This serializer has no defined opt_in_fields, so we never need to go further than this
|
|
73
|
-
self.__pruned_fields = fields
|
|
74
|
-
return self.__pruned_fields
|
|
74
|
+
serializer_opt_in_fields = getattr(self.Meta, "opt_in_fields", [])
|
|
75
75
|
|
|
76
76
|
if not hasattr(self, "_context"):
|
|
77
77
|
# We are being called before a request cycle
|
|
@@ -83,24 +83,29 @@ class OptInFieldsMixin:
|
|
|
83
83
|
# No available request?
|
|
84
84
|
return fields
|
|
85
85
|
|
|
86
|
-
# opt-in fields only applies on GET requests, for other methods we support these fields regardless
|
|
87
|
-
if request is not None and request.method != "GET":
|
|
88
|
-
return fields
|
|
89
|
-
|
|
90
86
|
# NOTE: drf test framework builds a request object where the query
|
|
91
87
|
# parameters are found under the GET attribute.
|
|
92
88
|
params = normalize_querydict(getattr(request, "query_params", getattr(request, "GET", None)))
|
|
93
89
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
90
|
+
# opt-in fields only applies on GET requests, for other methods we support these fields regardless
|
|
91
|
+
if request is None or request.method == "GET":
|
|
92
|
+
try:
|
|
93
|
+
user_opt_in_fields = params.get("include", [])
|
|
94
|
+
except AttributeError:
|
|
95
|
+
# include parameter was not specified
|
|
96
|
+
user_opt_in_fields = []
|
|
97
|
+
|
|
98
|
+
# Drop any fields that are not specified in the users opt in fields
|
|
99
|
+
for field in serializer_opt_in_fields:
|
|
100
|
+
if field not in user_opt_in_fields:
|
|
101
|
+
fields.pop(field, None)
|
|
102
|
+
|
|
103
|
+
# If exclude_m2m is present and truthy, mark any many-to-many fields as write-only so they
|
|
104
|
+
# don't get included in the response.
|
|
105
|
+
if is_truthy(params.get("exclude_m2m", "false")):
|
|
106
|
+
for field_instance in fields.values():
|
|
107
|
+
if isinstance(field_instance, (serializers.ManyRelatedField, serializers.ListSerializer)):
|
|
108
|
+
field_instance.write_only = True
|
|
104
109
|
|
|
105
110
|
self.__pruned_fields = fields
|
|
106
111
|
|
|
@@ -131,6 +136,7 @@ class BaseModelSerializer(OptInFieldsMixin, serializers.HyperlinkedModelSerializ
|
|
|
131
136
|
|
|
132
137
|
serializer_related_field = NautobotHyperlinkedRelatedField
|
|
133
138
|
|
|
139
|
+
id = serializers.UUIDField(read_only=False, default=serializers.CreateOnlyDefault(uuid.uuid4))
|
|
134
140
|
display = serializers.SerializerMethodField(read_only=True, help_text="Human friendly display value")
|
|
135
141
|
object_type = ObjectTypeField()
|
|
136
142
|
# composite_key = serializers.SerializerMethodField() # TODO: Revisit if we reintroduce composite keys
|
|
@@ -525,27 +531,27 @@ class ValidatedModelSerializer(BaseModelSerializer):
|
|
|
525
531
|
validation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144)
|
|
526
532
|
"""
|
|
527
533
|
|
|
528
|
-
def validate(self,
|
|
534
|
+
def validate(self, attrs):
|
|
529
535
|
# Remove custom fields data and tags (if any) prior to model validation
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
536
|
+
local_attrs = attrs.copy()
|
|
537
|
+
local_attrs.pop("custom_fields", None)
|
|
538
|
+
local_attrs.pop("relationships", None)
|
|
539
|
+
local_attrs.pop("tags", None)
|
|
534
540
|
|
|
535
541
|
# Skip ManyToManyFields
|
|
536
542
|
for field in self.Meta.model._meta.get_fields():
|
|
537
543
|
if isinstance(field, models.ManyToManyField):
|
|
538
|
-
|
|
544
|
+
local_attrs.pop(field.name, None)
|
|
539
545
|
|
|
540
546
|
# Run clean() on an instance of the model
|
|
541
547
|
if self.instance is None:
|
|
542
|
-
instance = self.Meta.model(**
|
|
548
|
+
instance = self.Meta.model(**local_attrs)
|
|
543
549
|
else:
|
|
544
550
|
instance = self.instance
|
|
545
|
-
for k, v in
|
|
551
|
+
for k, v in local_attrs.items():
|
|
546
552
|
setattr(instance, k, v)
|
|
547
553
|
instance.full_clean()
|
|
548
|
-
return
|
|
554
|
+
return attrs
|
|
549
555
|
|
|
550
556
|
|
|
551
557
|
class WritableNestedSerializer(BaseModelSerializer):
|
|
@@ -591,7 +597,7 @@ class WritableNestedSerializer(BaseModelSerializer):
|
|
|
591
597
|
pk = None
|
|
592
598
|
|
|
593
599
|
if isinstance(self.Meta.model._meta.pk, models.AutoField):
|
|
594
|
-
# PK is an int for this model. This is usually the
|
|
600
|
+
# PK is an int for this model. This is usually the Group or Content-Type model
|
|
595
601
|
try:
|
|
596
602
|
pk = int(data)
|
|
597
603
|
except (TypeError, ValueError):
|
nautobot/core/api/views.py
CHANGED
|
@@ -7,9 +7,11 @@ from django import __version__ as DJANGO_VERSION, forms
|
|
|
7
7
|
from django.apps import apps
|
|
8
8
|
from django.conf import settings
|
|
9
9
|
from django.contrib.contenttypes.models import ContentType
|
|
10
|
-
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
|
10
|
+
from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist, ValidationError
|
|
11
11
|
from django.db import transaction
|
|
12
12
|
from django.db.models import ProtectedError
|
|
13
|
+
from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField
|
|
14
|
+
from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel
|
|
13
15
|
from django.http.response import HttpResponseBadRequest
|
|
14
16
|
from django.shortcuts import get_object_or_404, redirect
|
|
15
17
|
from drf_spectacular.plumbing import get_relative_url, set_query_parameters
|
|
@@ -23,7 +25,7 @@ from graphql.execution import ExecutionResult
|
|
|
23
25
|
from graphql.execution.middleware import MiddlewareManager
|
|
24
26
|
from graphql.type.schema import GraphQLSchema
|
|
25
27
|
import redis.exceptions
|
|
26
|
-
from rest_framework import routers, status
|
|
28
|
+
from rest_framework import routers, serializers as drf_serializers, status
|
|
27
29
|
from rest_framework.exceptions import APIException, ParseError, PermissionDenied
|
|
28
30
|
from rest_framework.generics import GenericAPIView
|
|
29
31
|
from rest_framework.permissions import IsAuthenticated
|
|
@@ -38,9 +40,11 @@ from nautobot.core.api.exceptions import SerializerNotFound
|
|
|
38
40
|
from nautobot.core.api.utils import get_serializer_for_model
|
|
39
41
|
from nautobot.core.celery import app as celery_app
|
|
40
42
|
from nautobot.core.exceptions import FilterSetFieldNotFound
|
|
43
|
+
from nautobot.core.models.fields import TagsField
|
|
41
44
|
from nautobot.core.utils.data import is_uuid, render_jinja2
|
|
42
45
|
from nautobot.core.utils.filtering import get_all_lookup_expr_for_field, get_filterset_parameter_form_field
|
|
43
46
|
from nautobot.core.utils.lookup import get_form_for_model
|
|
47
|
+
from nautobot.core.utils.querysets import maybe_prefetch_related, maybe_select_related
|
|
44
48
|
from nautobot.core.utils.requests import ensure_content_type_and_field_name_in_query_params
|
|
45
49
|
from nautobot.core.views.utils import get_csv_form_fields_from_serializer_class
|
|
46
50
|
|
|
@@ -232,6 +236,53 @@ class ModelViewSetMixin:
|
|
|
232
236
|
|
|
233
237
|
return context
|
|
234
238
|
|
|
239
|
+
def get_queryset(self):
|
|
240
|
+
"""
|
|
241
|
+
Attempt to optimize the queryset based on the fields present in the associated serializer.
|
|
242
|
+
|
|
243
|
+
See similar logic in nautobot.core.tables.BaseTable.
|
|
244
|
+
"""
|
|
245
|
+
queryset = super().get_queryset()
|
|
246
|
+
model = queryset.model
|
|
247
|
+
serializer = self.get_serializer()
|
|
248
|
+
|
|
249
|
+
select_fields = []
|
|
250
|
+
prefetch_fields = []
|
|
251
|
+
|
|
252
|
+
for field_instance in serializer.fields.values():
|
|
253
|
+
if field_instance.write_only:
|
|
254
|
+
continue
|
|
255
|
+
if field_instance.source == "*":
|
|
256
|
+
continue
|
|
257
|
+
if "." in field_instance.source:
|
|
258
|
+
# DRF uses `field.nested_field` instead of `field__nested_field`
|
|
259
|
+
# TODO: We don't currently attempt to optimize nested lookups.
|
|
260
|
+
continue
|
|
261
|
+
if isinstance(field_instance, (drf_serializers.ManyRelatedField, drf_serializers.ListSerializer)):
|
|
262
|
+
# ListSerializer with depth > 0, ManyRelatedField with depth 0
|
|
263
|
+
try:
|
|
264
|
+
model_field = model._meta.get_field(field_instance.source)
|
|
265
|
+
except FieldDoesNotExist:
|
|
266
|
+
continue
|
|
267
|
+
if isinstance(model_field, (ManyToManyField, ManyToManyRel, RelatedField, ManyToOneRel, TagsField)):
|
|
268
|
+
prefetch_fields.append(field_instance.source)
|
|
269
|
+
elif isinstance(field_instance, (drf_serializers.RelatedField, drf_serializers.Serializer)):
|
|
270
|
+
# Serializer with depth > 0, RelatedField with depth 0
|
|
271
|
+
try:
|
|
272
|
+
model_field = model._meta.get_field(field_instance.source)
|
|
273
|
+
except FieldDoesNotExist:
|
|
274
|
+
continue
|
|
275
|
+
if isinstance(model_field, ForeignKey):
|
|
276
|
+
select_fields.append(field_instance.source)
|
|
277
|
+
|
|
278
|
+
if select_fields:
|
|
279
|
+
queryset = maybe_select_related(queryset, select_fields)
|
|
280
|
+
|
|
281
|
+
if prefetch_fields:
|
|
282
|
+
queryset = maybe_prefetch_related(queryset, prefetch_fields)
|
|
283
|
+
|
|
284
|
+
return queryset
|
|
285
|
+
|
|
235
286
|
def restrict_queryset(self, request, *args, **kwargs):
|
|
236
287
|
"""
|
|
237
288
|
Restrict the view's queryset to allow only the permitted objects for the given request.
|
|
@@ -370,7 +421,7 @@ class APIRootView(AuthenticatedAPIRootView):
|
|
|
370
421
|
name = "API Root"
|
|
371
422
|
|
|
372
423
|
@extend_schema(exclude=True)
|
|
373
|
-
def get(self, request, format=None): # pylint: disable=redefined-builtin
|
|
424
|
+
def get(self, request, *args, format=None, **kwargs): # pylint: disable=redefined-builtin
|
|
374
425
|
return Response(
|
|
375
426
|
OrderedDict(
|
|
376
427
|
(
|
|
@@ -577,12 +628,13 @@ class GraphQLDRFAPIView(NautobotAPIVersionMixin, APIView):
|
|
|
577
628
|
middleware = None
|
|
578
629
|
root_value = None
|
|
579
630
|
|
|
580
|
-
def __init__(self, schema=None, executor=None, middleware=None, root_value=None, backend=None):
|
|
631
|
+
def __init__(self, schema=None, executor=None, middleware=None, root_value=None, backend=None, **kwargs):
|
|
581
632
|
self.schema = schema
|
|
582
633
|
self.executor = executor
|
|
583
634
|
self.middleware = middleware
|
|
584
635
|
self.root_value = root_value
|
|
585
636
|
self.backend = backend
|
|
637
|
+
super().__init__(**kwargs)
|
|
586
638
|
|
|
587
639
|
def get_root_value(self, request):
|
|
588
640
|
return self.root_value
|
nautobot/core/apps/__init__.py
CHANGED
|
@@ -367,11 +367,6 @@ class CoreConfig(NautobotConfig):
|
|
|
367
367
|
|
|
368
368
|
super().ready()
|
|
369
369
|
|
|
370
|
-
# Register jobs last after everything else has been done.
|
|
371
|
-
from nautobot.core.celery import import_jobs
|
|
372
|
-
|
|
373
|
-
import_jobs()
|
|
374
|
-
|
|
375
370
|
|
|
376
371
|
class NautobotConstanceConfig(ConstanceConfig):
|
|
377
372
|
"""Override "Constance" app name to "Configuration"."""
|
nautobot/core/celery/log.py
CHANGED
|
@@ -11,6 +11,10 @@ class NautobotDatabaseHandler(logging.Handler):
|
|
|
11
11
|
if current_task is None:
|
|
12
12
|
return
|
|
13
13
|
|
|
14
|
+
# Skip recording the log entry if it has been marked as such
|
|
15
|
+
if getattr(record, "skip_db_logging", False):
|
|
16
|
+
return
|
|
17
|
+
|
|
14
18
|
from nautobot.extras.models.jobs import JobResult
|
|
15
19
|
|
|
16
20
|
try:
|
|
@@ -24,10 +28,6 @@ class NautobotDatabaseHandler(logging.Handler):
|
|
|
24
28
|
# JobResult.DoesNotExist - because we might not have a JobResult with that ID
|
|
25
29
|
return
|
|
26
30
|
|
|
27
|
-
# Skip recording the log entry if it has been marked as such
|
|
28
|
-
if getattr(record, "skip_db_logging", False):
|
|
29
|
-
return
|
|
30
|
-
|
|
31
31
|
job_result.log(
|
|
32
32
|
message=record.message,
|
|
33
33
|
level_choice=record.levelname.lower(),
|
|
@@ -25,7 +25,7 @@ class NautobotScheduleEntry(ModelEntry):
|
|
|
25
25
|
nautobot.extras.models.ScheduledJob model
|
|
26
26
|
"""
|
|
27
27
|
|
|
28
|
-
def __init__(self, model, app=None):
|
|
28
|
+
def __init__(self, model, app=None): # pylint:disable=super-init-not-called # we must copy-and-paste from super
|
|
29
29
|
"""Initialize the model entry."""
|
|
30
30
|
# copy-paste from django_celery_beat.schedulers
|
|
31
31
|
self.app = app or current_app._get_current_object()
|
|
@@ -128,7 +128,7 @@ class NautobotDatabaseScheduler(DatabaseScheduler):
|
|
|
128
128
|
scheduled_job = entry.model
|
|
129
129
|
job_queue = scheduled_job.job_queue
|
|
130
130
|
# Distinguish between Celery and Kubernetes job queues
|
|
131
|
-
if job_queue.queue_type == JobQueueTypeChoices.TYPE_KUBERNETES:
|
|
131
|
+
if job_queue is not None and job_queue.queue_type == JobQueueTypeChoices.TYPE_KUBERNETES:
|
|
132
132
|
job_result = JobResult.objects.create(
|
|
133
133
|
name=scheduled_job.job_model.name,
|
|
134
134
|
job_model=scheduled_job.job_model,
|
nautobot/core/choices.py
CHANGED
|
@@ -182,14 +182,14 @@ class ButtonActionColorChoices(ChoiceSet):
|
|
|
182
182
|
Map standard button actions to Bootstrap color classes.
|
|
183
183
|
"""
|
|
184
184
|
|
|
185
|
-
ADD = "
|
|
185
|
+
ADD = "primary"
|
|
186
186
|
CANCEL = "default"
|
|
187
187
|
CLONE = "success"
|
|
188
188
|
CONFIGURE = "default"
|
|
189
189
|
CONNECT = "success"
|
|
190
190
|
DEFAULT = "default"
|
|
191
191
|
DELETE = "danger"
|
|
192
|
-
DISCONNECT = "
|
|
192
|
+
DISCONNECT = "danger"
|
|
193
193
|
EDIT = "warning"
|
|
194
194
|
EXPORT = "success"
|
|
195
195
|
IMPORT = "primary"
|
nautobot/core/events/__init__.py
CHANGED
|
@@ -107,10 +107,10 @@ def publish_event(*, topic, payload):
|
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
__all__ = (
|
|
110
|
-
"deregister_event_broker",
|
|
111
110
|
"EventBroker",
|
|
112
|
-
"publish_event",
|
|
113
111
|
"RedisEventBroker",
|
|
114
|
-
"register_event_broker",
|
|
115
112
|
"SyslogEventBroker",
|
|
113
|
+
"deregister_event_broker",
|
|
114
|
+
"publish_event",
|
|
115
|
+
"register_event_broker",
|
|
116
116
|
)
|