nautobot 2.1.0__py3-none-any.whl → 2.1.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.
- nautobot/__init__.py +1 -3
- nautobot/apps/__init__.py +1 -2
- nautobot/apps/admin.py +0 -1
- nautobot/apps/api.py +0 -1
- nautobot/apps/change_logging.py +0 -1
- nautobot/apps/choices.py +0 -1
- nautobot/apps/datasources.py +0 -1
- nautobot/apps/exceptions.py +0 -1
- nautobot/apps/factory.py +0 -1
- nautobot/apps/filters.py +6 -9
- nautobot/apps/forms.py +1 -2
- nautobot/apps/graphql.py +0 -1
- nautobot/apps/jobs.py +0 -1
- nautobot/apps/models.py +1 -2
- nautobot/apps/querysets.py +0 -1
- nautobot/apps/secrets.py +0 -1
- nautobot/apps/tables.py +0 -1
- nautobot/apps/testing.py +0 -1
- nautobot/apps/ui.py +1 -3
- nautobot/apps/urls.py +0 -1
- nautobot/apps/utils.py +0 -1
- nautobot/apps/views.py +0 -1
- nautobot/circuits/api/serializers.py +1 -1
- nautobot/circuits/api/urls.py +1 -1
- nautobot/circuits/api/views.py +2 -1
- nautobot/circuits/apps.py +1 -1
- nautobot/circuits/choices.py +0 -1
- nautobot/circuits/factory.py +1 -1
- nautobot/circuits/filters.py +2 -1
- nautobot/circuits/forms.py +2 -2
- nautobot/circuits/homepage.py +0 -1
- nautobot/circuits/migrations/0001_initial_part_1.py +3 -1
- nautobot/circuits/migrations/0002_initial_part_2.py +2 -1
- nautobot/circuits/migrations/0003_auto_slug.py +1 -0
- nautobot/circuits/migrations/0005_providernetwork.py +4 -2
- nautobot/circuits/migrations/0013_alter_circuittermination__path.py +1 -0
- nautobot/circuits/migrations/0014_related_name_changes.py +1 -0
- nautobot/circuits/migrations/0016_tagsfield.py +1 -0
- nautobot/circuits/migrations/0018_status_nonnullable.py +1 -0
- nautobot/circuits/models.py +2 -2
- nautobot/circuits/navigation.py +0 -1
- nautobot/circuits/signals.py +3 -2
- nautobot/circuits/tables.py +1 -0
- nautobot/circuits/tests/integration/test_relationships.py +1 -1
- nautobot/circuits/tests/test_api.py +1 -1
- nautobot/circuits/tests/test_urls.py +1 -1
- nautobot/circuits/tests/test_views.py +1 -0
- nautobot/circuits/urls.py +1 -1
- nautobot/circuits/views.py +0 -2
- nautobot/core/__init__.py +0 -1
- nautobot/core/admin.py +3 -5
- nautobot/core/api/__init__.py +0 -1
- nautobot/core/api/metadata.py +4 -6
- nautobot/core/api/pagination.py +2 -2
- nautobot/core/api/parsers.py +1 -3
- nautobot/core/api/renderers.py +0 -1
- nautobot/core/api/schema.py +2 -3
- nautobot/core/api/serializers.py +9 -7
- nautobot/core/api/urls.py +1 -5
- nautobot/core/api/utils.py +4 -6
- nautobot/core/api/versioning.py +1 -1
- nautobot/core/api/views.py +22 -91
- nautobot/core/apps/__init__.py +5 -7
- nautobot/core/authentication.py +1 -1
- nautobot/core/celery/__init__.py +1 -2
- nautobot/core/celery/control.py +0 -2
- nautobot/core/celery/encoders.py +0 -1
- nautobot/core/celery/schedulers.py +1 -2
- nautobot/core/celery/task.py +1 -1
- nautobot/core/checks.py +1 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/cli/__init__.py +2 -3
- nautobot/core/context_processors.py +1 -5
- nautobot/core/factory.py +2 -2
- nautobot/core/filters.py +1 -1
- nautobot/core/forms/fields.py +2 -4
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/search.py +1 -1
- nautobot/core/forms/utils.py +1 -1
- nautobot/core/graphql/__init__.py +2 -3
- nautobot/core/graphql/generators.py +1 -1
- nautobot/core/graphql/schema.py +6 -7
- nautobot/core/graphql/schema_init.py +0 -1
- nautobot/core/graphql/utils.py +1 -2
- nautobot/core/management/commands/generate_test_data.py +4 -6
- nautobot/core/management/commands/makemigrations.py +1 -1
- nautobot/core/management/commands/migrate.py +1 -1
- nautobot/core/management/commands/post_upgrade.py +0 -15
- nautobot/core/management/commands/refresh_content_type_cache.py +1 -2
- nautobot/core/management/commands/send_installation_metrics.py +2 -3
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/middleware.py +2 -2
- nautobot/core/models/__init__.py +12 -12
- nautobot/core/models/fields.py +1 -1
- nautobot/core/models/generics.py +2 -3
- nautobot/core/models/managers.py +0 -1
- nautobot/core/models/name_color_content_types.py +2 -2
- nautobot/core/models/tree_queries.py +2 -4
- nautobot/core/models/validators.py +1 -1
- nautobot/core/releases.py +1 -1
- nautobot/core/runner/importer.py +2 -25
- nautobot/core/runner/runner.py +2 -2
- nautobot/core/runner/settings.py +1 -1
- nautobot/core/settings.py +9 -22
- nautobot/core/settings_funcs.py +1 -2
- nautobot/core/signals.py +0 -1
- nautobot/core/tables.py +1 -1
- nautobot/core/templates/graphene/graphiql.html +7 -1
- nautobot/core/templates/inc/footer.html +0 -7
- nautobot/core/templates/nautobot_config.py.j2 +0 -4
- nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
- nautobot/core/templatetags/buttons.py +1 -1
- nautobot/core/templatetags/helpers.py +5 -16
- nautobot/core/testing/__init__.py +1 -2
- nautobot/core/testing/api.py +2 -4
- nautobot/core/testing/filters.py +1 -1
- nautobot/core/testing/integration.py +2 -2
- nautobot/core/testing/migrations.py +1 -0
- nautobot/core/testing/mixins.py +1 -2
- nautobot/core/testing/schema.py +1 -1
- nautobot/core/testing/utils.py +3 -3
- nautobot/core/testing/views.py +4 -7
- nautobot/core/tests/integration/test_plugin_home.py +2 -1
- nautobot/core/tests/integration/test_plugin_navbar.py +1 -1
- nautobot/core/tests/nautobot_config.py +3 -3
- nautobot/core/tests/runner.py +3 -4
- nautobot/core/tests/test_api.py +6 -51
- nautobot/core/tests/test_authentication.py +2 -3
- nautobot/core/tests/test_checks.py +1 -2
- nautobot/core/tests/test_config.py +1 -1
- nautobot/core/tests/test_csv.py +3 -3
- nautobot/core/tests/test_factory.py +1 -3
- nautobot/core/tests/test_filters.py +3 -7
- nautobot/core/tests/test_forms.py +3 -6
- nautobot/core/tests/test_graphql.py +13 -14
- nautobot/core/tests/test_jinja_filters.py +4 -4
- nautobot/core/tests/test_jobs.py +1 -1
- nautobot/core/tests/test_models.py +1 -2
- nautobot/core/tests/test_navigations.py +2 -1
- nautobot/core/tests/test_openapi.py +0 -1
- nautobot/core/tests/test_paginator.py +2 -2
- nautobot/core/tests/test_releases.py +2 -2
- nautobot/core/tests/test_tables.py +1 -1
- nautobot/core/tests/test_templatetags_helpers.py +3 -2
- nautobot/core/tests/test_templatetags_netutils.py +1 -2
- nautobot/core/tests/test_utils.py +4 -8
- nautobot/core/tests/test_views.py +5 -2
- nautobot/core/tests/test_views_utils.py +0 -1
- nautobot/core/urls.py +4 -4
- nautobot/core/utils/color.py +1 -1
- nautobot/core/utils/data.py +1 -2
- nautobot/core/utils/filtering.py +4 -5
- nautobot/core/utils/git.py +3 -2
- nautobot/core/utils/logging.py +2 -1
- nautobot/core/utils/migrations.py +1 -0
- nautobot/core/utils/permissions.py +2 -4
- nautobot/core/views/__init__.py +5 -5
- nautobot/core/views/generic.py +4 -4
- nautobot/core/views/mixins.py +11 -12
- nautobot/core/views/renderers.py +1 -1
- nautobot/core/views/utils.py +2 -1
- nautobot/dcim/api/urls.py +1 -1
- nautobot/dcim/api/views.py +6 -5
- nautobot/dcim/apps.py +1 -1
- nautobot/dcim/choices.py +0 -1
- nautobot/dcim/constants.py +0 -1
- nautobot/dcim/elevations.py +1 -2
- nautobot/dcim/factory.py +10 -13
- nautobot/dcim/fields.py +1 -0
- nautobot/dcim/filters/__init__.py +2 -3
- nautobot/dcim/filters/mixins.py +1 -1
- nautobot/dcim/forms.py +10 -12
- nautobot/dcim/graphql/types.py +16 -17
- nautobot/dcim/migrations/0001_initial_part_1.py +4 -2
- nautobot/dcim/migrations/0002_initial_part_2.py +2 -1
- nautobot/dcim/migrations/0003_initial_part_3.py +2 -1
- nautobot/dcim/migrations/0004_initial_part_4.py +2 -1
- nautobot/dcim/migrations/0006_auto_slug.py +1 -0
- nautobot/dcim/migrations/0009_add_natural_indexing.py +1 -0
- nautobot/dcim/migrations/0010_interface_status.py +1 -0
- nautobot/dcim/migrations/0011_interface_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0013_location_location_type.py +4 -2
- nautobot/dcim/migrations/0014_location_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
- nautobot/dcim/migrations/0018_device_redundancy_group.py +4 -2
- nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0022_interface_redundancy_group.py +3 -1
- nautobot/dcim/migrations/0023_interface_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0024_move_site_fields_to_location_model.py +2 -1
- nautobot/dcim/migrations/0027_alter_interface_mac_address.py +1 -0
- nautobot/dcim/migrations/0028_alter_device_and_rack_role_add_new_role.py +1 -0
- nautobot/dcim/migrations/0029_device_and_rack_roles_data_migrations.py +1 -0
- nautobot/dcim/migrations/0033_add_tree_managers_and_foreign_keys_pre_data_migration.py +1 -0
- nautobot/dcim/migrations/0034_migrate_region_and_site_data_to_locations.py +1 -2
- nautobot/dcim/migrations/0038_fixup_fks_and_related_names.py +1 -0
- nautobot/dcim/migrations/0039_related_name_changes.py +1 -0
- nautobot/dcim/migrations/0042_alter_location_managers.py +1 -0
- nautobot/dcim/migrations/0044_tagsfield.py +1 -0
- nautobot/dcim/migrations/0047_status_nonnullable.py +1 -0
- nautobot/dcim/migrations/0051_interface_redundancy_group_nullable_status.py +1 -0
- nautobot/dcim/models/cables.py +3 -3
- nautobot/dcim/models/device_component_templates.py +6 -6
- nautobot/dcim/models/devices.py +9 -4
- nautobot/dcim/models/locations.py +6 -1
- nautobot/dcim/models/power.py +1 -1
- nautobot/dcim/models/racks.py +5 -4
- nautobot/dcim/navigation.py +0 -1
- nautobot/dcim/signals.py +3 -2
- nautobot/dcim/tables/__init__.py +5 -4
- nautobot/dcim/tables/cables.py +1 -0
- nautobot/dcim/tables/devices.py +1 -0
- nautobot/dcim/tables/power.py +1 -0
- nautobot/dcim/tables/racks.py +2 -1
- nautobot/dcim/tests/test_api.py +5 -7
- nautobot/dcim/tests/test_cablepaths.py +0 -1
- nautobot/dcim/tests/test_filters.py +14 -12
- nautobot/dcim/tests/test_forms.py +2 -3
- nautobot/dcim/tests/test_migrations.py +2 -2
- nautobot/dcim/tests/test_models.py +2 -2
- nautobot/dcim/tests/test_views.py +7 -8
- nautobot/dcim/urls.py +3 -2
- nautobot/dcim/utils.py +1 -1
- nautobot/dcim/views.py +4 -3
- nautobot/extras/admin.py +2 -1
- nautobot/extras/api/customfields.py +0 -2
- nautobot/extras/api/mixins.py +0 -1
- nautobot/extras/api/serializers.py +4 -4
- nautobot/extras/api/urls.py +1 -1
- nautobot/extras/api/views.py +1 -1
- nautobot/extras/apps.py +3 -4
- nautobot/extras/choices.py +3 -4
- nautobot/extras/context_managers.py +1 -1
- nautobot/extras/datasources/__init__.py +1 -1
- nautobot/extras/datasources/git.py +6 -6
- nautobot/extras/datasources/utils.py +0 -1
- nautobot/extras/factory.py +1 -1
- nautobot/extras/filters/__init__.py +2 -3
- nautobot/extras/filters/customfields.py +0 -1
- nautobot/extras/filters/mixins.py +1 -1
- nautobot/extras/forms/__init__.py +3 -4
- nautobot/extras/forms/base.py +1 -1
- nautobot/extras/forms/forms.py +3 -3
- nautobot/extras/forms/mixins.py +1 -1
- nautobot/extras/graphql/types.py +2 -2
- nautobot/extras/health_checks.py +1 -1
- nautobot/extras/jobs.py +1 -2
- nautobot/extras/management/__init__.py +0 -1
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -1
- nautobot/extras/management/commands/runjob.py +3 -3
- nautobot/extras/management/commands/webhook_receiver.py +1 -2
- nautobot/extras/migrations/0001_initial_part_1.py +2 -1
- nautobot/extras/migrations/0002_initial_part_2.py +2 -1
- nautobot/extras/migrations/0003_initial_part_3.py +1 -0
- nautobot/extras/migrations/0006_graphqlquery.py +2 -1
- nautobot/extras/migrations/0007_configcontextschema.py +3 -1
- nautobot/extras/migrations/0009_computedfield.py +3 -1
- nautobot/extras/migrations/0011_fileattachment_fileproxy.py +3 -1
- nautobot/extras/migrations/0012_healthchecktestmodel.py +2 -1
- nautobot/extras/migrations/0014_auto_slug.py +1 -0
- nautobot/extras/migrations/0015_scheduled_job.py +3 -1
- nautobot/extras/migrations/0016_secret.py +4 -2
- nautobot/extras/migrations/0017_joblogentry.py +2 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +2 -1
- nautobot/extras/migrations/0021_customfield_changelog_data.py +3 -2
- nautobot/extras/migrations/0022_objectchange_object_datav2.py +1 -0
- nautobot/extras/migrations/0023_job_model.py +4 -2
- nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +1 -0
- nautobot/extras/migrations/0029_dynamicgroup.py +3 -1
- nautobot/extras/migrations/0031_tag_content_types.py +1 -0
- nautobot/extras/migrations/0032_tag_content_types_data_migration.py +1 -0
- nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +2 -1
- nautobot/extras/migrations/0041_jobresult_job_kwargs.py +1 -0
- nautobot/extras/migrations/0043_note.py +3 -1
- nautobot/extras/migrations/0044_add_job_hook.py +3 -1
- nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +1 -0
- nautobot/extras/migrations/0047_enforce_custom_field_slug.py +1 -0
- nautobot/extras/migrations/0051_add_job_task_queues.py +1 -0
- nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +1 -0
- nautobot/extras/migrations/0057_jobbutton.py +3 -1
- nautobot/extras/migrations/0065_configcontext_data_migrations.py +1 -0
- nautobot/extras/migrations/0067_migrate_job_result_status.py +0 -1
- nautobot/extras/migrations/0068_jobresult__add_celery_fields.py +1 -0
- nautobot/extras/migrations/0071_replace_related_names.py +1 -0
- nautobot/extras/migrations/0077_migrate_custom_field_data.py +1 -0
- nautobot/extras/migrations/0078_remove_name_field_and_make_label_field_non_nullable.py +1 -0
- nautobot/extras/migrations/0080_tagsfield.py +1 -0
- nautobot/extras/migrations/0082_rename_relationship_name_to_label.py +1 -0
- nautobot/extras/migrations/0083_ensure_relationship_keys_are_unique.py +1 -0
- nautobot/extras/migrations/0090_joblogentry__log_level_data_migration.py +0 -1
- nautobot/extras/migrations/0095_ensure_note_timestamps_are_unique.py +4 -5
- nautobot/extras/migrations/0097_alter_job_result_remove_result.py +1 -0
- nautobot/extras/migrations/0100_fileproxy_job_result.py +1 -0
- nautobot/extras/migrations/0101_externalintegration.py +3 -1
- nautobot/extras/models/__init__.py +2 -3
- nautobot/extras/models/change_logging.py +0 -1
- nautobot/extras/models/customfields.py +4 -4
- nautobot/extras/models/datasources.py +2 -2
- nautobot/extras/models/groups.py +3 -4
- nautobot/extras/models/jobs.py +12 -6
- nautobot/extras/models/models.py +2 -2
- nautobot/extras/models/relationships.py +3 -4
- nautobot/extras/models/roles.py +1 -1
- nautobot/extras/models/secrets.py +1 -3
- nautobot/extras/models/tags.py +0 -1
- nautobot/extras/navigation.py +0 -1
- nautobot/extras/plugins/__init__.py +6 -7
- nautobot/extras/plugins/tables.py +0 -1
- nautobot/extras/plugins/utils.py +1 -1
- nautobot/extras/plugins/views.py +1 -2
- nautobot/extras/querysets.py +3 -3
- nautobot/extras/signals.py +6 -7
- nautobot/extras/tables.py +4 -4
- nautobot/extras/tasks.py +1 -2
- nautobot/extras/templates/extras/configcontext_edit.html +1 -1
- nautobot/extras/templates/extras/graphqlquery.html +4 -2
- nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
- nautobot/extras/templatetags/custom_links.py +2 -3
- nautobot/extras/templatetags/job_buttons.py +2 -3
- nautobot/extras/templatetags/log_levels.py +0 -1
- nautobot/extras/templatetags/plugins.py +1 -1
- nautobot/extras/test_jobs/api_test_job.py +1 -2
- nautobot/extras/test_jobs/atomic_transaction.py +1 -2
- nautobot/extras/test_jobs/dry_run.py +1 -2
- nautobot/extras/test_jobs/fail.py +1 -2
- nautobot/extras/test_jobs/field_order.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -2
- nautobot/extras/test_jobs/file_upload_pass.py +1 -2
- nautobot/extras/test_jobs/has_sensitive_variables.py +1 -2
- nautobot/extras/test_jobs/ipaddress_vars.py +1 -4
- nautobot/extras/test_jobs/job_button_receiver.py +1 -2
- nautobot/extras/test_jobs/job_hook_receiver.py +1 -2
- nautobot/extras/test_jobs/job_variables.py +1 -2
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -2
- nautobot/extras/test_jobs/log_redaction.py +1 -2
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -2
- nautobot/extras/test_jobs/modify_db.py +1 -2
- nautobot/extras/test_jobs/object_var_optional.py +1 -2
- nautobot/extras/test_jobs/object_var_required.py +1 -2
- nautobot/extras/test_jobs/object_vars.py +1 -2
- nautobot/extras/test_jobs/pass.py +1 -2
- nautobot/extras/test_jobs/profiling.py +1 -2
- nautobot/extras/tests/integration/__init__.py +1 -1
- nautobot/extras/tests/integration/test_plugins.py +5 -4
- nautobot/extras/tests/integration/test_tagfilter.py +1 -1
- nautobot/extras/tests/test_api.py +7 -9
- nautobot/extras/tests/test_changelog.py +3 -2
- nautobot/extras/tests/test_context_managers.py +6 -3
- nautobot/extras/tests/test_customfields.py +2 -2
- nautobot/extras/tests/test_datasources.py +1 -1
- nautobot/extras/tests/test_dynamicgroups.py +2 -3
- nautobot/extras/tests/test_filters.py +2 -2
- nautobot/extras/tests/test_forms.py +5 -6
- nautobot/extras/tests/test_git.py +1 -1
- nautobot/extras/tests/test_job_variables.py +0 -1
- nautobot/extras/tests/test_jobs.py +5 -5
- nautobot/extras/tests/test_models.py +2 -2
- nautobot/extras/tests/test_notes.py +0 -1
- nautobot/extras/tests/test_plugins.py +8 -9
- nautobot/extras/tests/test_relationships.py +3 -3
- nautobot/extras/tests/test_tags.py +1 -1
- nautobot/extras/tests/test_views.py +8 -9
- nautobot/extras/tests/test_webhooks.py +4 -5
- nautobot/extras/utils.py +11 -9
- nautobot/extras/views.py +3 -3
- nautobot/generate_secret_key.py +1 -1
- nautobot/ipam/api/serializers.py +1 -2
- nautobot/ipam/api/urls.py +1 -1
- nautobot/ipam/api/views.py +1 -0
- nautobot/ipam/apps.py +2 -1
- nautobot/ipam/factory.py +6 -9
- nautobot/ipam/fields.py +1 -1
- nautobot/ipam/filters.py +4 -3
- nautobot/ipam/formfields.py +1 -2
- nautobot/ipam/forms.py +4 -3
- nautobot/ipam/graphql/types.py +1 -1
- nautobot/ipam/homepage.py +0 -1
- nautobot/ipam/lookups.py +2 -3
- nautobot/ipam/migrations/0002_initial_part_2.py +2 -1
- nautobot/ipam/migrations/0003_remove_max_length.py +1 -0
- nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
- nautobot/ipam/migrations/0005_auto_slug.py +1 -0
- nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -0
- nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +1 -0
- nautobot/ipam/migrations/0020_related_name_changes.py +1 -0
- nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +1 -2
- nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +2 -1
- nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +1 -0
- nautobot/ipam/migrations/0028_tagsfield.py +1 -0
- nautobot/ipam/migrations/0030_ipam__namespaces.py +3 -1
- nautobot/ipam/migrations/0034_status_nonnullable.py +1 -0
- nautobot/ipam/migrations/0037_data_migration_vlan_group_name_uniqueness.py +0 -1
- nautobot/ipam/models.py +7 -7
- nautobot/ipam/navigation.py +0 -1
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +4 -3
- nautobot/ipam/tests/test_api.py +2 -2
- nautobot/ipam/tests/test_filters.py +7 -7
- nautobot/ipam/tests/test_migrations.py +1 -2
- nautobot/ipam/tests/test_models.py +2 -2
- nautobot/ipam/tests/test_ordering.py +1 -1
- nautobot/ipam/tests/test_querysets.py +2 -2
- nautobot/ipam/tests/test_views.py +6 -6
- nautobot/ipam/urls.py +1 -0
- nautobot/ipam/utils/migrations.py +0 -1
- nautobot/ipam/views.py +6 -6
- nautobot/project-static/docs/404.html +1 -43
- nautobot/project-static/docs/apps/index.html +1 -43
- nautobot/project-static/docs/apps/nautobot-apps.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +389 -431
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +12 -54
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2452 -2486
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +90 -132
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +26 -68
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +993 -1035
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +170 -212
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1789 -1831
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +961 -1003
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +2 -44
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +6904 -6946
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +974 -1016
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1159 -1197
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1796 -1832
- nautobot/project-static/docs/development/apps/api/configuration-view.html +1 -43
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/global-search.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/graphql.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -45
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +5 -43
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +1 -43
- nautobot/project-static/docs/development/apps/api/prometheus.html +1 -43
- nautobot/project-static/docs/development/apps/api/setup.html +1 -43
- nautobot/project-static/docs/development/apps/api/testing.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/base-template.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +6 -48
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/notes.html +3 -45
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/urls.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5357
- nautobot/project-static/docs/development/apps/index.html +1 -43
- nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -43
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -43
- nautobot/project-static/docs/development/apps/migration/from-v1.html +1 -44
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +1 -43
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +1 -43
- nautobot/project-static/docs/development/core/application-registry.html +1 -43
- nautobot/project-static/docs/development/core/best-practices.html +1 -43
- nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -43
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +1 -43
- nautobot/project-static/docs/development/core/extending-models.html +1 -43
- nautobot/project-static/docs/development/core/generic-views.html +1 -43
- nautobot/project-static/docs/development/core/getting-started.html +108 -257
- nautobot/project-static/docs/development/core/homepage.html +1 -43
- nautobot/project-static/docs/development/core/index.html +1 -43
- nautobot/project-static/docs/development/core/model-features.html +1 -43
- nautobot/project-static/docs/development/core/natural-keys.html +1 -43
- nautobot/project-static/docs/development/core/navigation-menu.html +1 -43
- nautobot/project-static/docs/development/core/react-ui.html +13 -5640
- nautobot/project-static/docs/development/core/release-checklist.html +4 -52
- nautobot/project-static/docs/development/core/role-internals.html +4 -46
- nautobot/project-static/docs/development/core/style-guide.html +61 -102
- nautobot/project-static/docs/development/core/templates.html +4 -46
- nautobot/project-static/docs/development/core/testing.html +1 -43
- nautobot/project-static/docs/development/core/user-preferences.html +1 -43
- nautobot/project-static/docs/development/index.html +1 -43
- nautobot/project-static/docs/development/jobs/index.html +1 -43
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +1 -43
- nautobot/project-static/docs/development/react-ui.html +3 -3
- nautobot/project-static/docs/index.html +2 -47
- nautobot/project-static/docs/release-notes/index.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.0.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.1.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.2.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.3.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.4.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.5.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.6.html +1 -43
- nautobot/project-static/docs/release-notes/version-2.0.html +1 -43
- nautobot/project-static/docs/release-notes/version-2.1.html +189 -77
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +236 -251
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5389
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1 -65
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/index.html +1 -64
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +2 -57
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +5 -94
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -43
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +1 -43
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +1 -43
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +76 -137
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +2 -44
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +23 -79
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +1 -43
- nautobot/project-static/docs/user-guide/index.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +5 -43
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +1 -43
- nautobot/project-static/js/theme.js +0 -5
- nautobot/tenancy/api/urls.py +1 -1
- nautobot/tenancy/api/views.py +1 -0
- nautobot/tenancy/factory.py +2 -2
- nautobot/tenancy/filters/__init__.py +1 -2
- nautobot/tenancy/forms.py +2 -2
- nautobot/tenancy/homepage.py +0 -1
- nautobot/tenancy/migrations/0001_initial.py +2 -1
- nautobot/tenancy/migrations/0002_auto_slug.py +1 -0
- nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +1 -0
- nautobot/tenancy/migrations/0008_tagsfield.py +1 -0
- nautobot/tenancy/models.py +0 -1
- nautobot/tenancy/navigation.py +0 -1
- nautobot/tenancy/tables.py +1 -0
- nautobot/tenancy/tests/test_filters.py +5 -5
- nautobot/tenancy/urls.py +1 -0
- nautobot/tenancy/views.py +2 -2
- nautobot/users/admin.py +1 -2
- nautobot/users/api/urls.py +1 -1
- nautobot/users/api/views.py +6 -4
- nautobot/users/factory.py +1 -3
- nautobot/users/filters.py +4 -4
- nautobot/users/forms.py +1 -0
- nautobot/users/migrations/0004_alter_user_managers.py +1 -0
- nautobot/users/migrations/0008_make_object_permission_a_changelogged_model.py +22 -0
- nautobot/users/models.py +2 -2
- nautobot/users/tests/test_api.py +7 -6
- nautobot/users/tests/test_filters.py +0 -1
- nautobot/users/tests/test_models.py +0 -1
- nautobot/users/tests/test_password_ui.py +1 -1
- nautobot/users/views.py +2 -2
- nautobot/virtualization/api/urls.py +1 -1
- nautobot/virtualization/api/views.py +2 -1
- nautobot/virtualization/apps.py +1 -1
- nautobot/virtualization/choices.py +0 -1
- nautobot/virtualization/factory.py +1 -1
- nautobot/virtualization/filters.py +1 -1
- nautobot/virtualization/forms.py +6 -6
- nautobot/virtualization/homepage.py +0 -1
- nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +1 -0
- nautobot/virtualization/migrations/0004_auto_slug.py +1 -0
- nautobot/virtualization/migrations/0005_add_natural_indexing.py +1 -0
- nautobot/virtualization/migrations/0006_vminterface_status.py +1 -0
- nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +1 -0
- nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +1 -0
- nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -0
- nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +1 -0
- nautobot/virtualization/migrations/0018_related_name_changes.py +1 -0
- nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +1 -0
- nautobot/virtualization/migrations/0025_status_nonnullable.py +1 -0
- nautobot/virtualization/models.py +1 -2
- nautobot/virtualization/navigation.py +0 -1
- nautobot/virtualization/signals.py +0 -1
- nautobot/virtualization/tables.py +1 -0
- nautobot/virtualization/tests/test_filters.py +3 -3
- nautobot/virtualization/tests/test_models.py +1 -1
- nautobot/virtualization/tests/test_views.py +2 -2
- nautobot/virtualization/urls.py +1 -0
- nautobot/virtualization/views.py +1 -1
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/METADATA +1 -1
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/RECORD +713 -814
- nautobot/core/management/commands/build_ui.py +0 -281
- nautobot/core/templates/base_react.html +0 -55
- nautobot/core/tests/test_cli.py +0 -25
- nautobot/ui/.eslintignore +0 -3
- nautobot/ui/.gitignore +0 -7
- nautobot/ui/.prettierignore +0 -6
- nautobot/ui/.prettierrc +0 -4
- nautobot/ui/README.md +0 -27
- nautobot/ui/config/env.js +0 -102
- nautobot/ui/config/getHttpsConfig.js +0 -68
- nautobot/ui/config/jest/babelTransform.js +0 -14
- nautobot/ui/config/jest/cssTransform.js +0 -12
- nautobot/ui/config/jest/fileTransform.js +0 -38
- nautobot/ui/config/modules.js +0 -151
- nautobot/ui/config/paths.js +0 -67
- nautobot/ui/config/webpack/persistentCache/createEnvironmentHash.js +0 -8
- nautobot/ui/config/webpack.config.js +0 -674
- nautobot/ui/config/webpackDevServer.config.js +0 -127
- nautobot/ui/jest.config.js +0 -35
- nautobot/ui/jsconfig.json +0 -4
- nautobot/ui/package-lock.json +0 -22947
- nautobot/ui/package.json +0 -119
- nautobot/ui/public/index.html +0 -47
- nautobot/ui/public/logo192.png +0 -0
- nautobot/ui/public/logo512.png +0 -0
- nautobot/ui/public/manifest.json +0 -25
- nautobot/ui/public/nautobot_logo.svg +0 -131
- nautobot/ui/public/robots.txt +0 -3
- nautobot/ui/scripts/build.js +0 -224
- nautobot/ui/scripts/start.js +0 -140
- nautobot/ui/scripts/test.js +0 -40
- nautobot/ui/src/App.js +0 -79
- nautobot/ui/src/components/AppFullWidthComponents.js +0 -8
- nautobot/ui/src/components/AppTab.js +0 -40
- nautobot/ui/src/components/Apps.js +0 -60
- nautobot/ui/src/components/FeedbackModal.js +0 -123
- nautobot/ui/src/components/FiltersPanel.js +0 -693
- nautobot/ui/src/components/HomeChangelogPanel.js +0 -98
- nautobot/ui/src/components/HomePanel.js +0 -58
- nautobot/ui/src/components/JobHistoryTable.js +0 -78
- nautobot/ui/src/components/Layout.js +0 -76
- nautobot/ui/src/components/LoadingWidget.js +0 -14
- nautobot/ui/src/components/Navbar.js +0 -204
- nautobot/ui/src/components/NotificationPopover.js +0 -27
- nautobot/ui/src/components/ObjectTable/ObjectListTable.js +0 -300
- nautobot/ui/src/components/ObjectTable/ObjectTable.js +0 -96
- nautobot/ui/src/components/ObjectTable/ObjectTableItem.js +0 -70
- nautobot/ui/src/components/ObjectTable/index.js +0 -3
- nautobot/ui/src/components/Pagination/PageNumberForm.js +0 -228
- nautobot/ui/src/components/Pagination/PageSizeForm.js +0 -65
- nautobot/ui/src/components/Pagination/Pagination.js +0 -67
- nautobot/ui/src/components/Pagination/index.js +0 -3
- nautobot/ui/src/components/ReferenceDataTag.js +0 -35
- nautobot/ui/src/components/Retrieve/RenderChangeLogsTab.js +0 -58
- nautobot/ui/src/components/Retrieve/RenderColumn.js +0 -30
- nautobot/ui/src/components/Retrieve/RenderGroup.js +0 -24
- nautobot/ui/src/components/Retrieve/RenderHeader.js +0 -125
- nautobot/ui/src/components/Retrieve/RenderNotesTab.js +0 -60
- nautobot/ui/src/components/Retrieve/RenderTable.js +0 -33
- nautobot/ui/src/components/Retrieve/RenderTabs.js +0 -56
- nautobot/ui/src/components/Retrieve/index.js +0 -7
- nautobot/ui/src/components/RouterButton.js +0 -10
- nautobot/ui/src/components/RouterLink.js +0 -10
- nautobot/ui/src/components/SidebarNav.js +0 -156
- nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +0 -16
- nautobot/ui/src/components/__tests__/AppTab.test.js +0 -21
- nautobot/ui/src/components/__tests__/Apps.test.js +0 -14
- nautobot/ui/src/components/__tests__/Layout.test.js +0 -33
- nautobot/ui/src/components/__tests__/PageSizeForm.test.js +0 -13
- nautobot/ui/src/components/__tests__/Pagination.test.js +0 -43
- nautobot/ui/src/components/__tests__/Table.test.js +0 -39
- nautobot/ui/src/components/__tests__/TableItem.test.js +0 -39
- nautobot/ui/src/components/index.js +0 -4
- nautobot/ui/src/constants/apiPath.js +0 -13
- nautobot/ui/src/constants/icons.js +0 -15
- nautobot/ui/src/constants/size.js +0 -15
- nautobot/ui/src/file_templates/app_imports.js.j2 +0 -7
- nautobot/ui/src/file_templates/jsconfig-base.json +0 -12
- nautobot/ui/src/index.js +0 -65
- nautobot/ui/src/reportWebVitals.js +0 -15
- nautobot/ui/src/router.js +0 -77
- nautobot/ui/src/utils/api.js +0 -160
- nautobot/ui/src/utils/app-import.js +0 -15
- nautobot/ui/src/utils/color.js +0 -15
- nautobot/ui/src/utils/date.js +0 -14
- nautobot/ui/src/utils/index.js +0 -15
- nautobot/ui/src/utils/navigation.js +0 -48
- nautobot/ui/src/utils/session.js +0 -64
- nautobot/ui/src/utils/store.js +0 -242
- nautobot/ui/src/utils/string.js +0 -6
- nautobot/ui/src/utils/url.js +0 -4
- nautobot/ui/src/views/Home.js +0 -142
- nautobot/ui/src/views/InstalledApps.js +0 -80
- nautobot/ui/src/views/Login.js +0 -48
- nautobot/ui/src/views/Logout.js +0 -20
- nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +0 -11
- nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +0 -107
- nautobot/ui/src/views/__tests__/Login.test.js +0 -15
- nautobot/ui/src/views/generic/GenericView.js +0 -191
- nautobot/ui/src/views/generic/ObjectCreate.js +0 -96
- nautobot/ui/src/views/generic/ObjectList.js +0 -137
- nautobot/ui/src/views/generic/ObjectRetrieve.js +0 -87
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
nautobot/core/api/parsers.py
CHANGED
|
@@ -4,13 +4,11 @@ import json
|
|
|
4
4
|
import logging
|
|
5
5
|
|
|
6
6
|
from django.conf import settings
|
|
7
|
-
|
|
8
7
|
from rest_framework import serializers
|
|
9
8
|
from rest_framework.exceptions import ParseError
|
|
10
9
|
from rest_framework.parsers import BaseParser
|
|
11
10
|
|
|
12
|
-
from nautobot.core.constants import
|
|
13
|
-
|
|
11
|
+
from nautobot.core.constants import CSV_NO_OBJECT, CSV_NULL_TYPE
|
|
14
12
|
|
|
15
13
|
logger = logging.getLogger(__name__)
|
|
16
14
|
|
nautobot/core/api/renderers.py
CHANGED
nautobot/core/api/schema.py
CHANGED
|
@@ -15,7 +15,6 @@ from nautobot.core.api import (
|
|
|
15
15
|
WritableNestedSerializer,
|
|
16
16
|
)
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
logger = logging.getLogger(__name__)
|
|
20
19
|
|
|
21
20
|
|
|
@@ -114,7 +113,7 @@ class NautobotAutoSchema(AutoSchema):
|
|
|
114
113
|
}
|
|
115
114
|
|
|
116
115
|
# Inject a custom description for the "id" parameter since ours has custom lookup behavior.
|
|
117
|
-
if "parameters" in operation:
|
|
116
|
+
if operation is not None and "parameters" in operation:
|
|
118
117
|
for param in operation["parameters"]:
|
|
119
118
|
if param["name"] == "id" and "description" not in param:
|
|
120
119
|
param["description"] = "Unique object identifier, either a UUID primary key or a composite key."
|
|
@@ -153,7 +152,7 @@ class NautobotAutoSchema(AutoSchema):
|
|
|
153
152
|
if re.search(r"<drf_format_suffix\w*:\w+>", self.path_regex):
|
|
154
153
|
tokenized_path.append("formatted")
|
|
155
154
|
|
|
156
|
-
return "_".join(tokenized_path
|
|
155
|
+
return "_".join([*tokenized_path, action])
|
|
157
156
|
|
|
158
157
|
# For all other view actions, operation-id is the same as in the base class
|
|
159
158
|
return super().get_operation_id()
|
nautobot/core/api/serializers.py
CHANGED
|
@@ -2,6 +2,8 @@ import contextlib
|
|
|
2
2
|
from copy import deepcopy
|
|
3
3
|
import logging
|
|
4
4
|
import uuid
|
|
5
|
+
|
|
6
|
+
from django.contrib.contenttypes.fields import GenericRel
|
|
5
7
|
from django.contrib.contenttypes.models import ContentType
|
|
6
8
|
from django.core.exceptions import (
|
|
7
9
|
FieldDoesNotExist,
|
|
@@ -10,7 +12,6 @@ from django.core.exceptions import (
|
|
|
10
12
|
ObjectDoesNotExist,
|
|
11
13
|
ValidationError as DjangoValidationError,
|
|
12
14
|
)
|
|
13
|
-
from django.contrib.contenttypes.fields import GenericRel
|
|
14
15
|
from django.db import models
|
|
15
16
|
from django.db.models.fields.related_descriptors import ManyToManyDescriptor
|
|
16
17
|
from django.db.models.functions import Cast
|
|
@@ -18,27 +19,26 @@ from django.urls import NoReverseMatch
|
|
|
18
19
|
from drf_spectacular.types import OpenApiTypes
|
|
19
20
|
from drf_spectacular.utils import extend_schema_field, PolymorphicProxySerializer as _PolymorphicProxySerializer
|
|
20
21
|
from rest_framework import relations as drf_relations, serializers
|
|
21
|
-
from rest_framework.fields import CreateOnlyDefault
|
|
22
22
|
from rest_framework.exceptions import PermissionDenied, ValidationError
|
|
23
|
+
from rest_framework.fields import CreateOnlyDefault
|
|
23
24
|
from rest_framework.reverse import reverse
|
|
24
25
|
from rest_framework.serializers import SerializerMethodField
|
|
25
|
-
from rest_framework.utils.model_meta import
|
|
26
|
-
|
|
26
|
+
from rest_framework.utils.model_meta import _get_to_field, RelationInfo
|
|
27
27
|
|
|
28
|
+
from nautobot.core import constants
|
|
28
29
|
from nautobot.core.api.fields import NautobotHyperlinkedRelatedField, ObjectTypeField
|
|
29
30
|
from nautobot.core.api.utils import (
|
|
30
31
|
dict_to_filter_params,
|
|
31
32
|
nested_serializer_factory,
|
|
32
33
|
)
|
|
33
|
-
from nautobot.core import constants
|
|
34
34
|
from nautobot.core.exceptions import ViewConfigException
|
|
35
35
|
from nautobot.core.models.managers import TagsManager
|
|
36
36
|
from nautobot.core.models.utils import construct_composite_key, construct_natural_slug
|
|
37
37
|
from nautobot.core.templatetags.helpers import bettertitle
|
|
38
38
|
from nautobot.core.utils.lookup import get_route_for_model
|
|
39
39
|
from nautobot.core.utils.requests import normalize_querydict
|
|
40
|
+
from nautobot.extras.api.customfields import CustomFieldDefaultValues, CustomFieldsDataField
|
|
40
41
|
from nautobot.extras.api.relationships import RelationshipsDataField
|
|
41
|
-
from nautobot.extras.api.customfields import CustomFieldsDataField, CustomFieldDefaultValues
|
|
42
42
|
from nautobot.extras.choices import RelationshipSideChoices
|
|
43
43
|
from nautobot.extras.models import RelationshipAssociation, Tag
|
|
44
44
|
from nautobot.ipam.fields import VarbinaryIPField
|
|
@@ -262,7 +262,9 @@ class BaseModelSerializer(OptInFieldsMixin, serializers.HyperlinkedModelSerializ
|
|
|
262
262
|
fields = [
|
|
263
263
|
field
|
|
264
264
|
for field in model._meta.get_fields()
|
|
265
|
-
if field.is_relation
|
|
265
|
+
if field.is_relation
|
|
266
|
+
and not field.many_to_many
|
|
267
|
+
and not field.one_to_many
|
|
266
268
|
# Ignore GenericRel since its `fk` and `content_type` would be used.
|
|
267
269
|
and not isinstance(field, GenericRel)
|
|
268
270
|
]
|
nautobot/core/api/urls.py
CHANGED
|
@@ -12,11 +12,9 @@ from nautobot.core.api.views import (
|
|
|
12
12
|
GetFilterSetFieldLookupExpressionChoicesAPIView,
|
|
13
13
|
GetMenuAPIView,
|
|
14
14
|
GetObjectCountsView,
|
|
15
|
-
GetSettingsView,
|
|
16
15
|
GraphQLDRFAPIView,
|
|
17
|
-
NautobotSpectacularSwaggerView,
|
|
18
16
|
NautobotSpectacularRedocView,
|
|
19
|
-
|
|
17
|
+
NautobotSpectacularSwaggerView,
|
|
20
18
|
StatusView,
|
|
21
19
|
)
|
|
22
20
|
from nautobot.extras.plugins.urls import plugin_api_patterns
|
|
@@ -36,10 +34,8 @@ core_api_patterns = [
|
|
|
36
34
|
ui_api_patterns = [
|
|
37
35
|
# Lookup Expr
|
|
38
36
|
path("core/", include((core_api_patterns, "core-api"))),
|
|
39
|
-
path("new-ui-ready-routes/", NewUIReadyRoutesAPIView.as_view(), name="new-ui-ready-routes"),
|
|
40
37
|
path("get-menu/", GetMenuAPIView.as_view(), name="get-menu"),
|
|
41
38
|
path("get-object-counts/", GetObjectCountsView.as_view(), name="get-object-counts"),
|
|
42
|
-
path("settings/", GetSettingsView.as_view(), name="settings"),
|
|
43
39
|
]
|
|
44
40
|
|
|
45
41
|
urlpatterns = [
|
nautobot/core/api/utils.py
CHANGED
|
@@ -10,11 +10,10 @@ from django.urls import reverse
|
|
|
10
10
|
from rest_framework import serializers, status
|
|
11
11
|
from rest_framework.utils import formatting
|
|
12
12
|
from rest_framework.utils.field_mapping import get_nested_relation_kwargs
|
|
13
|
-
from rest_framework.utils.model_meta import
|
|
13
|
+
from rest_framework.utils.model_meta import _get_to_field, RelationInfo
|
|
14
14
|
|
|
15
15
|
from nautobot.core.api import exceptions
|
|
16
16
|
|
|
17
|
-
|
|
18
17
|
logger = logging.getLogger(__name__)
|
|
19
18
|
|
|
20
19
|
|
|
@@ -216,11 +215,10 @@ def format_output(field, field_value):
|
|
|
216
215
|
"required": False, # Form field placeholder
|
|
217
216
|
}
|
|
218
217
|
# TODO: fix these local imports if at all possible
|
|
219
|
-
from
|
|
220
|
-
from rest_framework.fields import CharField
|
|
221
|
-
from rest_framework.fields import IntegerField
|
|
218
|
+
from rest_framework.fields import CharField, IntegerField
|
|
222
219
|
from rest_framework.serializers import ListSerializer
|
|
223
|
-
|
|
220
|
+
|
|
221
|
+
from nautobot.core.api import ChoiceField, WritableNestedSerializer
|
|
224
222
|
|
|
225
223
|
kwargs = {}
|
|
226
224
|
if isinstance(field_value, (WritableNestedSerializer, ListSerializer)):
|
nautobot/core/api/versioning.py
CHANGED
|
@@ -2,8 +2,8 @@ from django.utils.functional import classproperty
|
|
|
2
2
|
from django.utils.translation import gettext_lazy as _
|
|
3
3
|
from rest_framework import exceptions
|
|
4
4
|
from rest_framework.compat import unicode_http_header
|
|
5
|
-
from rest_framework.utils.mediatypes import _MediaType
|
|
6
5
|
from rest_framework.settings import api_settings
|
|
6
|
+
from rest_framework.utils.mediatypes import _MediaType
|
|
7
7
|
from rest_framework.versioning import AcceptHeaderVersioning
|
|
8
8
|
|
|
9
9
|
|
nautobot/core/api/views.py
CHANGED
|
@@ -1,48 +1,45 @@
|
|
|
1
|
+
from collections import OrderedDict
|
|
1
2
|
import itertools
|
|
2
3
|
import logging
|
|
3
4
|
import platform
|
|
4
|
-
from collections import OrderedDict
|
|
5
|
-
import re
|
|
6
5
|
|
|
7
6
|
from django import __version__ as DJANGO_VERSION, forms
|
|
8
7
|
from django.apps import apps
|
|
9
8
|
from django.conf import settings
|
|
10
9
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
|
11
|
-
from django.http.response import HttpResponseBadRequest
|
|
12
10
|
from django.db import transaction
|
|
13
11
|
from django.db.models import ProtectedError
|
|
12
|
+
from django.http.response import HttpResponseBadRequest
|
|
14
13
|
from django.shortcuts import get_object_or_404, redirect
|
|
15
14
|
from django.urls import NoReverseMatch, reverse as django_reverse
|
|
16
|
-
from rest_framework import status
|
|
17
|
-
from rest_framework.response import Response
|
|
18
|
-
from rest_framework.reverse import reverse
|
|
19
|
-
from rest_framework.views import APIView
|
|
20
|
-
from rest_framework.viewsets import ModelViewSet as ModelViewSet_
|
|
21
|
-
from rest_framework.viewsets import ReadOnlyModelViewSet as ReadOnlyModelViewSet_
|
|
22
|
-
from rest_framework.permissions import AllowAny, IsAuthenticated
|
|
23
|
-
from rest_framework.exceptions import PermissionDenied, ParseError
|
|
24
15
|
from drf_spectacular.plumbing import get_relative_url, set_query_parameters
|
|
25
16
|
from drf_spectacular.renderers import OpenApiJsonRenderer
|
|
26
17
|
from drf_spectacular.utils import extend_schema
|
|
27
|
-
from drf_spectacular.views import
|
|
28
|
-
|
|
18
|
+
from drf_spectacular.views import SpectacularRedocView, SpectacularSwaggerView
|
|
19
|
+
from graphene_django.settings import graphene_settings
|
|
20
|
+
from graphene_django.views import GraphQLView, HttpError, instantiate_middleware
|
|
29
21
|
from graphql import get_default_backend
|
|
30
22
|
from graphql.execution import ExecutionResult
|
|
31
|
-
from graphql.type.schema import GraphQLSchema
|
|
32
23
|
from graphql.execution.middleware import MiddlewareManager
|
|
33
|
-
from
|
|
34
|
-
from
|
|
24
|
+
from graphql.type.schema import GraphQLSchema
|
|
25
|
+
from rest_framework import status
|
|
26
|
+
from rest_framework.exceptions import ParseError, PermissionDenied
|
|
27
|
+
from rest_framework.permissions import AllowAny, IsAuthenticated
|
|
28
|
+
from rest_framework.response import Response
|
|
29
|
+
from rest_framework.reverse import reverse
|
|
30
|
+
from rest_framework.views import APIView
|
|
31
|
+
from rest_framework.viewsets import ModelViewSet as ModelViewSet_, ReadOnlyModelViewSet as ReadOnlyModelViewSet_
|
|
35
32
|
|
|
36
33
|
from nautobot.core.api import BulkOperationSerializer
|
|
37
34
|
from nautobot.core.celery import app as celery_app
|
|
38
35
|
from nautobot.core.exceptions import FilterSetFieldNotFound
|
|
39
|
-
from nautobot.core.utils.config import get_settings_or_config
|
|
40
36
|
from nautobot.core.utils.data import is_uuid
|
|
41
37
|
from nautobot.core.utils.filtering import get_all_lookup_expr_for_field, get_filterset_parameter_form_field
|
|
42
38
|
from nautobot.core.utils.lookup import get_form_for_model, get_route_for_model
|
|
43
39
|
from nautobot.core.utils.permissions import get_permission_for_model
|
|
44
40
|
from nautobot.core.utils.requests import ensure_content_type_and_field_name_in_query_params
|
|
45
41
|
from nautobot.extras.registry import registry
|
|
42
|
+
|
|
46
43
|
from . import serializers
|
|
47
44
|
|
|
48
45
|
HTTP_ACTIONS = {
|
|
@@ -179,10 +176,11 @@ class ModelViewSetMixin:
|
|
|
179
176
|
queryset = self.filter_queryset(self.get_queryset())
|
|
180
177
|
lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
|
|
181
178
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
179
|
+
if lookup_url_kwarg not in self.kwargs:
|
|
180
|
+
raise RuntimeError(
|
|
181
|
+
f"Expected view {self.__class__.__name__} to be called with a URL keyword argument named "
|
|
182
|
+
f'"{lookup_url_kwarg}". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.'
|
|
183
|
+
)
|
|
186
184
|
|
|
187
185
|
if lookup_url_kwarg == "pk" and hasattr(queryset.model, "composite_key"):
|
|
188
186
|
# Support lookup by either PK (UUID) or composite_key
|
|
@@ -487,7 +485,7 @@ class NautobotSpectacularSwaggerView(APIVersioningGetSchemaURLMixin, Spectacular
|
|
|
487
485
|
|
|
488
486
|
format = "openapi"
|
|
489
487
|
|
|
490
|
-
renderer_classes = SpectacularSwaggerView.renderer_classes
|
|
488
|
+
renderer_classes = [*SpectacularSwaggerView.renderer_classes, FakeOpenAPIRenderer]
|
|
491
489
|
|
|
492
490
|
template_name = "swagger_ui.html"
|
|
493
491
|
|
|
@@ -602,7 +600,8 @@ class GraphQLDRFAPIView(NautobotAPIVersionMixin, APIView):
|
|
|
602
600
|
self.executor = self.executor
|
|
603
601
|
self.root_value = self.root_value
|
|
604
602
|
|
|
605
|
-
|
|
603
|
+
if not isinstance(self.graphql_schema, GraphQLSchema):
|
|
604
|
+
raise ValueError("A Schema is required to be provided to GraphQLAPIView.")
|
|
606
605
|
|
|
607
606
|
def get_response(self, request, data):
|
|
608
607
|
"""Extract the information from the request, execute the GraphQL query and form the response.
|
|
@@ -863,42 +862,6 @@ class GetObjectCountsView(NautobotAPIVersionMixin, APIView):
|
|
|
863
862
|
return Response(object_counts)
|
|
864
863
|
|
|
865
864
|
|
|
866
|
-
class GetSettingsView(NautobotAPIVersionMixin, APIView):
|
|
867
|
-
"""
|
|
868
|
-
This view exposes Nautobot settings.
|
|
869
|
-
|
|
870
|
-
Get settings by providing one or more `name` in the query parameters.
|
|
871
|
-
|
|
872
|
-
Example:
|
|
873
|
-
|
|
874
|
-
- /api/settings/?name=FOO # Returns the setting with name 'FOO'
|
|
875
|
-
- /api/settings/?name=FOO&name=BAR # Returns the setting with these names 'FOO' and 'BAR
|
|
876
|
-
"""
|
|
877
|
-
|
|
878
|
-
permission_classes = [IsAuthenticated]
|
|
879
|
-
|
|
880
|
-
@extend_schema(exclude=True)
|
|
881
|
-
def get(self, request):
|
|
882
|
-
# As of now, we just have `allowed_settings` settings. Because the purpose of this API is limited for the time being,
|
|
883
|
-
# we may need more access to serializable and non-serializable settings data as the new UI expands. As a result,
|
|
884
|
-
# exposing all settings data would be desirable in the future.
|
|
885
|
-
# NOTE: When exposing all settings, include a way to limit settings which can be exposed for security concerns
|
|
886
|
-
# e.g `SECRET_KEY`, `NAPALM_PASSWORD` e.t.c. also `allowed_settings` can be moved into settings.py
|
|
887
|
-
allowed_settings = ["FEEDBACK_BUTTON_ENABLED"]
|
|
888
|
-
# Filter out settings_names not allowed to be exposed to the API
|
|
889
|
-
valid_settings = [name for name in request.GET.getlist("name") if name in allowed_settings]
|
|
890
|
-
|
|
891
|
-
invalid_settings = [name for name in request.GET.getlist("name") if name not in allowed_settings]
|
|
892
|
-
if invalid_settings:
|
|
893
|
-
return Response(
|
|
894
|
-
{"error": f"Invalid settings names specified: {', '.join(invalid_settings)}."},
|
|
895
|
-
status=status.HTTP_400_BAD_REQUEST,
|
|
896
|
-
)
|
|
897
|
-
|
|
898
|
-
res = {settings_name: get_settings_or_config(settings_name) for settings_name in valid_settings}
|
|
899
|
-
return Response(res)
|
|
900
|
-
|
|
901
|
-
|
|
902
865
|
#
|
|
903
866
|
# Lookup Expr
|
|
904
867
|
#
|
|
@@ -977,35 +940,3 @@ class GetFilterSetFieldDOMElementAPIView(NautobotAPIVersionMixin, APIView):
|
|
|
977
940
|
else:
|
|
978
941
|
data = bound_field.as_widget()
|
|
979
942
|
return Response(data)
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
class NewUIReadyRoutesAPIView(NautobotAPIVersionMixin, APIView):
|
|
983
|
-
"""API View that returns a list of new UI-ready routes."""
|
|
984
|
-
|
|
985
|
-
permission_classes = [IsAuthenticated]
|
|
986
|
-
|
|
987
|
-
def to_javascript_regex(self, regex_pattern):
|
|
988
|
-
"""
|
|
989
|
-
Convert a Python regex pattern into JavaScript regex format.
|
|
990
|
-
|
|
991
|
-
Args:
|
|
992
|
-
regex_pattern (str): The Python regex pattern to convert.
|
|
993
|
-
|
|
994
|
-
Returns:
|
|
995
|
-
str: The JavaScript-compatible regex pattern.
|
|
996
|
-
"""
|
|
997
|
-
# Remove named groups (?P<...>)
|
|
998
|
-
pattern = re.sub(r"\?P<[a-z]+>", "", regex_pattern)
|
|
999
|
-
|
|
1000
|
-
# Escape `/` with `\`
|
|
1001
|
-
pattern = pattern.replace("/", "\\/")
|
|
1002
|
-
|
|
1003
|
-
# Replace `/Z` with `$`
|
|
1004
|
-
pattern = pattern.replace(r"\Z", "$")
|
|
1005
|
-
|
|
1006
|
-
return pattern
|
|
1007
|
-
|
|
1008
|
-
@extend_schema(exclude=True)
|
|
1009
|
-
def get(self, request):
|
|
1010
|
-
url_regex_patterns = registry["new_ui_ready_routes"]
|
|
1011
|
-
return Response([self.to_javascript_regex(pattern) for pattern in url_regex_patterns])
|
nautobot/core/apps/__init__.py
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import os
|
|
3
|
-
|
|
4
1
|
from abc import ABC, abstractmethod
|
|
5
2
|
from collections import OrderedDict
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
6
5
|
|
|
6
|
+
from constance.apps import ConstanceConfig
|
|
7
7
|
from django.apps import AppConfig, apps as global_apps
|
|
8
8
|
from django.contrib.admin.sites import NotRegistered
|
|
9
|
-
from django.db.models import
|
|
9
|
+
from django.db.models import BigIntegerField, BinaryField, JSONField
|
|
10
10
|
from django.db.models.signals import post_migrate
|
|
11
11
|
from django.urls import reverse
|
|
12
12
|
from django.urls.exceptions import NoReverseMatch
|
|
13
13
|
from django.utils.module_loading import import_string
|
|
14
|
-
|
|
15
|
-
from constance.apps import ConstanceConfig
|
|
16
14
|
from graphene.types import generic, String
|
|
17
15
|
|
|
18
16
|
from nautobot.core.choices import ButtonActionColorChoices, ButtonActionIconChoices
|
|
@@ -20,7 +18,6 @@ from nautobot.core.signals import nautobot_database_ready
|
|
|
20
18
|
from nautobot.core.utils.navigation import get_all_new_ui_ready_routes
|
|
21
19
|
from nautobot.extras.registry import registry
|
|
22
20
|
|
|
23
|
-
|
|
24
21
|
logger = logging.getLogger(__name__)
|
|
25
22
|
registry["nav_menu"] = {"tabs": {}}
|
|
26
23
|
registry["new_ui_nav_menu"] = {}
|
|
@@ -816,6 +813,7 @@ class CoreConfig(NautobotConfig):
|
|
|
816
813
|
library.filter(name=name, fn=func)
|
|
817
814
|
|
|
818
815
|
from graphene_django.converter import convert_django_field
|
|
816
|
+
|
|
819
817
|
from nautobot.core.graphql import BigInteger
|
|
820
818
|
|
|
821
819
|
@convert_django_field.register(JSONField)
|
nautobot/core/authentication.py
CHANGED
nautobot/core/celery/__init__.py
CHANGED
|
@@ -17,11 +17,10 @@ from django.utils.module_loading import import_string
|
|
|
17
17
|
from kombu.serialization import register
|
|
18
18
|
from prometheus_client import CollectorRegistry, multiprocess, start_http_server
|
|
19
19
|
|
|
20
|
-
from nautobot.core.celery.control import discard_git_repository, refresh_git_repository # noqa: F401
|
|
20
|
+
from nautobot.core.celery.control import discard_git_repository, refresh_git_repository # noqa: F401 # unused-import
|
|
21
21
|
from nautobot.core.celery.encoders import NautobotKombuJSONEncoder
|
|
22
22
|
from nautobot.core.celery.log import NautobotDatabaseHandler
|
|
23
23
|
|
|
24
|
-
|
|
25
24
|
logger = logging.getLogger(__name__)
|
|
26
25
|
# The Celery documentation tells us to call setup on the app to initialize
|
|
27
26
|
# settings, but we will NOT be doing that because of a chicken-and-egg problem
|
nautobot/core/celery/control.py
CHANGED
nautobot/core/celery/encoders.py
CHANGED
|
@@ -2,12 +2,11 @@ from collections.abc import Mapping
|
|
|
2
2
|
import logging
|
|
3
3
|
|
|
4
4
|
from celery import current_app
|
|
5
|
-
from django_celery_beat.schedulers import
|
|
5
|
+
from django_celery_beat.schedulers import DatabaseScheduler, ModelEntry
|
|
6
6
|
from kombu.utils.json import loads
|
|
7
7
|
|
|
8
8
|
from nautobot.extras.models import ScheduledJob, ScheduledJobs
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
logger = logging.getLogger(__name__)
|
|
12
11
|
|
|
13
12
|
|
nautobot/core/celery/task.py
CHANGED
nautobot/core/checks.py
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import re
|
|
2
2
|
|
|
3
3
|
from django.conf import settings
|
|
4
|
-
from django.core.checks import
|
|
4
|
+
from django.core.checks import Error, register, Tags, Warning # pylint: disable=redefined-builtin
|
|
5
5
|
from django.core.exceptions import ValidationError
|
|
6
6
|
from django.core.validators import URLValidator
|
|
7
7
|
from django.db import connections
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
E002 = Error(
|
|
11
10
|
"'nautobot.core.authentication.ObjectPermissionBackend' must be included in AUTHENTICATION_BACKENDS",
|
|
12
11
|
id="nautobot.core.E002",
|
nautobot/core/choices.py
CHANGED
nautobot/core/cli/__init__.py
CHANGED
|
@@ -11,7 +11,6 @@ from jinja2 import BaseLoader, Environment
|
|
|
11
11
|
from nautobot.core.runner import run_app
|
|
12
12
|
from nautobot.extras.plugins.utils import load_plugins
|
|
13
13
|
|
|
14
|
-
|
|
15
14
|
# Default file location for the generated config emitted by `init`
|
|
16
15
|
NAUTOBOT_ROOT = os.getenv("NAUTOBOT_ROOT", os.path.expanduser("~/.nautobot"))
|
|
17
16
|
DEFAULT_CONFIG_PATH = os.path.join(NAUTOBOT_ROOT, "nautobot_config.py")
|
|
@@ -73,7 +72,8 @@ def generate_settings(config_template=CONFIG_TEMPLATE, **kwargs):
|
|
|
73
72
|
}
|
|
74
73
|
|
|
75
74
|
with open(config_template) as fh:
|
|
76
|
-
|
|
75
|
+
# We don't need autoescape=True since we control the template file
|
|
76
|
+
environment = Environment(loader=BaseLoader, keep_trailing_newline=True) # noqa: S701 # jinja2-autoescape-false
|
|
77
77
|
config = environment.from_string(fh.read())
|
|
78
78
|
|
|
79
79
|
return config.render(**template_vars)
|
|
@@ -115,7 +115,6 @@ def _configure_settings(config):
|
|
|
115
115
|
os.makedirs(settings.MEDIA_ROOT, exist_ok=True)
|
|
116
116
|
os.makedirs(os.path.join(settings.MEDIA_ROOT, "devicetype-images"), exist_ok=True)
|
|
117
117
|
os.makedirs(os.path.join(settings.MEDIA_ROOT, "image-attachments"), exist_ok=True)
|
|
118
|
-
os.makedirs(os.path.join(settings.NAUTOBOT_UI_DIR, "build", "static"), exist_ok=True)
|
|
119
118
|
os.makedirs(settings.STATIC_ROOT, exist_ok=True)
|
|
120
119
|
|
|
121
120
|
#
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from django.conf import settings as django_settings
|
|
2
2
|
|
|
3
3
|
from nautobot.core.settings_funcs import sso_auth_enabled
|
|
4
|
-
from nautobot.core.utils.navigation import is_route_new_ui_ready
|
|
5
4
|
|
|
6
5
|
|
|
7
6
|
def get_saml_idp():
|
|
@@ -21,7 +20,7 @@ def get_saml_idp():
|
|
|
21
20
|
value = ""
|
|
22
21
|
if idp_map is not None:
|
|
23
22
|
try:
|
|
24
|
-
idp =
|
|
23
|
+
idp = next(iter(idp_map.keys()))
|
|
25
24
|
except IndexError:
|
|
26
25
|
pass
|
|
27
26
|
else:
|
|
@@ -35,9 +34,6 @@ def settings(request):
|
|
|
35
34
|
Expose Django settings in the template context. Example: {{ settings.DEBUG }}
|
|
36
35
|
"""
|
|
37
36
|
root_template = "base_django.html"
|
|
38
|
-
if django_settings.ENABLE_ALPHA_UI:
|
|
39
|
-
use_new_ui = request.COOKIES.get("newui", False) and is_route_new_ui_ready(request.path)
|
|
40
|
-
root_template = "base_react.html" if use_new_ui else "base_django.html"
|
|
41
37
|
return {
|
|
42
38
|
"settings": django_settings,
|
|
43
39
|
"root_template": root_template,
|
nautobot/core/factory.py
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from ipaddress import IPv6Address, IPV6LENGTH, IPv6Network
|
|
2
|
+
import itertools
|
|
2
3
|
|
|
3
4
|
from django.db.models import Model
|
|
4
5
|
import factory
|
|
5
6
|
from factory.django import DjangoModelFactory
|
|
6
|
-
from faker.providers import BaseProvider
|
|
7
7
|
import factory.random
|
|
8
|
-
import
|
|
8
|
+
from faker.providers import BaseProvider
|
|
9
9
|
|
|
10
10
|
from nautobot.core import constants
|
|
11
11
|
from nautobot.extras.models import Tag
|
nautobot/core/filters.py
CHANGED
|
@@ -634,7 +634,7 @@ class BaseFilterSet(django_filters.FilterSet):
|
|
|
634
634
|
if getattr(field, "null", None):
|
|
635
635
|
# Use this method vs extend as the `lookup_map` variable is generally one of
|
|
636
636
|
# the constants which we do not want to update
|
|
637
|
-
lookup_map = dict(lookup_map,
|
|
637
|
+
lookup_map = dict(lookup_map, isnull="isnull")
|
|
638
638
|
|
|
639
639
|
# Create new filters for each lookup expression in the map
|
|
640
640
|
for lookup_name, lookup_expr in lookup_map.items():
|
nautobot/core/forms/fields.py
CHANGED
|
@@ -8,15 +8,13 @@ from django.contrib.contenttypes.models import ContentType
|
|
|
8
8
|
from django.contrib.postgres.forms import SimpleArrayField
|
|
9
9
|
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, ValidationError
|
|
10
10
|
from django.db.models import Q
|
|
11
|
-
from django.forms.fields import BoundField, InvalidJSONInput
|
|
12
|
-
from django.forms.fields import JSONField as _JSONField
|
|
11
|
+
from django.forms.fields import BoundField, InvalidJSONInput, JSONField as _JSONField
|
|
13
12
|
from django.urls import reverse
|
|
14
13
|
import django_filters
|
|
15
14
|
from netaddr import EUI
|
|
16
15
|
from netaddr.core import AddrFormatError
|
|
17
16
|
|
|
18
|
-
from nautobot.core import choices as core_choices
|
|
19
|
-
from nautobot.core import forms
|
|
17
|
+
from nautobot.core import choices as core_choices, forms
|
|
20
18
|
from nautobot.core.forms import widgets
|
|
21
19
|
from nautobot.core.models import validators
|
|
22
20
|
from nautobot.core.utils import data as data_utils, lookup
|
nautobot/core/forms/forms.py
CHANGED
|
@@ -7,7 +7,7 @@ from django.forms import formset_factory
|
|
|
7
7
|
from django.urls import reverse
|
|
8
8
|
import yaml
|
|
9
9
|
|
|
10
|
-
from nautobot.core.utils.filtering import build_lookup_label,
|
|
10
|
+
from nautobot.core.utils.filtering import build_lookup_label, get_filter_field_label, get_filterset_parameter_form_field
|
|
11
11
|
from nautobot.ipam import formfields
|
|
12
12
|
|
|
13
13
|
__all__ = (
|
nautobot/core/forms/search.py
CHANGED
nautobot/core/forms/utils.py
CHANGED
|
@@ -113,7 +113,7 @@ def add_blank_choice(choices):
|
|
|
113
113
|
"""
|
|
114
114
|
Add a blank choice to the beginning of a choices list.
|
|
115
115
|
"""
|
|
116
|
-
return ((None, "---------"),
|
|
116
|
+
return ((None, "---------"), *tuple(choices))
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
def form_from_model(model, fields):
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
from django.test.client import RequestFactory
|
|
2
|
-
|
|
3
|
-
from nautobot.extras.models import GraphQLQuery
|
|
4
|
-
|
|
5
2
|
from graphene.types import Scalar
|
|
6
3
|
from graphene_django.settings import graphene_settings
|
|
7
4
|
from graphql import get_default_backend
|
|
8
5
|
from graphql.language import ast
|
|
9
6
|
|
|
7
|
+
from nautobot.extras.models import GraphQLQuery
|
|
8
|
+
|
|
10
9
|
|
|
11
10
|
def execute_query(query, variables=None, request=None, user=None):
|
|
12
11
|
"""Execute a query from the ORM.
|
|
@@ -7,7 +7,7 @@ import graphene_django_optimizer as gql_optimizer
|
|
|
7
7
|
from graphql import GraphQLError
|
|
8
8
|
|
|
9
9
|
from nautobot.core.graphql.types import OptimizedNautobotObjectType
|
|
10
|
-
from nautobot.core.graphql.utils import
|
|
10
|
+
from nautobot.core.graphql.utils import get_filtering_args_from_filterset, str_to_var_name
|
|
11
11
|
from nautobot.core.utils.lookup import get_filterset_for_model
|
|
12
12
|
from nautobot.extras.choices import RelationshipSideChoices
|
|
13
13
|
from nautobot.extras.models import RelationshipAssociation
|