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
|
@@ -7,7 +7,6 @@ from django.db import models as django_models
|
|
|
7
7
|
from django.shortcuts import reverse
|
|
8
8
|
from django.test import TestCase
|
|
9
9
|
from django.test.utils import isolate_apps
|
|
10
|
-
|
|
11
10
|
import django_filters
|
|
12
11
|
from tree_queries.models import TreeNodeForeignKey
|
|
13
12
|
|
|
@@ -16,14 +15,11 @@ from nautobot.circuits.models import Circuit, CircuitType, Provider
|
|
|
16
15
|
from nautobot.core import filters, testing
|
|
17
16
|
from nautobot.core.models import fields as core_fields
|
|
18
17
|
from nautobot.core.utils import lookup
|
|
19
|
-
from nautobot.dcim import choices as dcim_choices
|
|
20
|
-
from nautobot.dcim import filters as dcim_filters
|
|
21
|
-
from nautobot.dcim import models as dcim_models
|
|
18
|
+
from nautobot.dcim import choices as dcim_choices, filters as dcim_filters, models as dcim_models
|
|
22
19
|
from nautobot.dcim.models import Device
|
|
23
20
|
from nautobot.extras import models as extras_models
|
|
24
21
|
from nautobot.extras.utils import FeatureQuery
|
|
25
|
-
from nautobot.ipam import factory as ipam_factory
|
|
26
|
-
from nautobot.ipam import models as ipam_models
|
|
22
|
+
from nautobot.ipam import factory as ipam_factory, models as ipam_models
|
|
27
23
|
|
|
28
24
|
|
|
29
25
|
class TreeNodeMultipleChoiceFilterTest(TestCase):
|
|
@@ -416,7 +412,7 @@ class BaseFilterSetTest(TestCase):
|
|
|
416
412
|
class TestFilterSet(filters.BaseFilterSet):
|
|
417
413
|
"""Filterset for testing various fields."""
|
|
418
414
|
|
|
419
|
-
class TestModel(django_models.Model):
|
|
415
|
+
class TestModel(django_models.Model): # noqa: DJ008 # django-model-without-dunder-str -- fine since this isn't a "real" model
|
|
420
416
|
"""
|
|
421
417
|
Test model used by BaseFilterSetTest for filter validation. Should never appear in a schema migration.
|
|
422
418
|
"""
|
|
@@ -833,6 +829,7 @@ class DynamicFilterLookupExpressionTest(TestCase):
|
|
|
833
829
|
@classmethod
|
|
834
830
|
def setUpTestData(cls):
|
|
835
831
|
manufacturers = dcim_models.Manufacturer.objects.all()[:3]
|
|
832
|
+
Device.objects.all().delete()
|
|
836
833
|
|
|
837
834
|
device_types = (
|
|
838
835
|
dcim_models.DeviceType(
|
|
@@ -9,13 +9,10 @@ from netaddr import IPNetwork
|
|
|
9
9
|
|
|
10
10
|
from nautobot.core import filters, forms, testing
|
|
11
11
|
from nautobot.core.utils import requests
|
|
12
|
-
from nautobot.dcim import filters as dcim_filters, forms as dcim_forms
|
|
13
|
-
from nautobot.dcim import models as dcim_models
|
|
12
|
+
from nautobot.dcim import filters as dcim_filters, forms as dcim_forms, models as dcim_models
|
|
14
13
|
from nautobot.dcim.tests import test_views
|
|
15
|
-
from nautobot.extras import filters as extras_filters
|
|
16
|
-
from nautobot.
|
|
17
|
-
from nautobot.ipam import forms as ipam_forms
|
|
18
|
-
from nautobot.ipam import models as ipam_models
|
|
14
|
+
from nautobot.extras import filters as extras_filters, models as extras_models
|
|
15
|
+
from nautobot.ipam import forms as ipam_forms, models as ipam_models
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
class SearchFormTestCase(TestCase):
|
|
@@ -8,18 +8,17 @@ from django.contrib.auth import get_user_model
|
|
|
8
8
|
from django.contrib.auth.models import Group
|
|
9
9
|
from django.contrib.contenttypes.models import ContentType
|
|
10
10
|
from django.db.models import Q
|
|
11
|
-
from django.test import
|
|
11
|
+
from django.test import override_settings, TestCase
|
|
12
12
|
from django.test.client import RequestFactory
|
|
13
13
|
from django.urls import reverse
|
|
14
|
-
from graphql import GraphQLError
|
|
15
14
|
import graphene.types
|
|
16
|
-
from graphene_django.settings import graphene_settings
|
|
17
15
|
from graphene_django.registry import get_global_registry
|
|
16
|
+
from graphene_django.settings import graphene_settings
|
|
17
|
+
from graphql import get_default_backend, GraphQLError
|
|
18
18
|
from graphql.error.located_error import GraphQLLocatedError
|
|
19
|
-
from graphql import get_default_backend
|
|
20
19
|
from rest_framework import status
|
|
21
20
|
|
|
22
|
-
from nautobot.circuits.models import
|
|
21
|
+
from nautobot.circuits.models import CircuitTermination, Provider
|
|
23
22
|
from nautobot.core.graphql import execute_query, execute_saved_query
|
|
24
23
|
from nautobot.core.graphql.generators import (
|
|
25
24
|
generate_list_search_parameters,
|
|
@@ -27,16 +26,16 @@ from nautobot.core.graphql.generators import (
|
|
|
27
26
|
)
|
|
28
27
|
from nautobot.core.graphql.schema import (
|
|
29
28
|
extend_schema_type,
|
|
30
|
-
extend_schema_type_custom_field,
|
|
31
|
-
extend_schema_type_tags,
|
|
32
29
|
extend_schema_type_config_context,
|
|
33
|
-
|
|
30
|
+
extend_schema_type_custom_field,
|
|
34
31
|
extend_schema_type_null_field_choice,
|
|
32
|
+
extend_schema_type_relationships,
|
|
33
|
+
extend_schema_type_tags,
|
|
35
34
|
)
|
|
36
35
|
from nautobot.core.graphql.types import OptimizedNautobotObjectType
|
|
37
36
|
from nautobot.core.graphql.utils import str_to_var_name
|
|
38
|
-
from nautobot.core.testing import
|
|
39
|
-
from nautobot.dcim.choices import
|
|
37
|
+
from nautobot.core.testing import create_test_user, NautobotTestClient
|
|
38
|
+
from nautobot.dcim.choices import ConsolePortTypeChoices, InterfaceModeChoices, InterfaceTypeChoices, PortTypeChoices
|
|
40
39
|
from nautobot.dcim.filters import DeviceFilterSet, LocationFilterSet
|
|
41
40
|
from nautobot.dcim.graphql.types import DeviceType as DeviceTypeGraphQL
|
|
42
41
|
from nautobot.dcim.models import (
|
|
@@ -52,17 +51,17 @@ from nautobot.dcim.models import (
|
|
|
52
51
|
Location,
|
|
53
52
|
LocationType,
|
|
54
53
|
PowerFeed,
|
|
55
|
-
PowerPort,
|
|
56
54
|
PowerOutlet,
|
|
57
55
|
PowerPanel,
|
|
56
|
+
PowerPort,
|
|
58
57
|
Rack,
|
|
59
58
|
RearPort,
|
|
60
59
|
)
|
|
61
60
|
from nautobot.extras.choices import CustomFieldTypeChoices
|
|
62
61
|
from nautobot.extras.models import (
|
|
63
62
|
ChangeLoggedModel,
|
|
64
|
-
CustomField,
|
|
65
63
|
ConfigContext,
|
|
64
|
+
CustomField,
|
|
66
65
|
GraphQLQuery,
|
|
67
66
|
Relationship,
|
|
68
67
|
RelationshipAssociation,
|
|
@@ -82,8 +81,8 @@ from nautobot.ipam.models import (
|
|
|
82
81
|
VRFDeviceAssignment,
|
|
83
82
|
VRFPrefixAssignment,
|
|
84
83
|
)
|
|
85
|
-
from nautobot.users.models import ObjectPermission, Token
|
|
86
84
|
from nautobot.tenancy.models import Tenant
|
|
85
|
+
from nautobot.users.models import ObjectPermission, Token
|
|
87
86
|
from nautobot.virtualization.factory import ClusterTypeFactory
|
|
88
87
|
from nautobot.virtualization.models import Cluster, VirtualMachine, VMInterface
|
|
89
88
|
|
|
@@ -111,6 +110,22 @@ class GraphQLTestCase(TestCase):
|
|
|
111
110
|
self.assertFalse(resp["data"].get("error"))
|
|
112
111
|
self.assertEqual(len(resp["data"]["query"]), Location.objects.all().count())
|
|
113
112
|
|
|
113
|
+
@skip("Works in isolation, fails as part of the overall test suite due to issue #446")
|
|
114
|
+
@override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
|
|
115
|
+
def test_execute_query_with_custom_field_type_json(self):
|
|
116
|
+
"""Test Custom Field with JSON type returns valid JSON object and not string. Fix for bug #4627"""
|
|
117
|
+
custom_field = CustomField(
|
|
118
|
+
type=CustomFieldTypeChoices.TYPE_JSON, label="custom_json_field", key="custom_json_field"
|
|
119
|
+
)
|
|
120
|
+
custom_field.validated_save()
|
|
121
|
+
custom_field.content_types.set([ContentType.objects.get_for_model(Location)])
|
|
122
|
+
custom_field_data = {"custom_json_field": {"name": "Custom Example", "is_customfield": True}}
|
|
123
|
+
self.locations[0]._custom_field_data = custom_field_data
|
|
124
|
+
self.locations[0].save()
|
|
125
|
+
query = "query ($name: [String!]) { locations(name:$name) {name, _custom_field_data, cf_custom_json_field} }"
|
|
126
|
+
resp = execute_query(query, user=self.user, variables={"name": "Location-1"}).to_dict()
|
|
127
|
+
self.assertEqual(resp["data"]["locations"]["cf_custom_json_field"], custom_field_data)
|
|
128
|
+
|
|
114
129
|
@override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
|
|
115
130
|
def test_execute_query_with_variable(self):
|
|
116
131
|
query = "query ($name: [String!]) { locations(name:$name) {name} }"
|
|
@@ -677,8 +692,9 @@ class GraphQLQueryTest(TestCase):
|
|
|
677
692
|
super().setUpTestData()
|
|
678
693
|
cls.user = User.objects.create(username="Super User", is_active=True, is_superuser=True)
|
|
679
694
|
|
|
680
|
-
# Remove random IPAddress fixtures for this custom test
|
|
695
|
+
# Remove random IPAddress and Device fixtures for this custom test
|
|
681
696
|
IPAddress.objects.all().delete()
|
|
697
|
+
Device.objects.all().delete()
|
|
682
698
|
|
|
683
699
|
# Initialize fake request that will be required to execute GraphQL query
|
|
684
700
|
cls.request = RequestFactory().request(SERVER_NAME="WebRequestContext")
|
|
@@ -691,7 +707,7 @@ class GraphQLQueryTest(TestCase):
|
|
|
691
707
|
roles = Role.objects.get_for_model(Device)
|
|
692
708
|
cls.device_role1 = roles[0]
|
|
693
709
|
cls.device_role2 = roles[1]
|
|
694
|
-
cls.device_role3 = random.choice(roles)
|
|
710
|
+
cls.device_role3 = random.choice(roles) # noqa: S311 # suspicious-non-cryptographic-random-usage
|
|
695
711
|
cls.location_statuses = list(Status.objects.get_for_model(Location))[:2]
|
|
696
712
|
cls.location_type = LocationType.objects.get(name="Campus")
|
|
697
713
|
cls.location1 = Location.objects.filter(location_type=cls.location_type).first()
|
|
@@ -1612,8 +1628,8 @@ query {
|
|
|
1612
1628
|
IPAddress.objects.net_host_contained("10.0.0.0/16").count(),
|
|
1613
1629
|
),
|
|
1614
1630
|
(
|
|
1615
|
-
'prefix: "10.0.2.0/24"',
|
|
1616
|
-
IPAddress.objects.net_host_contained("10.0.2.0/24").count(),
|
|
1631
|
+
'prefix: ["10.0.1.0/24", "10.0.2.0/24"]',
|
|
1632
|
+
IPAddress.objects.net_host_contained("10.0.1.0/24", "10.0.2.0/24").count(),
|
|
1617
1633
|
),
|
|
1618
1634
|
)
|
|
1619
1635
|
|
|
@@ -29,6 +29,7 @@ class NautobotJinjaFilterTest(TestCase):
|
|
|
29
29
|
"meta",
|
|
30
30
|
"viewname",
|
|
31
31
|
"validated_viewname",
|
|
32
|
+
"validated_api_viewname",
|
|
32
33
|
"bettertitle",
|
|
33
34
|
"humanize_speed",
|
|
34
35
|
"tzoffset",
|
|
@@ -46,17 +47,17 @@ class NautobotJinjaFilterTest(TestCase):
|
|
|
46
47
|
"slugify",
|
|
47
48
|
]
|
|
48
49
|
|
|
49
|
-
# For each helper, try to render
|
|
50
|
+
# For each helper, try to render jinja template with render_jinja2 and fail if TemplateAssertionError is raised
|
|
50
51
|
for helper in helpers_to_validate:
|
|
51
52
|
try:
|
|
52
53
|
data.render_jinja2("{{ data | " + helper + " }}", {"data": None})
|
|
53
54
|
except TemplateAssertionError:
|
|
54
55
|
raise
|
|
55
|
-
except Exception:
|
|
56
|
+
except Exception: # noqa: S110 # try-except-pass -- an antipattern in general, but OK here
|
|
56
57
|
pass
|
|
57
58
|
|
|
58
59
|
def test_netutils_filters_in_jinja(self):
|
|
59
|
-
"""Import
|
|
60
|
+
"""Import all Jinja filters from Netutils and validate that all have been properly loaded in Django Jinja."""
|
|
60
61
|
filters = jinja2_convenience_function()
|
|
61
62
|
|
|
62
63
|
for filter_ in filters.keys():
|
|
@@ -64,7 +65,7 @@ class NautobotJinjaFilterTest(TestCase):
|
|
|
64
65
|
data.render_jinja2("{{ data | " + filter_ + " }}", {"data": None})
|
|
65
66
|
except TemplateAssertionError:
|
|
66
67
|
raise
|
|
67
|
-
except Exception:
|
|
68
|
+
except Exception: # noqa: S110 # try-except-pass -- an antipattern in general, but OK here
|
|
68
69
|
pass
|
|
69
70
|
|
|
70
71
|
def test_sandboxed_render(self):
|
nautobot/core/tests/test_jobs.py
CHANGED
|
@@ -3,7 +3,7 @@ from pathlib import Path
|
|
|
3
3
|
from django.contrib.contenttypes.models import ContentType
|
|
4
4
|
import yaml
|
|
5
5
|
|
|
6
|
-
from nautobot.core.testing import
|
|
6
|
+
from nautobot.core.testing import create_job_result_and_run_job, TransactionTestCase
|
|
7
7
|
from nautobot.dcim.models import DeviceType, Manufacturer
|
|
8
8
|
from nautobot.extras.choices import JobResultStatusChoices, LogLevelChoices
|
|
9
9
|
from nautobot.extras.models import ExportTemplate, JobLogEntry, Status
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import time
|
|
2
|
-
import uuid
|
|
3
|
-
|
|
4
2
|
from unittest import skip
|
|
5
3
|
from unittest.mock import patch
|
|
4
|
+
import uuid
|
|
6
5
|
|
|
7
6
|
from django.core.cache import cache
|
|
8
7
|
from django.core.exceptions import ValidationError
|
|
@@ -12,7 +11,7 @@ from django.test.utils import isolate_apps
|
|
|
12
11
|
from nautobot.core.models import BaseModel
|
|
13
12
|
from nautobot.core.models.utils import construct_composite_key, construct_natural_slug, deconstruct_composite_key
|
|
14
13
|
from nautobot.core.testing import TestCase
|
|
15
|
-
from nautobot.dcim.models import DeviceType, Manufacturer
|
|
14
|
+
from nautobot.dcim.models import DeviceType, Location, Manufacturer
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
@isolate_apps("nautobot.core.tests")
|
|
@@ -142,3 +141,29 @@ class NaturalKeyTestCase(BaseModelTest):
|
|
|
142
141
|
self.FakeBaseModel._content_type_cached
|
|
143
142
|
self.FakeBaseModel._content_type_cached
|
|
144
143
|
self.assertEqual(mock__content_type.call_count, 2)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class TreeModelTestCase(TestCase):
|
|
147
|
+
"""Tests for the behavior of tree models, using Location as a representative model."""
|
|
148
|
+
|
|
149
|
+
def test_values(self):
|
|
150
|
+
"""Test that `.values()` works properly (https://github.com/nautobot/nautobot/issues/4812)."""
|
|
151
|
+
queryset = Location.objects.filter(name="Campus-01")
|
|
152
|
+
instance = queryset.first()
|
|
153
|
+
values_dict = queryset.values().first()
|
|
154
|
+
model_dict = queryset.first().__dict__
|
|
155
|
+
values_subset_dict = queryset.values("id", "name", "last_updated").first()
|
|
156
|
+
|
|
157
|
+
for key, value in values_dict.items():
|
|
158
|
+
with self.subTest(description="values()", key=key):
|
|
159
|
+
self.assertEqual(value, getattr(instance, key))
|
|
160
|
+
|
|
161
|
+
for key, value in model_dict.items():
|
|
162
|
+
if key.startswith("_"):
|
|
163
|
+
continue
|
|
164
|
+
with self.subTest(description="__dict__", key=key):
|
|
165
|
+
self.assertEqual(value, getattr(instance, key))
|
|
166
|
+
|
|
167
|
+
for key, value in values_subset_dict.items():
|
|
168
|
+
with self.subTest(description="values(key, key, key...)", key=key):
|
|
169
|
+
self.assertEqual(value, getattr(instance, key))
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
from constance.test import override_config
|
|
4
4
|
from django.conf import settings
|
|
5
5
|
from django.contrib.auth import get_user_model
|
|
6
|
-
from django.test import
|
|
6
|
+
from django.test import override_settings, RequestFactory
|
|
7
7
|
from django.urls import reverse
|
|
8
8
|
|
|
9
9
|
from nautobot.circuits import models as circuits_models
|
|
10
|
-
from nautobot.dcim import models as dcim_models
|
|
11
10
|
from nautobot.core import testing
|
|
12
11
|
from nautobot.core.views import paginator
|
|
12
|
+
from nautobot.dcim import models as dcim_models
|
|
13
13
|
from nautobot.extras import models as extras_models
|
|
14
14
|
|
|
15
15
|
|
|
@@ -2,11 +2,11 @@ from io import BytesIO
|
|
|
2
2
|
from logging import ERROR
|
|
3
3
|
from unittest.mock import Mock, patch
|
|
4
4
|
|
|
5
|
-
import requests
|
|
6
5
|
from django.conf import settings
|
|
7
6
|
from django.core.cache import cache
|
|
8
|
-
from django.test import
|
|
7
|
+
from django.test import override_settings, SimpleTestCase
|
|
9
8
|
from packaging import version
|
|
9
|
+
import requests
|
|
10
10
|
from requests import Response
|
|
11
11
|
|
|
12
12
|
from nautobot.core.tasks import get_releases
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from django.test import TestCase
|
|
2
2
|
|
|
3
|
-
from nautobot.dcim.tables import
|
|
3
|
+
from nautobot.dcim.tables import DeviceTypeTable, LocationTable, LocationTypeTable, ManufacturerTable, RackGroupTable
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class TableTestCase(TestCase):
|
|
@@ -3,13 +3,14 @@ from unittest import skipIf
|
|
|
3
3
|
from constance.test import override_config
|
|
4
4
|
from django.conf import settings
|
|
5
5
|
from django.templatetags.static import static
|
|
6
|
-
from django.test import
|
|
7
|
-
from example_plugin.models import AnotherExampleModel, ExampleModel
|
|
6
|
+
from django.test import override_settings, TestCase
|
|
8
7
|
|
|
9
8
|
from nautobot.core.templatetags import helpers
|
|
10
9
|
from nautobot.dcim import models
|
|
11
10
|
from nautobot.ipam.models import VLAN
|
|
12
11
|
|
|
12
|
+
from example_plugin.models import AnotherExampleModel, ExampleModel
|
|
13
|
+
|
|
13
14
|
|
|
14
15
|
@skipIf(
|
|
15
16
|
"example_plugin" not in settings.PLUGINS,
|
|
@@ -118,6 +119,20 @@ class NautobotTemplatetagsHelperTest(TestCase):
|
|
|
118
119
|
self.assertEqual(helpers.validated_viewname(ExampleModel, "list"), "plugins:example_plugin:examplemodel_list")
|
|
119
120
|
self.assertIsNone(helpers.validated_viewname(ExampleModel, "notvalid"))
|
|
120
121
|
|
|
122
|
+
def test_validated_api_viewname(self):
|
|
123
|
+
location = models.Location.objects.first()
|
|
124
|
+
|
|
125
|
+
self.assertEqual(helpers.validated_api_viewname(location, "list"), "dcim-api:location-list")
|
|
126
|
+
self.assertIsNone(helpers.validated_api_viewname(models.Location, "notvalid"))
|
|
127
|
+
|
|
128
|
+
self.assertEqual(
|
|
129
|
+
helpers.validated_api_viewname(ExampleModel, "list"), "plugins-api:example_plugin-api:examplemodel-list"
|
|
130
|
+
)
|
|
131
|
+
self.assertIsNone(helpers.validated_api_viewname(ExampleModel, "notvalid"))
|
|
132
|
+
|
|
133
|
+
# Assert detail views get validated as well
|
|
134
|
+
self.assertEqual(helpers.validated_api_viewname(location, "detail"), "dcim-api:location-detail")
|
|
135
|
+
|
|
121
136
|
def test_bettertitle(self):
|
|
122
137
|
self.assertEqual(helpers.bettertitle("myTITle"), "MyTITle")
|
|
123
138
|
self.assertEqual(helpers.bettertitle("mytitle"), "Mytitle")
|
|
@@ -3,7 +3,6 @@ import inspect
|
|
|
3
3
|
from django.template import Context, Engine
|
|
4
4
|
from django.template.exceptions import TemplateSyntaxError
|
|
5
5
|
from django.test import TestCase
|
|
6
|
-
|
|
7
6
|
from netutils.utils import jinja2_convenience_function
|
|
8
7
|
|
|
9
8
|
|
|
@@ -47,6 +46,6 @@ class NautobotTemplateTagsNetutilsTest(TestCase):
|
|
|
47
46
|
except ConnectionError:
|
|
48
47
|
# Yes, some netutils functions such as tcp_ping actually make network calls when invoked. Eeek.
|
|
49
48
|
pass
|
|
50
|
-
except Exception:
|
|
49
|
+
except Exception: # noqa: S110 # try-except-pass -- an antipattern in general, but OK here
|
|
51
50
|
# Catch-all - at least it wasn't a TemplateSyntaxError, so good enough for now.
|
|
52
51
|
pass
|
|
@@ -8,24 +8,20 @@ from django.db.models import Q
|
|
|
8
8
|
from django.http import QueryDict
|
|
9
9
|
from django.test import TestCase
|
|
10
10
|
|
|
11
|
-
from example_plugin.models import ExampleModel
|
|
12
|
-
|
|
13
11
|
from nautobot.circuits import models as circuits_models
|
|
14
12
|
from nautobot.core import exceptions, forms, settings_funcs
|
|
15
13
|
from nautobot.core.api import utils as api_utils
|
|
16
14
|
from nautobot.core.models import fields as core_fields, utils as models_utils
|
|
17
15
|
from nautobot.core.utils import data as data_utils, filtering, lookup, requests
|
|
18
16
|
from nautobot.core.utils.migrations import update_object_change_ct_for_replaced_models
|
|
19
|
-
from nautobot.dcim import filters as dcim_filters
|
|
20
|
-
from nautobot.
|
|
21
|
-
from nautobot.dcim import models as dcim_models
|
|
22
|
-
from nautobot.dcim import tables
|
|
23
|
-
from nautobot.extras import models as extras_models
|
|
24
|
-
from nautobot.extras import utils as extras_utils
|
|
17
|
+
from nautobot.dcim import filters as dcim_filters, forms as dcim_forms, models as dcim_models, tables
|
|
18
|
+
from nautobot.extras import models as extras_models, utils as extras_utils
|
|
25
19
|
from nautobot.extras.choices import ObjectChangeActionChoices, RelationshipTypeChoices
|
|
26
20
|
from nautobot.extras.models import ObjectChange
|
|
27
21
|
from nautobot.extras.registry import registry
|
|
28
22
|
|
|
23
|
+
from example_plugin.models import ExampleModel
|
|
24
|
+
|
|
29
25
|
|
|
30
26
|
class DictToFilterParamsTest(TestCase):
|
|
31
27
|
"""
|
|
@@ -3,16 +3,54 @@ from unittest import mock
|
|
|
3
3
|
import urllib.parse
|
|
4
4
|
|
|
5
5
|
from django.contrib.contenttypes.models import ContentType
|
|
6
|
-
from django.
|
|
6
|
+
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
7
|
+
from django.test import override_settings, RequestFactory
|
|
7
8
|
from django.test.utils import override_script_prefix
|
|
8
9
|
from django.urls import get_script_prefix, reverse
|
|
9
10
|
from prometheus_client.parser import text_string_to_metric_families
|
|
10
11
|
|
|
11
12
|
from nautobot.core.testing import TestCase
|
|
13
|
+
from nautobot.core.utils.permissions import get_permission_for_model
|
|
14
|
+
from nautobot.core.views.mixins import GetReturnURLMixin
|
|
12
15
|
from nautobot.dcim.models.locations import Location
|
|
13
16
|
from nautobot.extras.choices import CustomFieldTypeChoices
|
|
17
|
+
from nautobot.extras.models import FileProxy
|
|
14
18
|
from nautobot.extras.models.customfields import CustomField, CustomFieldChoice
|
|
15
19
|
from nautobot.extras.registry import registry
|
|
20
|
+
from nautobot.users.models import ObjectPermission
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class GetReturnURLMixinTestCase(TestCase):
|
|
24
|
+
"""Tests for the API of GetReturnURLMixin."""
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def setUpTestData(cls):
|
|
28
|
+
cls.factory = RequestFactory(SERVER_NAME="nautobot.example.com")
|
|
29
|
+
cls.mixin = GetReturnURLMixin()
|
|
30
|
+
|
|
31
|
+
def test_get_return_url_explicit(self):
|
|
32
|
+
request = self.factory.get("/", {"return_url": "/dcim/devices/"})
|
|
33
|
+
self.assertEqual(self.mixin.get_return_url(request=request, obj=None), "/dcim/devices/")
|
|
34
|
+
self.assertEqual(self.mixin.get_return_url(request=request, obj=Location.objects.first()), "/dcim/devices/")
|
|
35
|
+
|
|
36
|
+
request = self.factory.get("/", {"return_url": "/dcim/devices/?status=Active"})
|
|
37
|
+
self.assertEqual(self.mixin.get_return_url(request=request, obj=None), "/dcim/devices/?status=Active")
|
|
38
|
+
|
|
39
|
+
def test_get_return_url_explicit_unsafe(self):
|
|
40
|
+
request = self.factory.get("/", {"return_url": "http://example.com"})
|
|
41
|
+
self.assertEqual(self.mixin.get_return_url(request=request, obj=None), reverse("home"))
|
|
42
|
+
|
|
43
|
+
def test_get_return_url_explicit_punycode(self):
|
|
44
|
+
"""
|
|
45
|
+
Replace the 'i' in '/dcim/' with a unicode dotless 'ı' and make sure we're not fooled by it.
|
|
46
|
+
""" # noqa: RUF002 # ambiguous-unicode-character-docstring -- fully intentional here!
|
|
47
|
+
request = self.factory.get("/", {"return_url": "/dcım/devices/"}) # noqa: RUF001 # ambiguous-unicode-character-string -- fully intentional here!
|
|
48
|
+
self.assertEqual(self.mixin.get_return_url(request=request, obj=None), "/dc%C4%B1m/devices/")
|
|
49
|
+
|
|
50
|
+
def test_get_return_url_default_with_obj(self):
|
|
51
|
+
request = self.factory.get("/")
|
|
52
|
+
location = Location.objects.first()
|
|
53
|
+
self.assertEqual(self.mixin.get_return_url(request=request, obj=location), location.get_absolute_url())
|
|
16
54
|
|
|
17
55
|
|
|
18
56
|
class HomeViewTestCase(TestCase):
|
|
@@ -371,3 +409,59 @@ class ErrorPagesTestCase(TestCase):
|
|
|
371
409
|
self.assertNotContains(response, "Network to Code", status_code=500)
|
|
372
410
|
response_content = response.content.decode(response.charset)
|
|
373
411
|
self.assertInHTML("Hello world!", response_content)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
class DBFileStorageViewTestCase(TestCase):
|
|
415
|
+
"""Test authentication/permission enforcement for django_db_file_storage views."""
|
|
416
|
+
|
|
417
|
+
def setUp(self):
|
|
418
|
+
super().setUp()
|
|
419
|
+
self.test_file_1 = SimpleUploadedFile(name="test_file_1.txt", content=b"I am content.\n")
|
|
420
|
+
self.file_proxy_1 = FileProxy.objects.create(name=self.test_file_1.name, file=self.test_file_1)
|
|
421
|
+
self.test_file_2 = SimpleUploadedFile(name="test_file_2.txt", content=b"I am content.\n")
|
|
422
|
+
self.file_proxy_2 = FileProxy.objects.create(name=self.test_file_2.name, file=self.test_file_2)
|
|
423
|
+
self.urls = [
|
|
424
|
+
f"{reverse('db_file_storage.download_file')}?name={self.file_proxy_1.file.name}",
|
|
425
|
+
f"{reverse('db_file_storage.get_file')}?name={self.file_proxy_1.file.name}",
|
|
426
|
+
]
|
|
427
|
+
|
|
428
|
+
def test_get_file_anonymous(self):
|
|
429
|
+
self.client.logout()
|
|
430
|
+
for url in self.urls:
|
|
431
|
+
with self.subTest(url):
|
|
432
|
+
response = self.client.get(url)
|
|
433
|
+
self.assertHttpStatus(response, 403)
|
|
434
|
+
|
|
435
|
+
def test_get_file_without_permission(self):
|
|
436
|
+
for url in self.urls:
|
|
437
|
+
with self.subTest(url):
|
|
438
|
+
response = self.client.get(url)
|
|
439
|
+
self.assertHttpStatus(response, 403)
|
|
440
|
+
|
|
441
|
+
def test_get_object_with_permission(self):
|
|
442
|
+
self.add_permissions(get_permission_for_model(FileProxy, "view"))
|
|
443
|
+
for url in self.urls:
|
|
444
|
+
with self.subTest(url):
|
|
445
|
+
response = self.client.get(url)
|
|
446
|
+
self.assertHttpStatus(response, 200)
|
|
447
|
+
|
|
448
|
+
def test_get_object_with_constrained_permission(self):
|
|
449
|
+
obj_perm = ObjectPermission(
|
|
450
|
+
name="Test permission",
|
|
451
|
+
constraints={"pk": self.file_proxy_1.pk},
|
|
452
|
+
actions=["view"],
|
|
453
|
+
)
|
|
454
|
+
obj_perm.save()
|
|
455
|
+
obj_perm.users.add(self.user)
|
|
456
|
+
obj_perm.object_types.add(ContentType.objects.get_for_model(FileProxy))
|
|
457
|
+
for url in self.urls:
|
|
458
|
+
with self.subTest(url):
|
|
459
|
+
response = self.client.get(url)
|
|
460
|
+
self.assertHttpStatus(response, 200)
|
|
461
|
+
for url in [
|
|
462
|
+
f"{reverse('db_file_storage.download_file')}?name={self.file_proxy_2.file.name}",
|
|
463
|
+
f"{reverse('db_file_storage.get_file')}?name={self.file_proxy_2.file.name}",
|
|
464
|
+
]:
|
|
465
|
+
with self.subTest(url):
|
|
466
|
+
response = self.client.get(url)
|
|
467
|
+
self.assertHttpStatus(response, 404)
|
|
@@ -3,7 +3,6 @@ from django.test import TestCase
|
|
|
3
3
|
|
|
4
4
|
from nautobot.core.models.querysets import count_related
|
|
5
5
|
from nautobot.core.views.utils import check_filter_for_display
|
|
6
|
-
|
|
7
6
|
from nautobot.dcim.filters import DeviceFilterSet
|
|
8
7
|
from nautobot.dcim.models import Device, DeviceRedundancyGroup, DeviceType, InventoryItem, Location, Manufacturer
|
|
9
8
|
from nautobot.extras.models import Role, Status
|
nautobot/core/urls.py
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
from django.conf import settings
|
|
2
|
-
from django.conf.urls import include
|
|
2
|
+
from django.conf.urls import include, url
|
|
3
3
|
from django.urls import path
|
|
4
4
|
from django.views.generic import TemplateView
|
|
5
5
|
from django.views.static import serve
|
|
6
6
|
|
|
7
|
-
from nautobot.core.views import
|
|
7
|
+
from nautobot.core.views import (
|
|
8
|
+
CustomGraphQLView,
|
|
9
|
+
get_file_with_authorization,
|
|
10
|
+
HomeView,
|
|
11
|
+
nautobot_metrics_view,
|
|
12
|
+
SearchView,
|
|
13
|
+
StaticMediaFailureView,
|
|
14
|
+
ThemePreviewView,
|
|
15
|
+
)
|
|
8
16
|
from nautobot.extras.plugins.urls import (
|
|
9
17
|
plugin_admin_patterns,
|
|
10
18
|
plugin_patterns,
|
|
11
19
|
)
|
|
12
20
|
from nautobot.users.views import LoginView, LogoutView
|
|
13
|
-
from .admin import admin_site
|
|
14
21
|
|
|
22
|
+
from .admin import admin_site
|
|
15
23
|
|
|
16
24
|
urlpatterns = [
|
|
17
25
|
# Base views
|
|
@@ -46,7 +54,18 @@ urlpatterns = [
|
|
|
46
54
|
# django-health-check
|
|
47
55
|
path(r"health/", include("health_check.urls")),
|
|
48
56
|
# FileProxy attachments download/get URLs used in admin views only
|
|
49
|
-
|
|
57
|
+
url(
|
|
58
|
+
"files/download/",
|
|
59
|
+
get_file_with_authorization,
|
|
60
|
+
{"add_attachment_headers": True},
|
|
61
|
+
name="db_file_storage.download_file",
|
|
62
|
+
),
|
|
63
|
+
url(
|
|
64
|
+
"files/get/",
|
|
65
|
+
get_file_with_authorization,
|
|
66
|
+
{"add_attachment_headers": False},
|
|
67
|
+
name="db_file_storage.get_file",
|
|
68
|
+
),
|
|
50
69
|
# Templated css file
|
|
51
70
|
path(
|
|
52
71
|
"template.css", TemplateView.as_view(template_name="template.css", content_type="text/css"), name="template_css"
|
|
@@ -60,6 +79,7 @@ if settings.DEBUG:
|
|
|
60
79
|
|
|
61
80
|
urlpatterns += [
|
|
62
81
|
path("__debug__/", include(debug_toolbar.urls)),
|
|
82
|
+
path("theme-preview/", ThemePreviewView.as_view(), name="theme_preview"),
|
|
63
83
|
]
|
|
64
84
|
except ImportError:
|
|
65
85
|
pass
|
nautobot/core/utils/color.py
CHANGED
|
@@ -5,7 +5,7 @@ def hex_to_rgb(hex_str):
|
|
|
5
5
|
"""
|
|
6
6
|
Map a hex string like "00ff00" to individual r, g, b integer values.
|
|
7
7
|
"""
|
|
8
|
-
return [int(hex_str[c : c + 2], 16) for c in (0, 2, 4)]
|
|
8
|
+
return [int(hex_str[c : c + 2], 16) for c in (0, 2, 4)]
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def rgb_to_hex(r, g, b):
|
nautobot/core/utils/data.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from collections import
|
|
1
|
+
from collections import namedtuple, OrderedDict
|
|
2
2
|
from decimal import Decimal
|
|
3
3
|
import uuid
|
|
4
4
|
|
|
@@ -7,7 +7,6 @@ from django.template import engines
|
|
|
7
7
|
|
|
8
8
|
from nautobot.dcim import choices # TODO move dcim.choices.CableLengthUnitChoices into core
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
# Setup UtilizationData named tuple for use by multiple methods
|
|
12
11
|
UtilizationData = namedtuple("UtilizationData", ["numerator", "denominator"])
|
|
13
12
|
|
nautobot/core/utils/filtering.py
CHANGED
|
@@ -13,7 +13,6 @@ from django_filters.utils import verbose_lookup_expr
|
|
|
13
13
|
from nautobot.core import exceptions
|
|
14
14
|
from nautobot.core.utils.lookup import get_filterset_for_model
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
# Check if field name contains a lookup expr
|
|
18
17
|
# e.g `name__ic` has lookup expr `ic (icontains)` while `name` has no lookup expr
|
|
19
18
|
CONTAINS_LOOKUP_EXPR_RE = re.compile(r"(?<=__)\w+")
|
|
@@ -88,10 +87,6 @@ def get_filterset_parameter_form_field(model, parameter, filterset=None):
|
|
|
88
87
|
Return the relevant form field instance for a filterset parameter e.g DynamicModelMultipleChoiceField, forms.IntegerField e.t.c
|
|
89
88
|
"""
|
|
90
89
|
# Avoid circular import
|
|
91
|
-
from nautobot.dcim.models import Device
|
|
92
|
-
from nautobot.extras.filters import ContentTypeMultipleChoiceFilter, CustomFieldFilterMixin, StatusFilter
|
|
93
|
-
from nautobot.extras.models import ConfigContext, Role, Status, Tag
|
|
94
|
-
from nautobot.extras.utils import ChangeLoggedModelsQuery, RoleModelsQuery, TaggableClassesQuery
|
|
95
90
|
from nautobot.core.filters import MultiValueDecimalFilter, MultiValueFloatFilter
|
|
96
91
|
from nautobot.core.forms import (
|
|
97
92
|
BOOLEAN_CHOICES,
|
|
@@ -100,6 +95,10 @@ def get_filterset_parameter_form_field(model, parameter, filterset=None):
|
|
|
100
95
|
StaticSelect2,
|
|
101
96
|
StaticSelect2Multiple,
|
|
102
97
|
)
|
|
98
|
+
from nautobot.dcim.models import Device
|
|
99
|
+
from nautobot.extras.filters import ContentTypeMultipleChoiceFilter, CustomFieldFilterMixin, StatusFilter
|
|
100
|
+
from nautobot.extras.models import ConfigContext, Role, Status, Tag
|
|
101
|
+
from nautobot.extras.utils import ChangeLoggedModelsQuery, RoleModelsQuery, TaggableClassesQuery
|
|
103
102
|
from nautobot.virtualization.models import VirtualMachine
|
|
104
103
|
|
|
105
104
|
if filterset is None or filterset.Meta.model != model:
|