nautobot 2.1.0b1__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 -3
- nautobot/apps/datasources.py +2 -2
- 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 +2 -1
- nautobot/apps/models.py +4 -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 +1 -10
- 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 +14 -15
- 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 +31 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/cli/__init__.py +8 -17
- 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 +2 -2
- nautobot/core/graphql/schema.py +21 -8
- nautobot/core/graphql/schema_init.py +0 -1
- nautobot/core/graphql/types.py +10 -0
- nautobot/core/graphql/utils.py +1 -2
- nautobot/core/management/commands/generate_test_data.py +7 -6
- nautobot/core/management/commands/makemigrations.py +1 -1
- nautobot/core/management/commands/migrate.py +1 -1
- nautobot/core/management/commands/post_upgrade.py +1 -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 +15 -21
- nautobot/core/settings_funcs.py +1 -2
- nautobot/core/signals.py +0 -1
- nautobot/core/tables.py +1 -1
- nautobot/core/templates/admin/base.html +9 -9
- nautobot/core/templates/exceptions/programming_error.html +2 -2
- nautobot/core/templates/graphene/graphiql.html +9 -3
- nautobot/core/templates/home.html +26 -6
- nautobot/core/templates/inc/footer.html +0 -7
- nautobot/core/templates/inc/javascript.html +4 -2
- nautobot/core/templates/inc/media.html +2 -2
- nautobot/core/templates/inc/nav_menu.html +27 -25
- nautobot/core/templates/inc/object_details_advanced_panel.html +12 -0
- nautobot/core/templates/nautobot_config.py.j2 +4 -4
- nautobot/core/templates/utilities/theme_preview.html +883 -0
- nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
- nautobot/core/templatetags/buttons.py +2 -1
- nautobot/core/templatetags/helpers.py +45 -18
- 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 +8 -8
- nautobot/core/tests/integration/test_home.py +1 -1
- nautobot/core/tests/integration/test_navbar.py +2 -2
- nautobot/core/tests/integration/test_plugin_home.py +2 -1
- nautobot/core/tests/integration/test_plugin_navbar.py +6 -6
- 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 +4 -4
- nautobot/core/tests/test_factory.py +1 -3
- nautobot/core/tests/test_filters.py +4 -7
- nautobot/core/tests/test_forms.py +3 -6
- nautobot/core/tests/test_graphql.py +33 -17
- nautobot/core/tests/test_jinja_filters.py +5 -4
- nautobot/core/tests/test_jobs.py +1 -1
- nautobot/core/tests/test_models.py +28 -3
- 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 +17 -2
- nautobot/core/tests/test_templatetags_netutils.py +1 -2
- nautobot/core/tests/test_utils.py +4 -8
- nautobot/core/tests/test_views.py +95 -1
- nautobot/core/tests/test_views_utils.py +0 -1
- nautobot/core/urls.py +24 -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 +6 -2
- nautobot/core/utils/logging.py +2 -1
- nautobot/core/utils/lookup.py +4 -6
- nautobot/core/utils/migrations.py +1 -0
- nautobot/core/utils/permissions.py +2 -4
- nautobot/core/utils/requests.py +10 -0
- nautobot/core/views/__init__.py +32 -8
- nautobot/core/views/generic.py +14 -13
- nautobot/core/views/mixins.py +24 -22
- nautobot/core/views/renderers.py +1 -1
- nautobot/core/views/routers.py +6 -0
- 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 +4 -1
- nautobot/dcim/constants.py +0 -1
- nautobot/dcim/elevations.py +1 -2
- nautobot/dcim/factory.py +125 -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 +37 -44
- 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/locations.py +1 -1
- nautobot/dcim/tables/power.py +1 -0
- nautobot/dcim/tables/racks.py +2 -1
- nautobot/dcim/templates/dcim/device/consoleports.html +2 -2
- nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -2
- nautobot/dcim/templates/dcim/device/devicebays.html +1 -1
- nautobot/dcim/templates/dcim/device/frontports.html +2 -2
- nautobot/dcim/templates/dcim/device/interfaces.html +4 -4
- nautobot/dcim/templates/dcim/device/inventory.html +1 -1
- nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -2
- nautobot/dcim/templates/dcim/device/powerports.html +2 -2
- nautobot/dcim/templates/dcim/device/rearports.html +2 -2
- nautobot/dcim/templates/dcim/inc/location_hierarchy.html +4 -2
- nautobot/dcim/templates/dcim/rack.html +1 -1
- nautobot/dcim/templates/dcim/rack_elevation_list.html +1 -1
- nautobot/dcim/templates/dcim/rackreservation.html +1 -1
- nautobot/dcim/tests/test_api.py +7 -7
- nautobot/dcim/tests/test_cablepaths.py +0 -1
- nautobot/dcim/tests/test_filters.py +16 -13
- nautobot/dcim/tests/test_forms.py +2 -3
- nautobot/dcim/tests/test_graphql.py +1 -0
- nautobot/dcim/tests/test_migrations.py +2 -2
- nautobot/dcim/tests/test_models.py +2 -2
- nautobot/dcim/tests/test_views.py +77 -14
- 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 -18
- nautobot/extras/context_managers.py +1 -1
- nautobot/extras/datasources/__init__.py +3 -1
- nautobot/extras/datasources/git.py +33 -12
- nautobot/extras/datasources/utils.py +0 -1
- nautobot/extras/factory.py +20 -0
- 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 +29 -11
- 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 +43 -25
- 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 +9 -1
- nautobot/extras/models/__init__.py +2 -3
- nautobot/extras/models/change_logging.py +0 -1
- nautobot/extras/models/customfields.py +13 -4
- nautobot/extras/models/datasources.py +2 -2
- nautobot/extras/models/groups.py +3 -4
- nautobot/extras/models/jobs.py +13 -7
- nautobot/extras/models/models.py +61 -24
- nautobot/extras/models/relationships.py +8 -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 +1 -2
- nautobot/extras/plugins/utils.py +1 -1
- nautobot/extras/plugins/views.py +21 -21
- nautobot/extras/querysets.py +30 -13
- nautobot/extras/signals.py +6 -7
- nautobot/extras/tables.py +13 -5
- nautobot/extras/tasks.py +1 -2
- nautobot/extras/templates/extras/configcontext_edit.html +1 -1
- nautobot/extras/templates/extras/customfield_edit.html +7 -12
- nautobot/extras/templates/extras/dynamicgroup_edit.html +42 -47
- nautobot/extras/templates/extras/externalintegration_retrieve.html +12 -0
- nautobot/extras/templates/extras/externalintegration_update.html +28 -0
- nautobot/extras/templates/extras/gitrepository_result.html +2 -2
- nautobot/extras/templates/extras/graphqlquery.html +4 -2
- nautobot/extras/templates/extras/inc/jobresult_js.html +1 -1
- nautobot/extras/templates/extras/job_list.html +1 -1
- nautobot/extras/templates/extras/jobresult.html +2 -2
- nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
- nautobot/extras/templatetags/custom_links.py +2 -3
- nautobot/extras/templatetags/job_buttons.py +76 -83
- 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 +7 -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_computedfields.py +2 -2
- nautobot/extras/tests/integration/test_configcontextschema.py +5 -5
- nautobot/extras/tests/integration/test_plugins.py +5 -4
- nautobot/extras/tests/integration/test_tagfilter.py +1 -1
- nautobot/extras/tests/test_api.py +15 -9
- nautobot/extras/tests/test_changelog.py +3 -2
- nautobot/extras/tests/test_context_managers.py +6 -3
- nautobot/extras/tests/test_customfields.py +4 -4
- nautobot/extras/tests/test_datasources.py +1 -1
- nautobot/extras/tests/test_dynamicgroups.py +3 -3
- nautobot/extras/tests/test_filters.py +3 -2
- nautobot/extras/tests/test_forms.py +5 -6
- nautobot/extras/tests/test_git.py +1 -1
- nautobot/extras/tests/test_job_variables.py +20 -1
- nautobot/extras/tests/test_jobs.py +34 -5
- nautobot/extras/tests/test_models.py +156 -6
- nautobot/extras/tests/test_notes.py +0 -1
- nautobot/extras/tests/test_plugins.py +71 -9
- nautobot/extras/tests/test_relationships.py +3 -3
- nautobot/extras/tests/test_tags.py +1 -1
- nautobot/extras/tests/test_views.py +105 -25
- nautobot/extras/tests/test_webhooks.py +4 -5
- nautobot/extras/urls.py +0 -2
- nautobot/extras/utils.py +11 -9
- nautobot/extras/views.py +42 -44
- nautobot/generate_secret_key.py +10 -5
- 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 +42 -58
- nautobot/ipam/formfields.py +1 -2
- nautobot/ipam/forms.py +5 -4
- 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 +15 -13
- 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/migrations/0039_alter_ipaddresstointerface_ip_address.py +20 -0
- nautobot/ipam/models.py +11 -8
- nautobot/ipam/navigation.py +0 -1
- nautobot/ipam/querysets.py +48 -49
- nautobot/ipam/tables.py +11 -2
- nautobot/ipam/templates/ipam/ipaddress.html +30 -6
- nautobot/ipam/templates/ipam/ipaddress_interfaces.html +3 -3
- nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +32 -0
- nautobot/ipam/tests/test_api.py +2 -2
- nautobot/ipam/tests/test_filters.py +13 -17
- nautobot/ipam/tests/test_migrations.py +1 -2
- nautobot/ipam/tests/test_models.py +17 -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 +6 -0
- nautobot/ipam/utils/migrations.py +0 -1
- nautobot/ipam/views.py +26 -6
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +142 -142
- 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 +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 +307 -307
- 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/css/base.css +59 -30
- nautobot/project-static/css/dark.css +38 -31
- nautobot/project-static/docs/404.html +17 -87
- nautobot/project-static/docs/apps/index.html +17 -87
- nautobot/project-static/docs/apps/nautobot-apps.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +405 -475
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +28 -98
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2334 -2396
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +132 -202
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +155 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +42 -112
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1028 -1098
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +186 -256
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1454 -1156
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1443 -1507
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +157 -203
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +32 -102
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3822 -3888
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +990 -1060
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +65 -123
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1431 -1495
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3618 -3640
- nautobot/project-static/docs/development/apps/api/configuration-view.html +17 -87
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +19 -89
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +17 -87
- nautobot/project-static/docs/development/apps/api/models/global-search.html +17 -87
- nautobot/project-static/docs/development/apps/api/models/graphql.html +17 -87
- nautobot/project-static/docs/development/apps/api/models/index.html +17 -87
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +19 -89
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +19 -89
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +19 -89
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +21 -87
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +17 -87
- nautobot/project-static/docs/development/apps/api/prometheus.html +17 -87
- nautobot/project-static/docs/development/apps/api/setup.html +17 -87
- nautobot/project-static/docs/development/apps/api/testing.html +20 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +17 -87
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +17 -87
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +17 -87
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +19 -89
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +209 -140
- nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +13 -5390
- nautobot/project-static/docs/development/apps/api/views/base-template.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +22 -92
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/index.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/notes.html +19 -89
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/urls.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5385
- nautobot/project-static/docs/development/apps/index.html +17 -87
- nautobot/project-static/docs/development/apps/migration/code-updates.html +17 -87
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +17 -87
- nautobot/project-static/docs/development/apps/migration/from-v1.html +17 -88
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +17 -87
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +17 -87
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +17 -87
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +17 -87
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +17 -87
- nautobot/project-static/docs/development/core/application-registry.html +20 -90
- nautobot/project-static/docs/development/core/best-practices.html +20 -90
- nautobot/project-static/docs/development/core/bootstrap-ui.html +5360 -0
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +17 -87
- nautobot/project-static/docs/development/core/extending-models.html +21 -87
- nautobot/project-static/docs/development/core/generic-views.html +17 -87
- nautobot/project-static/docs/development/core/getting-started.html +124 -301
- nautobot/project-static/docs/development/core/homepage.html +17 -87
- nautobot/project-static/docs/development/core/index.html +17 -87
- nautobot/project-static/docs/development/core/model-features.html +17 -87
- nautobot/project-static/docs/development/core/natural-keys.html +17 -87
- nautobot/project-static/docs/development/core/navigation-menu.html +17 -87
- nautobot/project-static/docs/development/core/react-ui.html +13 -5668
- nautobot/project-static/docs/development/core/release-checklist.html +20 -96
- nautobot/project-static/docs/development/core/role-internals.html +20 -90
- nautobot/project-static/docs/development/core/style-guide.html +77 -146
- nautobot/project-static/docs/development/core/templates.html +20 -90
- nautobot/project-static/docs/development/core/testing.html +17 -87
- nautobot/project-static/docs/development/core/user-preferences.html +17 -87
- nautobot/project-static/docs/development/index.html +17 -87
- nautobot/project-static/docs/development/jobs/index.html +424 -425
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +75 -98
- nautobot/project-static/docs/development/react-ui.html +3 -3
- nautobot/project-static/docs/img/relationship_w_json_filter.png +0 -0
- nautobot/project-static/docs/index.html +90 -93
- nautobot/project-static/docs/media/admin_ui_run_permission.png +0 -0
- nautobot/project-static/docs/media/development/homepage_changelog_panel.png +0 -0
- nautobot/project-static/docs/media/development/homepage_dcim_panel.png +0 -0
- nautobot/project-static/docs/media/installation/nautobot_ui_admin.png +0 -0
- nautobot/project-static/docs/media/installation/nautobot_ui_login.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_filtering_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_02.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_03.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_04.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_05.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_02.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_03.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_04.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_05.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_06.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_07.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_02.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_03.png +0 -0
- nautobot/project-static/docs/media/models/jobbutton_form.png +0 -0
- nautobot/project-static/docs/media/models/site_jobbuttons.png +0 -0
- nautobot/project-static/docs/media/plugins/plugin_admin_config.png +0 -0
- nautobot/project-static/docs/media/plugins/plugin_admin_ui.png +0 -0
- nautobot/project-static/docs/media/ss_config_contexts.png +0 -0
- nautobot/project-static/docs/media/ss_graphiql.png +0 -0
- nautobot/project-static/docs/media/ss_main_page.png +0 -0
- nautobot/project-static/docs/media/ss_plugin_chatops.png +0 -0
- nautobot/project-static/docs/media/ss_plugin_golden_config.png +0 -0
- nautobot/project-static/docs/media/ss_prefix_hierarchy.png +0 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/release-notes/index.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.0.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.1.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.2.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.3.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.4.html +18 -88
- nautobot/project-static/docs/release-notes/version-1.5.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.6.html +17 -87
- nautobot/project-static/docs/release-notes/version-2.0.html +467 -336
- nautobot/project-static/docs/release-notes/version-2.1.html +470 -108
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +240 -255
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +17 -87
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +20 -90
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +17 -87
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +17 -87
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5417
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +47 -113
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/index.html +22 -109
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +18 -101
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +23 -140
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/services.html +17 -87
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +17 -87
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +17 -87
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +92 -181
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +18 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +23 -89
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +18 -88
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio +259 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.png +0 -0
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +18 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +23 -93
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +26 -96
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +35 -103
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +19 -89
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +19 -91
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +19 -89
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +24 -94
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +39 -258
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +45 -243
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_choices.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_grouped.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_label.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_edit.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_select.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/1-create-location-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/10-add-platform.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/11-platforms-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/12-add-tenant.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/13-assign-tenant-to-device.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/14-assign-tenant-to-device-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/15-create-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/16-interface-templates.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/17-templated-interfaces.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/18-assign-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/19-edit-ints-for-lag.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/2-create-manufacturer.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/20-ints-int-lag.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/21-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/22-create-vlans.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/23-create-vlans-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/24-vlan-main-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/25-add-vlan-to-interface.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/26-add-vlan-to-interface-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/27-add-rir.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/3-create-role.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/30-add-prefix.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/32-add-ip-addr.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/33-assign-address.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/34-assign-address-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/35-assign-address-3.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/36-verify-address.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/37-verify-prefix.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/38-verify-prefix2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/4-create-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/41-device-search-results.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/42-address-search-v2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/43-get-to-device-main-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/44-add-platform.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/5-create-device.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/6-create-location.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/7-location-type-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/8-location-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/01-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/02-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/03-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/04-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/05-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/06-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/07-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/08-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/09-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/10-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/11-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/12-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/13-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/14-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/15-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/16-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/17-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/00-graphiql.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/01-graphiql-explorer.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/02-graphiql-explorer-device-query.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/03-graphiql-explorer-device-attributes.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/04-graphql-query-01.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/05-graphiql-autocomplete.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/06-graphql-query-02.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/07-graphql-query-03.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/08-graphql-query-04.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/09-graphql-query-05.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/10-graphql-swagger.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/11-graphql-query-06.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/ip_merge_button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/no_more_dup_ips.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/skip_button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/unselect_ips.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/01-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/02-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/03-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/04-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/05-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/06-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/07-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/08-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/09-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/10-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/11-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +20 -90
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +22 -92
- nautobot/project-static/docs/user-guide/index.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +22 -88
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +68 -87
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +18 -88
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +22 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +18 -88
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +43 -91
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +21 -87
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +17 -87
- nautobot/project-static/js/homepage_layout.js +170 -0
- 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/templates/tenancy/tenantgroup.html +1 -1
- 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 +8 -24
- 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 +5 -4
- 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/templates/virtualization/virtualmachine.html +2 -2
- 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.0b1.dist-info → nautobot-2.1.1.dist-info}/METADATA +10 -2
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/RECORD +895 -993
- 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/project-static/docs/media/installation/nautobot_ui_guest.png +0 -0
- nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.svg +0 -4
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/39-address-search.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/40-addr-main-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/18-git-data-source.png +0 -0
- 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.0b1.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
|
@@ -16,7 +16,7 @@ def render_with_template_if_exist(context, template, fallback): # pylint: disab
|
|
|
16
16
|
text = fallback
|
|
17
17
|
try:
|
|
18
18
|
text = render_to_string(template, context)
|
|
19
|
-
except Exception:
|
|
19
|
+
except Exception: # noqa: S110 # try-except-pass -- generally an antipattern, but it's intentional here
|
|
20
20
|
pass
|
|
21
21
|
return text
|
|
22
22
|
|
|
@@ -36,7 +36,7 @@ def language_selector(context):
|
|
|
36
36
|
context["i18n_is_set"] = True
|
|
37
37
|
try:
|
|
38
38
|
output = render_to_string(template_, context)
|
|
39
|
-
except Exception:
|
|
39
|
+
except Exception: # noqa: S110 # try-except-pass -- generally an antipattern, but it's intentional here
|
|
40
40
|
pass
|
|
41
41
|
return output
|
|
42
42
|
|
|
@@ -96,7 +96,10 @@ def render_app_label(context, app, fallback=""):
|
|
|
96
96
|
|
|
97
97
|
@register.simple_tag(takes_context=True)
|
|
98
98
|
def render_app_description(
|
|
99
|
-
context,
|
|
99
|
+
context,
|
|
100
|
+
app,
|
|
101
|
+
fallback="",
|
|
102
|
+
template="/admin_app_description.html", # pylint: disable=redefined-outer-name
|
|
100
103
|
):
|
|
101
104
|
"""Render the application description using the default template name. If it cannot find a
|
|
102
105
|
template matching the given path, fallback to the fallback argument.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from django import template
|
|
2
2
|
from django.urls import NoReverseMatch, reverse
|
|
3
3
|
|
|
4
|
-
from nautobot.core.views import utils as views_utils
|
|
5
4
|
from nautobot.core.utils import lookup
|
|
5
|
+
from nautobot.core.views import utils as views_utils
|
|
6
6
|
from nautobot.extras import models
|
|
7
7
|
|
|
8
8
|
register = template.Library()
|
|
@@ -123,6 +123,7 @@ def export_button(context, content_type=None):
|
|
|
123
123
|
else:
|
|
124
124
|
export_templates = []
|
|
125
125
|
export_url = None
|
|
126
|
+
include_yaml_option = False
|
|
126
127
|
|
|
127
128
|
return {
|
|
128
129
|
"export_url": export_url,
|
|
@@ -6,11 +6,11 @@ import re
|
|
|
6
6
|
from django import template
|
|
7
7
|
from django.conf import settings
|
|
8
8
|
from django.contrib.staticfiles.finders import find
|
|
9
|
-
from django.templatetags.static import
|
|
9
|
+
from django.templatetags.static import static, StaticNode
|
|
10
10
|
from django.urls import NoReverseMatch, reverse
|
|
11
11
|
from django.utils.html import format_html, strip_tags
|
|
12
|
-
from django.utils.text import slugify as django_slugify
|
|
13
12
|
from django.utils.safestring import mark_safe
|
|
13
|
+
from django.utils.text import slugify as django_slugify
|
|
14
14
|
from django_jinja import library
|
|
15
15
|
from markdown import markdown
|
|
16
16
|
import yaml
|
|
@@ -18,8 +18,9 @@ import yaml
|
|
|
18
18
|
from nautobot.apps.config import get_app_settings_or_config
|
|
19
19
|
from nautobot.core import forms
|
|
20
20
|
from nautobot.core.utils import color, config, data, lookup
|
|
21
|
-
from nautobot.core.utils.
|
|
21
|
+
from nautobot.core.utils.requests import add_nautobot_version_query_param_to_url
|
|
22
22
|
|
|
23
|
+
# S308 is suspicious-mark-safe-usage, but these are all using static strings that we know to be safe
|
|
23
24
|
HTML_TRUE = mark_safe('<span class="text-success"><i class="mdi mdi-check-bold" title="Yes"></i></span>') # noqa: S308
|
|
24
25
|
HTML_FALSE = mark_safe('<span class="text-danger"><i class="mdi mdi-close-thick" title="No"></i></span>') # noqa: S308
|
|
25
26
|
HTML_NONE = mark_safe('<span class="text-muted">—</span>') # noqa: S308
|
|
@@ -123,7 +124,7 @@ def add_html_id(element_str, id_str):
|
|
|
123
124
|
match = re.match(r"^(.*?<\w+) ?(.*)$", element_str, flags=re.DOTALL)
|
|
124
125
|
if not match:
|
|
125
126
|
return element_str
|
|
126
|
-
return mark_safe(match.group(1) + format_html(' id="{}" ', id_str) + match.group(2)) # noqa: S308
|
|
127
|
+
return mark_safe(match.group(1) + format_html(' id="{}" ', id_str) + match.group(2)) # noqa: S308 # suspicious-mark-safe-usage
|
|
127
128
|
|
|
128
129
|
|
|
129
130
|
@library.filter()
|
|
@@ -180,7 +181,7 @@ def render_markdown(value):
|
|
|
180
181
|
# Render Markdown
|
|
181
182
|
html = markdown(value, extensions=["fenced_code", "tables"])
|
|
182
183
|
|
|
183
|
-
return mark_safe(html) # noqa: S308
|
|
184
|
+
return mark_safe(html) # noqa: S308 # suspicious-mark-safe-usage, OK here since we sanitized the string earlier
|
|
184
185
|
|
|
185
186
|
|
|
186
187
|
@library.filter()
|
|
@@ -261,6 +262,34 @@ def validated_viewname(model, action):
|
|
|
261
262
|
return None
|
|
262
263
|
|
|
263
264
|
|
|
265
|
+
@library.filter()
|
|
266
|
+
@register.filter()
|
|
267
|
+
def validated_api_viewname(model, action):
|
|
268
|
+
"""
|
|
269
|
+
Return the API view name for the given model and action if valid, or None if invalid.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
model (models.Model): Class or Instance of a Django Model
|
|
273
|
+
action (str): name of the action in the viewname
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
(Union[str, None]): return the name of the API view for the model/action provided if valid, or None if invalid.
|
|
277
|
+
"""
|
|
278
|
+
viewname_str = lookup.get_route_for_model(model, action, api=True)
|
|
279
|
+
|
|
280
|
+
try:
|
|
281
|
+
# Validate and return the view name. We don't return the actual URL yet because many of the templates
|
|
282
|
+
# are written to pass a name to {% url %}.
|
|
283
|
+
if action == "detail":
|
|
284
|
+
# Detail views require an argument, so we'll pass a dummy value just for validation
|
|
285
|
+
reverse(viewname_str, args=["00000000-0000-0000-0000-000000000000"])
|
|
286
|
+
else:
|
|
287
|
+
reverse(viewname_str)
|
|
288
|
+
return viewname_str
|
|
289
|
+
except NoReverseMatch:
|
|
290
|
+
return None
|
|
291
|
+
|
|
292
|
+
|
|
264
293
|
@library.filter()
|
|
265
294
|
@register.filter()
|
|
266
295
|
def bettertitle(value):
|
|
@@ -707,8 +736,10 @@ def custom_branding_or_static(branding_asset, static_asset):
|
|
|
707
736
|
branding has been configured in settings, else it returns stock branding via static.
|
|
708
737
|
"""
|
|
709
738
|
if settings.BRANDING_FILEPATHS.get(branding_asset):
|
|
710
|
-
|
|
711
|
-
|
|
739
|
+
url = f"{ settings.MEDIA_URL }{ settings.BRANDING_FILEPATHS.get(branding_asset) }"
|
|
740
|
+
else:
|
|
741
|
+
url = StaticNode.handle_simple(static_asset)
|
|
742
|
+
return add_nautobot_version_query_param_to_url(url)
|
|
712
743
|
|
|
713
744
|
|
|
714
745
|
@register.simple_tag
|
|
@@ -725,6 +756,13 @@ def support_message():
|
|
|
725
756
|
return render_markdown(message)
|
|
726
757
|
|
|
727
758
|
|
|
759
|
+
@register.simple_tag
|
|
760
|
+
def versioned_static(file_path):
|
|
761
|
+
"""Returns a versioned static file URL with a query parameter containing the version number."""
|
|
762
|
+
url = static(file_path)
|
|
763
|
+
return add_nautobot_version_query_param_to_url(url)
|
|
764
|
+
|
|
765
|
+
|
|
728
766
|
@library.filter()
|
|
729
767
|
@register.filter()
|
|
730
768
|
def hyperlinked_object_with_color(obj):
|
|
@@ -741,14 +779,3 @@ def queryset_to_pks(obj):
|
|
|
741
779
|
result = list(obj.values_list("pk", flat=True)) if obj else []
|
|
742
780
|
result = [str(entry) for entry in result]
|
|
743
781
|
return ",".join(result)
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
#
|
|
747
|
-
# Navigation
|
|
748
|
-
#
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
@register.filter()
|
|
752
|
-
def is_new_ui_ready(url_path):
|
|
753
|
-
"""Return True if url_path is NewUI Ready else False"""
|
|
754
|
-
return is_route_new_ui_ready(url_path)
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import collections
|
|
2
2
|
|
|
3
3
|
from django.contrib.auth import get_user_model
|
|
4
|
-
from django.test import TransactionTestCase as _TransactionTestCase
|
|
5
|
-
from django.test import tag
|
|
4
|
+
from django.test import tag, TransactionTestCase as _TransactionTestCase
|
|
6
5
|
|
|
7
6
|
from nautobot.core.testing.api import APITestCase, APIViewTestCases
|
|
8
7
|
from nautobot.core.testing.filters import FilterTestCases
|
nautobot/core/testing/api.py
CHANGED
|
@@ -10,8 +10,8 @@ from django.test import override_settings, tag
|
|
|
10
10
|
from django.urls import reverse
|
|
11
11
|
from django.utils.text import slugify
|
|
12
12
|
from rest_framework import status
|
|
13
|
-
from rest_framework.test import APITransactionTestCase as _APITransactionTestCase
|
|
14
13
|
from rest_framework.relations import ManyRelatedField
|
|
14
|
+
from rest_framework.test import APITransactionTestCase as _APITransactionTestCase
|
|
15
15
|
|
|
16
16
|
from nautobot.core import testing
|
|
17
17
|
from nautobot.core.api.utils import get_serializer_for_model
|
|
@@ -21,9 +21,7 @@ from nautobot.core.templatetags.helpers import bettertitle
|
|
|
21
21
|
from nautobot.core.testing import mixins, views
|
|
22
22
|
from nautobot.core.utils import lookup
|
|
23
23
|
from nautobot.core.utils.data import is_uuid
|
|
24
|
-
from nautobot.extras import choices as extras_choices
|
|
25
|
-
from nautobot.extras import models as extras_models
|
|
26
|
-
from nautobot.extras import registry
|
|
24
|
+
from nautobot.extras import choices as extras_choices, models as extras_models, registry
|
|
27
25
|
from nautobot.users import models as users_models
|
|
28
26
|
|
|
29
27
|
__all__ = (
|
nautobot/core/testing/filters.py
CHANGED
|
@@ -39,7 +39,7 @@ class FilterTestCases:
|
|
|
39
39
|
values_with_count = queryset.values(field_name).annotate(count=Count(field_name)).order_by("count")
|
|
40
40
|
for value in values_with_count:
|
|
41
41
|
# randomly break out of loop after 2 values have been selected
|
|
42
|
-
if len(test_values) > 1 and random.choice([True, False]):
|
|
42
|
+
if len(test_values) > 1 and random.choice([True, False]): # noqa: S311 # suspicious-non-cryptographic-random-usage
|
|
43
43
|
break
|
|
44
44
|
if value[field_name] and value["count"] < qs_count:
|
|
45
45
|
qs_count -= value["count"]
|
|
@@ -67,7 +67,7 @@ class SeleniumTestCase(StaticLiveServerTestCase, testing.NautobotTestCaseMixin):
|
|
|
67
67
|
so there is no need to run `collectstatic` prior to running tests.
|
|
68
68
|
"""
|
|
69
69
|
|
|
70
|
-
host = "0.0.0.0" #
|
|
70
|
+
host = "0.0.0.0" # noqa: S104 # hardcoded-bind-all-interfaces -- false positive
|
|
71
71
|
selenium_host = SELENIUM_HOST # Docker: `nautobot`; else `host.docker.internal`
|
|
72
72
|
|
|
73
73
|
@classmethod
|
|
@@ -86,7 +86,7 @@ class SeleniumTestCase(StaticLiveServerTestCase, testing.NautobotTestCaseMixin):
|
|
|
86
86
|
def setUp(self):
|
|
87
87
|
super().setUpNautobot(populate_status=True)
|
|
88
88
|
|
|
89
|
-
self.password = "testpassword"
|
|
89
|
+
self.password = "testpassword" # noqa: S105 # hardcoded-password-string
|
|
90
90
|
self.user.set_password(self.password)
|
|
91
91
|
self.user.save()
|
|
92
92
|
|
nautobot/core/testing/mixins.py
CHANGED
|
@@ -13,8 +13,7 @@ from rest_framework.test import APIClient, APIRequestFactory
|
|
|
13
13
|
from nautobot.core import testing
|
|
14
14
|
from nautobot.core.models import fields as core_fields
|
|
15
15
|
from nautobot.core.utils import permissions
|
|
16
|
-
from nautobot.extras import management
|
|
17
|
-
from nautobot.extras import models as extras_models
|
|
16
|
+
from nautobot.extras import management, models as extras_models
|
|
18
17
|
from nautobot.users import models as users_models
|
|
19
18
|
|
|
20
19
|
# Use the proper swappable User model
|
nautobot/core/testing/schema.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
from io import StringIO
|
|
2
|
-
import yaml
|
|
3
2
|
|
|
4
3
|
from django.conf import settings
|
|
5
4
|
from django.core.management import call_command
|
|
6
5
|
from django.test import tag
|
|
7
6
|
from rest_framework.settings import api_settings
|
|
7
|
+
import yaml
|
|
8
8
|
|
|
9
9
|
from nautobot.core.testing import views
|
|
10
10
|
|
nautobot/core/testing/utils.py
CHANGED
|
@@ -99,7 +99,7 @@ def disable_warnings(logger_name):
|
|
|
99
99
|
|
|
100
100
|
def get_deletable_objects(model, queryset):
|
|
101
101
|
"""
|
|
102
|
-
Returns a
|
|
102
|
+
Returns a subset of objects in the given queryset that have no protected relationships that would prevent deletion.
|
|
103
103
|
"""
|
|
104
104
|
q = Q()
|
|
105
105
|
for field in model._meta.get_fields(include_parents=True):
|
|
@@ -113,7 +113,7 @@ def get_deletable_objects(model, queryset):
|
|
|
113
113
|
|
|
114
114
|
def generate_random_device_asset_tag_of_specified_size(size):
|
|
115
115
|
"""
|
|
116
|
-
|
|
116
|
+
For testing purposes only; it returns a random string of size 100 consisting of letters and numbers.
|
|
117
117
|
"""
|
|
118
|
-
asset_tag = "".join(random.choices(string.ascii_letters + string.digits, k=size))
|
|
118
|
+
asset_tag = "".join(random.choices(string.ascii_letters + string.digits, k=size)) # noqa: S311 # suspicious-non-cryptographic-random-usage
|
|
119
119
|
return asset_tag
|
nautobot/core/testing/views.py
CHANGED
|
@@ -3,16 +3,16 @@ from typing import Optional, Sequence
|
|
|
3
3
|
from unittest import skipIf
|
|
4
4
|
import uuid
|
|
5
5
|
|
|
6
|
+
from django.apps import apps
|
|
6
7
|
from django.conf import settings
|
|
7
8
|
from django.contrib.contenttypes.models import ContentType
|
|
8
9
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
|
9
10
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
10
11
|
from django.core.validators import URLValidator
|
|
11
|
-
from django.test import TestCase as _TestCase
|
|
12
|
-
from django.test import override_settings, tag
|
|
12
|
+
from django.test import override_settings, tag, TestCase as _TestCase
|
|
13
13
|
from django.urls import NoReverseMatch, reverse
|
|
14
|
-
from django.utils.http import urlencode
|
|
15
14
|
from django.utils.html import escape
|
|
15
|
+
from django.utils.http import urlencode
|
|
16
16
|
from django.utils.text import slugify
|
|
17
17
|
from tree_queries.models import TreeNode
|
|
18
18
|
|
|
@@ -20,9 +20,7 @@ from nautobot.core import testing
|
|
|
20
20
|
from nautobot.core.templatetags import helpers
|
|
21
21
|
from nautobot.core.testing import mixins
|
|
22
22
|
from nautobot.core.utils import lookup
|
|
23
|
-
from nautobot.extras import choices as extras_choices
|
|
24
|
-
from nautobot.extras import models as extras_models
|
|
25
|
-
from nautobot.extras import querysets as extras_querysets
|
|
23
|
+
from nautobot.extras import choices as extras_choices, models as extras_models, querysets as extras_querysets
|
|
26
24
|
from nautobot.users import models as users_models
|
|
27
25
|
|
|
28
26
|
__all__ = (
|
|
@@ -90,7 +88,9 @@ class ModelViewTestCase(ModelTestCase):
|
|
|
90
88
|
Override this if needed for testing of views that don't correspond directly to self.model,
|
|
91
89
|
for example the DCIM "interface-connections" and "console-connections" view tests.
|
|
92
90
|
"""
|
|
93
|
-
|
|
91
|
+
app_name = apps.get_app_config(app_label=self.model._meta.app_label).name
|
|
92
|
+
# AppConfig.name accounts for NautobotApps that are not built at the root of the package
|
|
93
|
+
if app_name in settings.PLUGINS:
|
|
94
94
|
return f"plugins:{self.model._meta.app_label}:{self.model._meta.model_name}_{{}}"
|
|
95
95
|
return f"{self.model._meta.app_label}:{self.model._meta.model_name}_{{}}"
|
|
96
96
|
|
|
@@ -1152,7 +1152,7 @@ class ViewTestCases:
|
|
|
1152
1152
|
def test_bulk_edit_objects_with_constrained_permission(self):
|
|
1153
1153
|
# Select some objects that are *not* already set to match the first value in self.bulk_edit_data or null.
|
|
1154
1154
|
# We have to exclude null cases because Django filter()/exclude() doesn't like `__in=[None]` as a case.
|
|
1155
|
-
attr_name =
|
|
1155
|
+
attr_name = next(iter(self.bulk_edit_data.keys()))
|
|
1156
1156
|
objects = (
|
|
1157
1157
|
self._get_queryset()
|
|
1158
1158
|
.exclude(**{attr_name: self.bulk_edit_data[attr_name]})
|
|
@@ -101,7 +101,7 @@ class HomeTestCase(SeleniumTestCase):
|
|
|
101
101
|
f"/div[@class='panel-heading']"
|
|
102
102
|
f"/strong[contains(text(), '{panel_name}')]"
|
|
103
103
|
f"/../.."
|
|
104
|
-
f"/div[@class='list-group']"
|
|
104
|
+
f"/div[@class='list-group collapse in collapsible-div']"
|
|
105
105
|
)
|
|
106
106
|
links = panel_element_to_search.links.find_by_text(item_name)
|
|
107
107
|
if item_details["permission"] in user_permissions:
|
|
@@ -57,7 +57,7 @@ class NavBarTestCase(SeleniumTestCase):
|
|
|
57
57
|
|
|
58
58
|
for tab_name, groups in self.navbar.items():
|
|
59
59
|
# XPath to find tabs using the tab name
|
|
60
|
-
tab_xpath = f"//*[@id='navbar']
|
|
60
|
+
tab_xpath = f"//*[@id='navbar']//span[normalize-space()='{tab_name}']/.."
|
|
61
61
|
tab = self.browser.find_by_xpath(tab_xpath)
|
|
62
62
|
tab.click()
|
|
63
63
|
self.assertTrue(bool(tab["aria-expanded"]))
|
|
@@ -92,7 +92,7 @@ class NavBarTestCase(SeleniumTestCase):
|
|
|
92
92
|
tab_flag = True
|
|
93
93
|
|
|
94
94
|
# XPath to find tabs using the tab name
|
|
95
|
-
tabs = self.browser.find_by_xpath(f"//*[@id='navbar']
|
|
95
|
+
tabs = self.browser.find_by_xpath(f"//*[@id='navbar']//span[normalize-space()='{tab_name}']/..")
|
|
96
96
|
if tab_flag:
|
|
97
97
|
self.assertEqual(len(tabs), 1)
|
|
98
98
|
else:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
from django.conf import settings
|
|
2
1
|
from unittest import skipIf
|
|
3
2
|
|
|
3
|
+
from django.conf import settings
|
|
4
|
+
|
|
4
5
|
from nautobot.circuits.models import Circuit, Provider
|
|
5
6
|
from nautobot.core.testing.integration import SeleniumTestCase
|
|
6
7
|
from nautobot.dcim.models import Location, PowerFeed, PowerPanel
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from unittest import skipIf
|
|
2
2
|
|
|
3
3
|
from django.conf import settings
|
|
4
|
-
from nautobot.core.choices import ButtonActionColorChoices, ButtonActionIconChoices
|
|
5
4
|
|
|
5
|
+
from nautobot.core.choices import ButtonActionColorChoices, ButtonActionIconChoices
|
|
6
6
|
from nautobot.core.testing.integration import SeleniumTestCase
|
|
7
7
|
|
|
8
8
|
|
|
@@ -80,7 +80,7 @@ class PluginNavBarTestCase(SeleniumTestCase):
|
|
|
80
80
|
# Retrieve home page
|
|
81
81
|
self.browser.visit(self.live_server_url)
|
|
82
82
|
|
|
83
|
-
tab_xpath = "//*[@id='navbar']
|
|
83
|
+
tab_xpath = "//*[@id='navbar']//span[normalize-space()='Example Menu']/.."
|
|
84
84
|
tab = self.browser.find_by_xpath(tab_xpath)
|
|
85
85
|
tab.click()
|
|
86
86
|
self.assertTrue(bool(tab["aria-expanded"]))
|
|
@@ -113,11 +113,11 @@ class PluginNavBarTestCase(SeleniumTestCase):
|
|
|
113
113
|
item = group.find_by_xpath(item_xpath)
|
|
114
114
|
|
|
115
115
|
for button_name in item_details["buttons"]:
|
|
116
|
-
button = item.find_by_xpath(f"{item_xpath}/div//a[@title='{button_name}']")
|
|
116
|
+
button = item.find_by_xpath(f"{item_xpath}/div//a[@data-original-title='{button_name}']")
|
|
117
117
|
if button_class := getattr(ButtonActionColorChoices, button_name.upper(), None):
|
|
118
118
|
self.assertIn(button_class, button["class"])
|
|
119
119
|
if button_icon := getattr(ButtonActionIconChoices, button_name.upper(), None):
|
|
120
|
-
icon = button.find_by_xpath(f"{item_xpath}/div//a[@title='{button_name}']/i")
|
|
120
|
+
icon = button.find_by_xpath(f"{item_xpath}/div//a[@data-original-title='{button_name}']/i")
|
|
121
121
|
self.assertIn(button_icon, icon["class"])
|
|
122
122
|
|
|
123
123
|
tab.click()
|
|
@@ -145,11 +145,11 @@ class PluginNavBarTestCase(SeleniumTestCase):
|
|
|
145
145
|
item = group.find_by_xpath(item_xpath)
|
|
146
146
|
|
|
147
147
|
for button_name in item_details["buttons"]:
|
|
148
|
-
button = item.find_by_xpath(f"{item_xpath}/div//a[@title='{button_name}']")
|
|
148
|
+
button = item.find_by_xpath(f"{item_xpath}/div//a[@data-original-title='{button_name}']")
|
|
149
149
|
if button_class := getattr(ButtonActionColorChoices, button_name.upper(), None):
|
|
150
150
|
self.assertIn(button_class, button.get_attribute("class"))
|
|
151
151
|
if button_icon := getattr(ButtonActionIconChoices, button_name.upper(), None):
|
|
152
|
-
icon = button.find_by_xpath(f"{item_xpath}/div//a[@title='{button_name}']/i")
|
|
152
|
+
icon = button.find_by_xpath(f"{item_xpath}/div//a[@data-original-title='{button_name}']/i")
|
|
153
153
|
self.assertIn(button_icon, icon["class"])
|
|
154
154
|
|
|
155
155
|
tab.click()
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import os
|
|
7
7
|
|
|
8
|
-
from nautobot.core.settings import * # noqa:
|
|
8
|
+
from nautobot.core.settings import * # noqa: F403 # undefined-local-with-import-star
|
|
9
9
|
from nautobot.core.settings_funcs import parse_redis_connection
|
|
10
10
|
|
|
11
11
|
ALLOWED_HOSTS = ["nautobot.example.com"]
|
|
@@ -22,12 +22,12 @@ PLUGINS = [
|
|
|
22
22
|
]
|
|
23
23
|
|
|
24
24
|
# Hard-code the SECRET_KEY for simplicity
|
|
25
|
-
SECRET_KEY = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
25
|
+
SECRET_KEY = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" # noqa: S105 # hardcoded-password-string
|
|
26
26
|
|
|
27
27
|
# Redis variables
|
|
28
28
|
|
|
29
29
|
# Use *different* redis_databases than the ones (0 and 1) used during non-automated-testing operations.
|
|
30
|
-
CACHES["default"]["LOCATION"] = parse_redis_connection(redis_database=2) # noqa: F405
|
|
30
|
+
CACHES["default"]["LOCATION"] = parse_redis_connection(redis_database=2) # noqa: F405 # undefined-local-with-import-star-usage
|
|
31
31
|
|
|
32
32
|
# Testing storages within cli.py
|
|
33
33
|
STORAGE_CONFIG = {
|
nautobot/core/tests/runner.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import yaml
|
|
2
|
-
|
|
3
|
-
from django.core.management import call_command
|
|
4
1
|
from django.conf import settings
|
|
2
|
+
from django.core.management import call_command
|
|
5
3
|
from django.test.runner import DiscoverRunner
|
|
4
|
+
import yaml
|
|
6
5
|
|
|
7
6
|
from nautobot.core.celery import app, setup_nautobot_job_logging
|
|
8
7
|
|
|
@@ -67,7 +66,7 @@ class NautobotTestRunner(DiscoverRunner):
|
|
|
67
66
|
for connection in result:
|
|
68
67
|
db_name = connection[0].alias
|
|
69
68
|
print(f'Pre-populating test database "{db_name}" with factory data...')
|
|
70
|
-
db_command = command
|
|
69
|
+
db_command = [*command, "--database", db_name]
|
|
71
70
|
call_command(*db_command)
|
|
72
71
|
|
|
73
72
|
return result
|
nautobot/core/tests/test_api.py
CHANGED
|
@@ -3,14 +3,13 @@ from io import BytesIO, StringIO
|
|
|
3
3
|
import json
|
|
4
4
|
from unittest import skip
|
|
5
5
|
|
|
6
|
-
from
|
|
6
|
+
from constance import config
|
|
7
|
+
from constance.test import override_config
|
|
7
8
|
from django.conf import settings
|
|
8
9
|
from django.contrib.auth import get_user_model
|
|
9
|
-
from django.
|
|
10
|
+
from django.contrib.contenttypes.models import ContentType
|
|
11
|
+
from django.test import override_settings, RequestFactory, TestCase
|
|
10
12
|
from django.urls import reverse
|
|
11
|
-
|
|
12
|
-
from constance import config
|
|
13
|
-
from constance.test import override_config
|
|
14
13
|
from rest_framework import status
|
|
15
14
|
from rest_framework.exceptions import ParseError
|
|
16
15
|
from rest_framework.settings import api_settings
|
|
@@ -23,12 +22,10 @@ from nautobot.core.api.versioning import NautobotAPIVersioning
|
|
|
23
22
|
from nautobot.core.constants import COMPOSITE_KEY_SEPARATOR
|
|
24
23
|
from nautobot.dcim import models as dcim_models
|
|
25
24
|
from nautobot.dcim.api import serializers as dcim_serializers
|
|
26
|
-
from nautobot.extras import choices
|
|
27
|
-
from nautobot.extras import models as extras_models
|
|
25
|
+
from nautobot.extras import choices, models as extras_models
|
|
28
26
|
from nautobot.ipam import models as ipam_models
|
|
29
27
|
from nautobot.ipam.api import serializers as ipam_serializers
|
|
30
28
|
|
|
31
|
-
|
|
32
29
|
User = get_user_model()
|
|
33
30
|
|
|
34
31
|
|
|
@@ -495,7 +492,7 @@ class NautobotCSVRendererTest(TestCase):
|
|
|
495
492
|
|
|
496
493
|
# Make sure a) it's well-constructed parsable CSV and b) it contains what we expect it to, within reason
|
|
497
494
|
reader = csv.DictReader(StringIO(csv_text))
|
|
498
|
-
read_data =
|
|
495
|
+
read_data = next(iter(reader))
|
|
499
496
|
self.assertIn("id", read_data)
|
|
500
497
|
self.assertEqual(read_data["id"], str(location_type.id))
|
|
501
498
|
self.assertIn("display", read_data)
|
|
@@ -925,45 +922,3 @@ class NewUIGetMenuAPIViewTestCase(testing.APITestCase):
|
|
|
925
922
|
|
|
926
923
|
self.assertEqual(response.status_code, 200)
|
|
927
924
|
self.assertEqual(response.data, expected_response)
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
class GetSettingsAPIViewTestCase(testing.APITestCase):
|
|
931
|
-
def test_get_settings(self):
|
|
932
|
-
"""Assert get settings value"""
|
|
933
|
-
url = reverse("ui-api:settings")
|
|
934
|
-
|
|
935
|
-
with self.subTest("Test get allowed settings"):
|
|
936
|
-
url_with_filters = f"{url}?name=FEEDBACK_BUTTON_ENABLED"
|
|
937
|
-
response = self.client.get(url_with_filters, **self.header)
|
|
938
|
-
self.assertEqual(response.status_code, 200)
|
|
939
|
-
expected_response = {"FEEDBACK_BUTTON_ENABLED": True}
|
|
940
|
-
self.assertEqual(response.data, expected_response)
|
|
941
|
-
with self.subTest("Test get not-allowed settings"):
|
|
942
|
-
url_with_filters = f"{url}?name=NAPALM_PASSWORD"
|
|
943
|
-
response = self.client.get(url_with_filters, **self.header)
|
|
944
|
-
self.assertEqual(response.status_code, 400)
|
|
945
|
-
expected_response = {"error": "Invalid settings names specified: NAPALM_PASSWORD."}
|
|
946
|
-
self.assertEqual(response.data, expected_response)
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
class NewUIReadyRoutesAPIViewTestCase(testing.APITestCase):
|
|
950
|
-
def test_new_ui_ready_routes(self):
|
|
951
|
-
"""Assert get settings value"""
|
|
952
|
-
url = reverse("ui-api:new-ui-ready-routes")
|
|
953
|
-
response = self.client.get(url, **self.header)
|
|
954
|
-
self.assertEqual(response.status_code, 200)
|
|
955
|
-
expected_response = [
|
|
956
|
-
"^$",
|
|
957
|
-
"^login\\/$",
|
|
958
|
-
"^dcim\\/device\\-types\\/$",
|
|
959
|
-
"^dcim\\/device\\-types\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\/$",
|
|
960
|
-
"^dcim\\/devices\\/$",
|
|
961
|
-
"^dcim\\/devices\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\/$",
|
|
962
|
-
"^dcim\\/locations\\/$",
|
|
963
|
-
"^dcim\\/locations\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\/$",
|
|
964
|
-
"^ipam\\/ip\\-addresses\\/$",
|
|
965
|
-
"^ipam\\/ip\\-addresses\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\/$",
|
|
966
|
-
"^ipam\\/prefixes\\/$",
|
|
967
|
-
"^ipam\\/prefixes\\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\\/$",
|
|
968
|
-
]
|
|
969
|
-
self.assertEqual(sorted(response.data), sorted(expected_response))
|
|
@@ -12,10 +12,9 @@ from nautobot.core.settings_funcs import sso_auth_enabled
|
|
|
12
12
|
from nautobot.core.testing import NautobotTestClient, TestCase
|
|
13
13
|
from nautobot.dcim.models import Location, LocationType
|
|
14
14
|
from nautobot.extras.models import Status
|
|
15
|
-
from nautobot.ipam.models import
|
|
15
|
+
from nautobot.ipam.models import Namespace, Prefix
|
|
16
16
|
from nautobot.users.models import ObjectPermission, Token
|
|
17
17
|
|
|
18
|
-
|
|
19
18
|
# Use the proper swappable User model
|
|
20
19
|
User = get_user_model()
|
|
21
20
|
|
|
@@ -51,7 +50,7 @@ class ExternalAuthenticationTestCase(TestCase):
|
|
|
51
50
|
self.assertEqual(settings.REMOTE_AUTH_HEADER, "HTTP_REMOTE_USER")
|
|
52
51
|
|
|
53
52
|
# Client should not be authenticated
|
|
54
|
-
self.client.get(reverse("home"), follow=True, **headers)
|
|
53
|
+
self.client.get(reverse("home"), follow=True, **headers)
|
|
55
54
|
self.assertNotIn("_auth_user_id", self.client.session)
|
|
56
55
|
|
|
57
56
|
@override_settings(AUTHENTICATION_BACKENDS=TEST_AUTHENTICATION_BACKENDS)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Test cases for nautobot.core.config module."""
|
|
2
2
|
|
|
3
3
|
from constance.test import override_config
|
|
4
|
-
from django.test import
|
|
4
|
+
from django.test import override_settings, TestCase
|
|
5
5
|
|
|
6
6
|
from nautobot.apps import config as app_config
|
|
7
7
|
from nautobot.core.utils import config
|
nautobot/core/tests/test_csv.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
from django.test import RequestFactory, TestCase, override_settings
|
|
2
|
-
from django.urls import reverse
|
|
3
|
-
from nautobot.core.constants import CSV_NULL_TYPE, CSV_NO_OBJECT, VARBINARY_IP_FIELD_REPR_OF_CSV_NO_OBJECT
|
|
4
1
|
from django.contrib.contenttypes.models import ContentType
|
|
2
|
+
from django.test import override_settings, RequestFactory, TestCase
|
|
3
|
+
from django.urls import reverse
|
|
5
4
|
|
|
5
|
+
from nautobot.core.constants import CSV_NO_OBJECT, CSV_NULL_TYPE, VARBINARY_IP_FIELD_REPR_OF_CSV_NO_OBJECT
|
|
6
6
|
from nautobot.dcim.api.serializers import DeviceSerializer
|
|
7
7
|
from nautobot.dcim.models.devices import Device, DeviceType
|
|
8
8
|
from nautobot.dcim.models.locations import Location
|
|
@@ -25,7 +25,7 @@ class CSVParsingRelatedTestCase(TestCase):
|
|
|
25
25
|
devicerole = Role.objects.get_for_model(Device).first()
|
|
26
26
|
device_status = Status.objects.get_for_model(Device).first()
|
|
27
27
|
tags = Tag.objects.get_for_model(Device).all()[:3]
|
|
28
|
-
|
|
28
|
+
Device.objects.all().delete()
|
|
29
29
|
self.device = Device.objects.create(
|
|
30
30
|
device_type=devicetype,
|
|
31
31
|
role=devicerole,
|
|
@@ -2,9 +2,7 @@ import itertools
|
|
|
2
2
|
|
|
3
3
|
import factory as factoryboy
|
|
4
4
|
|
|
5
|
-
from nautobot.core import constants
|
|
6
|
-
from nautobot.core import factory
|
|
7
|
-
from nautobot.core import testing
|
|
5
|
+
from nautobot.core import constants, factory, testing
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
class FactoryTestCase(testing.TestCase):
|