nautobot 2.1.0__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nautobot/__init__.py +1 -3
- nautobot/apps/__init__.py +1 -2
- nautobot/apps/admin.py +0 -1
- nautobot/apps/api.py +0 -1
- nautobot/apps/change_logging.py +0 -1
- nautobot/apps/choices.py +0 -1
- nautobot/apps/datasources.py +0 -1
- nautobot/apps/exceptions.py +0 -1
- nautobot/apps/factory.py +0 -1
- nautobot/apps/filters.py +6 -9
- nautobot/apps/forms.py +1 -2
- nautobot/apps/graphql.py +0 -1
- nautobot/apps/jobs.py +0 -1
- nautobot/apps/models.py +1 -2
- nautobot/apps/querysets.py +0 -1
- nautobot/apps/secrets.py +0 -1
- nautobot/apps/tables.py +0 -1
- nautobot/apps/testing.py +0 -1
- nautobot/apps/ui.py +1 -3
- nautobot/apps/urls.py +0 -1
- nautobot/apps/utils.py +0 -1
- nautobot/apps/views.py +0 -1
- nautobot/circuits/api/serializers.py +1 -1
- nautobot/circuits/api/urls.py +1 -1
- nautobot/circuits/api/views.py +2 -1
- nautobot/circuits/apps.py +1 -1
- nautobot/circuits/choices.py +0 -1
- nautobot/circuits/factory.py +1 -1
- nautobot/circuits/filters.py +2 -1
- nautobot/circuits/forms.py +2 -2
- nautobot/circuits/homepage.py +0 -1
- nautobot/circuits/migrations/0001_initial_part_1.py +3 -1
- nautobot/circuits/migrations/0002_initial_part_2.py +2 -1
- nautobot/circuits/migrations/0003_auto_slug.py +1 -0
- nautobot/circuits/migrations/0005_providernetwork.py +4 -2
- nautobot/circuits/migrations/0013_alter_circuittermination__path.py +1 -0
- nautobot/circuits/migrations/0014_related_name_changes.py +1 -0
- nautobot/circuits/migrations/0016_tagsfield.py +1 -0
- nautobot/circuits/migrations/0018_status_nonnullable.py +1 -0
- nautobot/circuits/models.py +2 -2
- nautobot/circuits/navigation.py +0 -1
- nautobot/circuits/signals.py +3 -2
- nautobot/circuits/tables.py +1 -0
- nautobot/circuits/tests/integration/test_relationships.py +1 -1
- nautobot/circuits/tests/test_api.py +1 -1
- nautobot/circuits/tests/test_urls.py +1 -1
- nautobot/circuits/tests/test_views.py +1 -0
- nautobot/circuits/urls.py +1 -1
- nautobot/circuits/views.py +0 -2
- nautobot/core/__init__.py +0 -1
- nautobot/core/admin.py +3 -5
- nautobot/core/api/__init__.py +0 -1
- nautobot/core/api/metadata.py +4 -6
- nautobot/core/api/pagination.py +2 -2
- nautobot/core/api/parsers.py +1 -3
- nautobot/core/api/renderers.py +0 -1
- nautobot/core/api/schema.py +2 -3
- nautobot/core/api/serializers.py +9 -7
- nautobot/core/api/urls.py +1 -5
- nautobot/core/api/utils.py +4 -6
- nautobot/core/api/versioning.py +1 -1
- nautobot/core/api/views.py +22 -91
- nautobot/core/apps/__init__.py +5 -7
- nautobot/core/authentication.py +1 -1
- nautobot/core/celery/__init__.py +1 -2
- nautobot/core/celery/control.py +0 -2
- nautobot/core/celery/encoders.py +0 -1
- nautobot/core/celery/schedulers.py +1 -2
- nautobot/core/celery/task.py +1 -1
- nautobot/core/checks.py +1 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/cli/__init__.py +2 -3
- nautobot/core/context_processors.py +1 -5
- nautobot/core/factory.py +2 -2
- nautobot/core/filters.py +1 -1
- nautobot/core/forms/fields.py +2 -4
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/search.py +1 -1
- nautobot/core/forms/utils.py +1 -1
- nautobot/core/graphql/__init__.py +2 -3
- nautobot/core/graphql/generators.py +1 -1
- nautobot/core/graphql/schema.py +6 -7
- nautobot/core/graphql/schema_init.py +0 -1
- nautobot/core/graphql/utils.py +1 -2
- nautobot/core/management/commands/generate_test_data.py +4 -6
- nautobot/core/management/commands/makemigrations.py +1 -1
- nautobot/core/management/commands/migrate.py +1 -1
- nautobot/core/management/commands/post_upgrade.py +0 -15
- nautobot/core/management/commands/refresh_content_type_cache.py +1 -2
- nautobot/core/management/commands/send_installation_metrics.py +2 -3
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/middleware.py +2 -2
- nautobot/core/models/__init__.py +12 -12
- nautobot/core/models/fields.py +1 -1
- nautobot/core/models/generics.py +2 -3
- nautobot/core/models/managers.py +0 -1
- nautobot/core/models/name_color_content_types.py +2 -2
- nautobot/core/models/tree_queries.py +2 -4
- nautobot/core/models/validators.py +1 -1
- nautobot/core/releases.py +1 -1
- nautobot/core/runner/importer.py +2 -25
- nautobot/core/runner/runner.py +2 -2
- nautobot/core/runner/settings.py +1 -1
- nautobot/core/settings.py +9 -22
- nautobot/core/settings_funcs.py +1 -2
- nautobot/core/signals.py +0 -1
- nautobot/core/tables.py +1 -1
- nautobot/core/templates/graphene/graphiql.html +7 -1
- nautobot/core/templates/inc/footer.html +0 -7
- nautobot/core/templates/nautobot_config.py.j2 +0 -4
- nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
- nautobot/core/templatetags/buttons.py +1 -1
- nautobot/core/templatetags/helpers.py +5 -16
- nautobot/core/testing/__init__.py +1 -2
- nautobot/core/testing/api.py +2 -4
- nautobot/core/testing/filters.py +1 -1
- nautobot/core/testing/integration.py +2 -2
- nautobot/core/testing/migrations.py +1 -0
- nautobot/core/testing/mixins.py +1 -2
- nautobot/core/testing/schema.py +1 -1
- nautobot/core/testing/utils.py +3 -3
- nautobot/core/testing/views.py +4 -7
- nautobot/core/tests/integration/test_plugin_home.py +2 -1
- nautobot/core/tests/integration/test_plugin_navbar.py +1 -1
- nautobot/core/tests/nautobot_config.py +3 -3
- nautobot/core/tests/runner.py +3 -4
- nautobot/core/tests/test_api.py +6 -51
- nautobot/core/tests/test_authentication.py +2 -3
- nautobot/core/tests/test_checks.py +1 -2
- nautobot/core/tests/test_config.py +1 -1
- nautobot/core/tests/test_csv.py +3 -3
- nautobot/core/tests/test_factory.py +1 -3
- nautobot/core/tests/test_filters.py +3 -7
- nautobot/core/tests/test_forms.py +3 -6
- nautobot/core/tests/test_graphql.py +13 -14
- nautobot/core/tests/test_jinja_filters.py +4 -4
- nautobot/core/tests/test_jobs.py +1 -1
- nautobot/core/tests/test_models.py +1 -2
- nautobot/core/tests/test_navigations.py +2 -1
- nautobot/core/tests/test_openapi.py +0 -1
- nautobot/core/tests/test_paginator.py +2 -2
- nautobot/core/tests/test_releases.py +2 -2
- nautobot/core/tests/test_tables.py +1 -1
- nautobot/core/tests/test_templatetags_helpers.py +3 -2
- nautobot/core/tests/test_templatetags_netutils.py +1 -2
- nautobot/core/tests/test_utils.py +4 -8
- nautobot/core/tests/test_views.py +5 -2
- nautobot/core/tests/test_views_utils.py +0 -1
- nautobot/core/urls.py +4 -4
- nautobot/core/utils/color.py +1 -1
- nautobot/core/utils/data.py +1 -2
- nautobot/core/utils/filtering.py +4 -5
- nautobot/core/utils/git.py +3 -2
- nautobot/core/utils/logging.py +2 -1
- nautobot/core/utils/migrations.py +1 -0
- nautobot/core/utils/permissions.py +2 -4
- nautobot/core/views/__init__.py +5 -5
- nautobot/core/views/generic.py +4 -4
- nautobot/core/views/mixins.py +11 -12
- nautobot/core/views/renderers.py +1 -1
- nautobot/core/views/utils.py +2 -1
- nautobot/dcim/api/urls.py +1 -1
- nautobot/dcim/api/views.py +6 -5
- nautobot/dcim/apps.py +1 -1
- nautobot/dcim/choices.py +0 -1
- nautobot/dcim/constants.py +0 -1
- nautobot/dcim/elevations.py +1 -2
- nautobot/dcim/factory.py +10 -13
- nautobot/dcim/fields.py +1 -0
- nautobot/dcim/filters/__init__.py +2 -3
- nautobot/dcim/filters/mixins.py +1 -1
- nautobot/dcim/forms.py +10 -12
- nautobot/dcim/graphql/types.py +16 -17
- nautobot/dcim/migrations/0001_initial_part_1.py +4 -2
- nautobot/dcim/migrations/0002_initial_part_2.py +2 -1
- nautobot/dcim/migrations/0003_initial_part_3.py +2 -1
- nautobot/dcim/migrations/0004_initial_part_4.py +2 -1
- nautobot/dcim/migrations/0006_auto_slug.py +1 -0
- nautobot/dcim/migrations/0009_add_natural_indexing.py +1 -0
- nautobot/dcim/migrations/0010_interface_status.py +1 -0
- nautobot/dcim/migrations/0011_interface_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0013_location_location_type.py +4 -2
- nautobot/dcim/migrations/0014_location_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
- nautobot/dcim/migrations/0018_device_redundancy_group.py +4 -2
- nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0022_interface_redundancy_group.py +3 -1
- nautobot/dcim/migrations/0023_interface_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0024_move_site_fields_to_location_model.py +2 -1
- nautobot/dcim/migrations/0027_alter_interface_mac_address.py +1 -0
- nautobot/dcim/migrations/0028_alter_device_and_rack_role_add_new_role.py +1 -0
- nautobot/dcim/migrations/0029_device_and_rack_roles_data_migrations.py +1 -0
- nautobot/dcim/migrations/0033_add_tree_managers_and_foreign_keys_pre_data_migration.py +1 -0
- nautobot/dcim/migrations/0034_migrate_region_and_site_data_to_locations.py +1 -2
- nautobot/dcim/migrations/0038_fixup_fks_and_related_names.py +1 -0
- nautobot/dcim/migrations/0039_related_name_changes.py +1 -0
- nautobot/dcim/migrations/0042_alter_location_managers.py +1 -0
- nautobot/dcim/migrations/0044_tagsfield.py +1 -0
- nautobot/dcim/migrations/0047_status_nonnullable.py +1 -0
- nautobot/dcim/migrations/0051_interface_redundancy_group_nullable_status.py +1 -0
- nautobot/dcim/models/cables.py +3 -3
- nautobot/dcim/models/device_component_templates.py +6 -6
- nautobot/dcim/models/devices.py +9 -4
- nautobot/dcim/models/locations.py +6 -1
- nautobot/dcim/models/power.py +1 -1
- nautobot/dcim/models/racks.py +5 -4
- nautobot/dcim/navigation.py +0 -1
- nautobot/dcim/signals.py +3 -2
- nautobot/dcim/tables/__init__.py +5 -4
- nautobot/dcim/tables/cables.py +1 -0
- nautobot/dcim/tables/devices.py +1 -0
- nautobot/dcim/tables/power.py +1 -0
- nautobot/dcim/tables/racks.py +2 -1
- nautobot/dcim/tests/test_api.py +5 -7
- nautobot/dcim/tests/test_cablepaths.py +0 -1
- nautobot/dcim/tests/test_filters.py +14 -12
- nautobot/dcim/tests/test_forms.py +2 -3
- nautobot/dcim/tests/test_migrations.py +2 -2
- nautobot/dcim/tests/test_models.py +2 -2
- nautobot/dcim/tests/test_views.py +7 -8
- nautobot/dcim/urls.py +3 -2
- nautobot/dcim/utils.py +1 -1
- nautobot/dcim/views.py +4 -3
- nautobot/extras/admin.py +2 -1
- nautobot/extras/api/customfields.py +0 -2
- nautobot/extras/api/mixins.py +0 -1
- nautobot/extras/api/serializers.py +4 -4
- nautobot/extras/api/urls.py +1 -1
- nautobot/extras/api/views.py +1 -1
- nautobot/extras/apps.py +3 -4
- nautobot/extras/choices.py +3 -4
- nautobot/extras/context_managers.py +1 -1
- nautobot/extras/datasources/__init__.py +1 -1
- nautobot/extras/datasources/git.py +6 -6
- nautobot/extras/datasources/utils.py +0 -1
- nautobot/extras/factory.py +1 -1
- nautobot/extras/filters/__init__.py +2 -3
- nautobot/extras/filters/customfields.py +0 -1
- nautobot/extras/filters/mixins.py +1 -1
- nautobot/extras/forms/__init__.py +3 -4
- nautobot/extras/forms/base.py +1 -1
- nautobot/extras/forms/forms.py +3 -3
- nautobot/extras/forms/mixins.py +1 -1
- nautobot/extras/graphql/types.py +2 -2
- nautobot/extras/health_checks.py +1 -1
- nautobot/extras/jobs.py +1 -2
- nautobot/extras/management/__init__.py +0 -1
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -1
- nautobot/extras/management/commands/runjob.py +3 -3
- nautobot/extras/management/commands/webhook_receiver.py +1 -2
- nautobot/extras/migrations/0001_initial_part_1.py +2 -1
- nautobot/extras/migrations/0002_initial_part_2.py +2 -1
- nautobot/extras/migrations/0003_initial_part_3.py +1 -0
- nautobot/extras/migrations/0006_graphqlquery.py +2 -1
- nautobot/extras/migrations/0007_configcontextschema.py +3 -1
- nautobot/extras/migrations/0009_computedfield.py +3 -1
- nautobot/extras/migrations/0011_fileattachment_fileproxy.py +3 -1
- nautobot/extras/migrations/0012_healthchecktestmodel.py +2 -1
- nautobot/extras/migrations/0014_auto_slug.py +1 -0
- nautobot/extras/migrations/0015_scheduled_job.py +3 -1
- nautobot/extras/migrations/0016_secret.py +4 -2
- nautobot/extras/migrations/0017_joblogentry.py +2 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +2 -1
- nautobot/extras/migrations/0021_customfield_changelog_data.py +3 -2
- nautobot/extras/migrations/0022_objectchange_object_datav2.py +1 -0
- nautobot/extras/migrations/0023_job_model.py +4 -2
- nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +1 -0
- nautobot/extras/migrations/0029_dynamicgroup.py +3 -1
- nautobot/extras/migrations/0031_tag_content_types.py +1 -0
- nautobot/extras/migrations/0032_tag_content_types_data_migration.py +1 -0
- nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +2 -1
- nautobot/extras/migrations/0041_jobresult_job_kwargs.py +1 -0
- nautobot/extras/migrations/0043_note.py +3 -1
- nautobot/extras/migrations/0044_add_job_hook.py +3 -1
- nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +1 -0
- nautobot/extras/migrations/0047_enforce_custom_field_slug.py +1 -0
- nautobot/extras/migrations/0051_add_job_task_queues.py +1 -0
- nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +1 -0
- nautobot/extras/migrations/0057_jobbutton.py +3 -1
- nautobot/extras/migrations/0065_configcontext_data_migrations.py +1 -0
- nautobot/extras/migrations/0067_migrate_job_result_status.py +0 -1
- nautobot/extras/migrations/0068_jobresult__add_celery_fields.py +1 -0
- nautobot/extras/migrations/0071_replace_related_names.py +1 -0
- nautobot/extras/migrations/0077_migrate_custom_field_data.py +1 -0
- nautobot/extras/migrations/0078_remove_name_field_and_make_label_field_non_nullable.py +1 -0
- nautobot/extras/migrations/0080_tagsfield.py +1 -0
- nautobot/extras/migrations/0082_rename_relationship_name_to_label.py +1 -0
- nautobot/extras/migrations/0083_ensure_relationship_keys_are_unique.py +1 -0
- nautobot/extras/migrations/0090_joblogentry__log_level_data_migration.py +0 -1
- nautobot/extras/migrations/0095_ensure_note_timestamps_are_unique.py +4 -5
- nautobot/extras/migrations/0097_alter_job_result_remove_result.py +1 -0
- nautobot/extras/migrations/0100_fileproxy_job_result.py +1 -0
- nautobot/extras/migrations/0101_externalintegration.py +3 -1
- nautobot/extras/models/__init__.py +2 -3
- nautobot/extras/models/change_logging.py +0 -1
- nautobot/extras/models/customfields.py +4 -4
- nautobot/extras/models/datasources.py +2 -2
- nautobot/extras/models/groups.py +3 -4
- nautobot/extras/models/jobs.py +12 -6
- nautobot/extras/models/models.py +2 -2
- nautobot/extras/models/relationships.py +3 -4
- nautobot/extras/models/roles.py +1 -1
- nautobot/extras/models/secrets.py +1 -3
- nautobot/extras/models/tags.py +0 -1
- nautobot/extras/navigation.py +0 -1
- nautobot/extras/plugins/__init__.py +6 -7
- nautobot/extras/plugins/tables.py +0 -1
- nautobot/extras/plugins/utils.py +1 -1
- nautobot/extras/plugins/views.py +1 -2
- nautobot/extras/querysets.py +3 -3
- nautobot/extras/signals.py +6 -7
- nautobot/extras/tables.py +4 -4
- nautobot/extras/tasks.py +1 -2
- nautobot/extras/templates/extras/configcontext_edit.html +1 -1
- nautobot/extras/templates/extras/graphqlquery.html +4 -2
- nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
- nautobot/extras/templatetags/custom_links.py +2 -3
- nautobot/extras/templatetags/job_buttons.py +2 -3
- nautobot/extras/templatetags/log_levels.py +0 -1
- nautobot/extras/templatetags/plugins.py +1 -1
- nautobot/extras/test_jobs/api_test_job.py +1 -2
- nautobot/extras/test_jobs/atomic_transaction.py +1 -2
- nautobot/extras/test_jobs/dry_run.py +1 -2
- nautobot/extras/test_jobs/fail.py +1 -2
- nautobot/extras/test_jobs/field_order.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -2
- nautobot/extras/test_jobs/file_upload_pass.py +1 -2
- nautobot/extras/test_jobs/has_sensitive_variables.py +1 -2
- nautobot/extras/test_jobs/ipaddress_vars.py +1 -4
- nautobot/extras/test_jobs/job_button_receiver.py +1 -2
- nautobot/extras/test_jobs/job_hook_receiver.py +1 -2
- nautobot/extras/test_jobs/job_variables.py +1 -2
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -2
- nautobot/extras/test_jobs/log_redaction.py +1 -2
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -2
- nautobot/extras/test_jobs/modify_db.py +1 -2
- nautobot/extras/test_jobs/object_var_optional.py +1 -2
- nautobot/extras/test_jobs/object_var_required.py +1 -2
- nautobot/extras/test_jobs/object_vars.py +1 -2
- nautobot/extras/test_jobs/pass.py +1 -2
- nautobot/extras/test_jobs/profiling.py +1 -2
- nautobot/extras/tests/integration/__init__.py +1 -1
- nautobot/extras/tests/integration/test_plugins.py +5 -4
- nautobot/extras/tests/integration/test_tagfilter.py +1 -1
- nautobot/extras/tests/test_api.py +7 -9
- nautobot/extras/tests/test_changelog.py +3 -2
- nautobot/extras/tests/test_context_managers.py +6 -3
- nautobot/extras/tests/test_customfields.py +2 -2
- nautobot/extras/tests/test_datasources.py +1 -1
- nautobot/extras/tests/test_dynamicgroups.py +2 -3
- nautobot/extras/tests/test_filters.py +2 -2
- nautobot/extras/tests/test_forms.py +5 -6
- nautobot/extras/tests/test_git.py +1 -1
- nautobot/extras/tests/test_job_variables.py +0 -1
- nautobot/extras/tests/test_jobs.py +5 -5
- nautobot/extras/tests/test_models.py +2 -2
- nautobot/extras/tests/test_notes.py +0 -1
- nautobot/extras/tests/test_plugins.py +8 -9
- nautobot/extras/tests/test_relationships.py +3 -3
- nautobot/extras/tests/test_tags.py +1 -1
- nautobot/extras/tests/test_views.py +8 -9
- nautobot/extras/tests/test_webhooks.py +4 -5
- nautobot/extras/utils.py +11 -9
- nautobot/extras/views.py +3 -3
- nautobot/generate_secret_key.py +1 -1
- nautobot/ipam/api/serializers.py +1 -2
- nautobot/ipam/api/urls.py +1 -1
- nautobot/ipam/api/views.py +1 -0
- nautobot/ipam/apps.py +2 -1
- nautobot/ipam/factory.py +6 -9
- nautobot/ipam/fields.py +1 -1
- nautobot/ipam/filters.py +4 -3
- nautobot/ipam/formfields.py +1 -2
- nautobot/ipam/forms.py +4 -3
- nautobot/ipam/graphql/types.py +1 -1
- nautobot/ipam/homepage.py +0 -1
- nautobot/ipam/lookups.py +2 -3
- nautobot/ipam/migrations/0002_initial_part_2.py +2 -1
- nautobot/ipam/migrations/0003_remove_max_length.py +1 -0
- nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
- nautobot/ipam/migrations/0005_auto_slug.py +1 -0
- nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -0
- nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +1 -0
- nautobot/ipam/migrations/0020_related_name_changes.py +1 -0
- nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +1 -2
- nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +2 -1
- nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +1 -0
- nautobot/ipam/migrations/0028_tagsfield.py +1 -0
- nautobot/ipam/migrations/0030_ipam__namespaces.py +3 -1
- nautobot/ipam/migrations/0034_status_nonnullable.py +1 -0
- nautobot/ipam/migrations/0037_data_migration_vlan_group_name_uniqueness.py +0 -1
- nautobot/ipam/models.py +7 -7
- nautobot/ipam/navigation.py +0 -1
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +4 -3
- nautobot/ipam/tests/test_api.py +2 -2
- nautobot/ipam/tests/test_filters.py +7 -7
- nautobot/ipam/tests/test_migrations.py +1 -2
- nautobot/ipam/tests/test_models.py +2 -2
- nautobot/ipam/tests/test_ordering.py +1 -1
- nautobot/ipam/tests/test_querysets.py +2 -2
- nautobot/ipam/tests/test_views.py +6 -6
- nautobot/ipam/urls.py +1 -0
- nautobot/ipam/utils/migrations.py +0 -1
- nautobot/ipam/views.py +6 -6
- nautobot/project-static/docs/404.html +1 -43
- nautobot/project-static/docs/apps/index.html +1 -43
- nautobot/project-static/docs/apps/nautobot-apps.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +389 -431
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +12 -54
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2452 -2486
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +90 -132
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +26 -68
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +993 -1035
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +170 -212
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1789 -1831
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +961 -1003
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +2 -44
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +6904 -6946
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +974 -1016
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1159 -1197
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1796 -1832
- nautobot/project-static/docs/development/apps/api/configuration-view.html +1 -43
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/global-search.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/graphql.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -45
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +5 -43
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +1 -43
- nautobot/project-static/docs/development/apps/api/prometheus.html +1 -43
- nautobot/project-static/docs/development/apps/api/setup.html +1 -43
- nautobot/project-static/docs/development/apps/api/testing.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/base-template.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +6 -48
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/notes.html +3 -45
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/urls.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5357
- nautobot/project-static/docs/development/apps/index.html +1 -43
- nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -43
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -43
- nautobot/project-static/docs/development/apps/migration/from-v1.html +1 -44
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +1 -43
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +1 -43
- nautobot/project-static/docs/development/core/application-registry.html +1 -43
- nautobot/project-static/docs/development/core/best-practices.html +1 -43
- nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -43
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +1 -43
- nautobot/project-static/docs/development/core/extending-models.html +1 -43
- nautobot/project-static/docs/development/core/generic-views.html +1 -43
- nautobot/project-static/docs/development/core/getting-started.html +108 -257
- nautobot/project-static/docs/development/core/homepage.html +1 -43
- nautobot/project-static/docs/development/core/index.html +1 -43
- nautobot/project-static/docs/development/core/model-features.html +1 -43
- nautobot/project-static/docs/development/core/natural-keys.html +1 -43
- nautobot/project-static/docs/development/core/navigation-menu.html +1 -43
- nautobot/project-static/docs/development/core/react-ui.html +13 -5640
- nautobot/project-static/docs/development/core/release-checklist.html +4 -52
- nautobot/project-static/docs/development/core/role-internals.html +4 -46
- nautobot/project-static/docs/development/core/style-guide.html +61 -102
- nautobot/project-static/docs/development/core/templates.html +4 -46
- nautobot/project-static/docs/development/core/testing.html +1 -43
- nautobot/project-static/docs/development/core/user-preferences.html +1 -43
- nautobot/project-static/docs/development/index.html +1 -43
- nautobot/project-static/docs/development/jobs/index.html +1 -43
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +1 -43
- nautobot/project-static/docs/development/react-ui.html +3 -3
- nautobot/project-static/docs/index.html +2 -47
- nautobot/project-static/docs/release-notes/index.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.0.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.1.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.2.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.3.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.4.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.5.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.6.html +1 -43
- nautobot/project-static/docs/release-notes/version-2.0.html +1 -43
- nautobot/project-static/docs/release-notes/version-2.1.html +189 -77
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +236 -251
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5389
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1 -65
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/index.html +1 -64
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +2 -57
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +5 -94
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -43
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +1 -43
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +1 -43
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +76 -137
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +2 -44
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +23 -79
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +1 -43
- nautobot/project-static/docs/user-guide/index.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +5 -43
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +1 -43
- nautobot/project-static/js/theme.js +0 -5
- nautobot/tenancy/api/urls.py +1 -1
- nautobot/tenancy/api/views.py +1 -0
- nautobot/tenancy/factory.py +2 -2
- nautobot/tenancy/filters/__init__.py +1 -2
- nautobot/tenancy/forms.py +2 -2
- nautobot/tenancy/homepage.py +0 -1
- nautobot/tenancy/migrations/0001_initial.py +2 -1
- nautobot/tenancy/migrations/0002_auto_slug.py +1 -0
- nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +1 -0
- nautobot/tenancy/migrations/0008_tagsfield.py +1 -0
- nautobot/tenancy/models.py +0 -1
- nautobot/tenancy/navigation.py +0 -1
- nautobot/tenancy/tables.py +1 -0
- nautobot/tenancy/tests/test_filters.py +5 -5
- nautobot/tenancy/urls.py +1 -0
- nautobot/tenancy/views.py +2 -2
- nautobot/users/admin.py +1 -2
- nautobot/users/api/urls.py +1 -1
- nautobot/users/api/views.py +6 -4
- nautobot/users/factory.py +1 -3
- nautobot/users/filters.py +4 -4
- nautobot/users/forms.py +1 -0
- nautobot/users/migrations/0004_alter_user_managers.py +1 -0
- nautobot/users/migrations/0008_make_object_permission_a_changelogged_model.py +22 -0
- nautobot/users/models.py +2 -2
- nautobot/users/tests/test_api.py +7 -6
- nautobot/users/tests/test_filters.py +0 -1
- nautobot/users/tests/test_models.py +0 -1
- nautobot/users/tests/test_password_ui.py +1 -1
- nautobot/users/views.py +2 -2
- nautobot/virtualization/api/urls.py +1 -1
- nautobot/virtualization/api/views.py +2 -1
- nautobot/virtualization/apps.py +1 -1
- nautobot/virtualization/choices.py +0 -1
- nautobot/virtualization/factory.py +1 -1
- nautobot/virtualization/filters.py +1 -1
- nautobot/virtualization/forms.py +6 -6
- nautobot/virtualization/homepage.py +0 -1
- nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +1 -0
- nautobot/virtualization/migrations/0004_auto_slug.py +1 -0
- nautobot/virtualization/migrations/0005_add_natural_indexing.py +1 -0
- nautobot/virtualization/migrations/0006_vminterface_status.py +1 -0
- nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +1 -0
- nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +1 -0
- nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -0
- nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +1 -0
- nautobot/virtualization/migrations/0018_related_name_changes.py +1 -0
- nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +1 -0
- nautobot/virtualization/migrations/0025_status_nonnullable.py +1 -0
- nautobot/virtualization/models.py +1 -2
- nautobot/virtualization/navigation.py +0 -1
- nautobot/virtualization/signals.py +0 -1
- nautobot/virtualization/tables.py +1 -0
- nautobot/virtualization/tests/test_filters.py +3 -3
- nautobot/virtualization/tests/test_models.py +1 -1
- nautobot/virtualization/tests/test_views.py +2 -2
- nautobot/virtualization/urls.py +1 -0
- nautobot/virtualization/views.py +1 -1
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/METADATA +1 -1
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/RECORD +713 -814
- nautobot/core/management/commands/build_ui.py +0 -281
- nautobot/core/templates/base_react.html +0 -55
- nautobot/core/tests/test_cli.py +0 -25
- nautobot/ui/.eslintignore +0 -3
- nautobot/ui/.gitignore +0 -7
- nautobot/ui/.prettierignore +0 -6
- nautobot/ui/.prettierrc +0 -4
- nautobot/ui/README.md +0 -27
- nautobot/ui/config/env.js +0 -102
- nautobot/ui/config/getHttpsConfig.js +0 -68
- nautobot/ui/config/jest/babelTransform.js +0 -14
- nautobot/ui/config/jest/cssTransform.js +0 -12
- nautobot/ui/config/jest/fileTransform.js +0 -38
- nautobot/ui/config/modules.js +0 -151
- nautobot/ui/config/paths.js +0 -67
- nautobot/ui/config/webpack/persistentCache/createEnvironmentHash.js +0 -8
- nautobot/ui/config/webpack.config.js +0 -674
- nautobot/ui/config/webpackDevServer.config.js +0 -127
- nautobot/ui/jest.config.js +0 -35
- nautobot/ui/jsconfig.json +0 -4
- nautobot/ui/package-lock.json +0 -22947
- nautobot/ui/package.json +0 -119
- nautobot/ui/public/index.html +0 -47
- nautobot/ui/public/logo192.png +0 -0
- nautobot/ui/public/logo512.png +0 -0
- nautobot/ui/public/manifest.json +0 -25
- nautobot/ui/public/nautobot_logo.svg +0 -131
- nautobot/ui/public/robots.txt +0 -3
- nautobot/ui/scripts/build.js +0 -224
- nautobot/ui/scripts/start.js +0 -140
- nautobot/ui/scripts/test.js +0 -40
- nautobot/ui/src/App.js +0 -79
- nautobot/ui/src/components/AppFullWidthComponents.js +0 -8
- nautobot/ui/src/components/AppTab.js +0 -40
- nautobot/ui/src/components/Apps.js +0 -60
- nautobot/ui/src/components/FeedbackModal.js +0 -123
- nautobot/ui/src/components/FiltersPanel.js +0 -693
- nautobot/ui/src/components/HomeChangelogPanel.js +0 -98
- nautobot/ui/src/components/HomePanel.js +0 -58
- nautobot/ui/src/components/JobHistoryTable.js +0 -78
- nautobot/ui/src/components/Layout.js +0 -76
- nautobot/ui/src/components/LoadingWidget.js +0 -14
- nautobot/ui/src/components/Navbar.js +0 -204
- nautobot/ui/src/components/NotificationPopover.js +0 -27
- nautobot/ui/src/components/ObjectTable/ObjectListTable.js +0 -300
- nautobot/ui/src/components/ObjectTable/ObjectTable.js +0 -96
- nautobot/ui/src/components/ObjectTable/ObjectTableItem.js +0 -70
- nautobot/ui/src/components/ObjectTable/index.js +0 -3
- nautobot/ui/src/components/Pagination/PageNumberForm.js +0 -228
- nautobot/ui/src/components/Pagination/PageSizeForm.js +0 -65
- nautobot/ui/src/components/Pagination/Pagination.js +0 -67
- nautobot/ui/src/components/Pagination/index.js +0 -3
- nautobot/ui/src/components/ReferenceDataTag.js +0 -35
- nautobot/ui/src/components/Retrieve/RenderChangeLogsTab.js +0 -58
- nautobot/ui/src/components/Retrieve/RenderColumn.js +0 -30
- nautobot/ui/src/components/Retrieve/RenderGroup.js +0 -24
- nautobot/ui/src/components/Retrieve/RenderHeader.js +0 -125
- nautobot/ui/src/components/Retrieve/RenderNotesTab.js +0 -60
- nautobot/ui/src/components/Retrieve/RenderTable.js +0 -33
- nautobot/ui/src/components/Retrieve/RenderTabs.js +0 -56
- nautobot/ui/src/components/Retrieve/index.js +0 -7
- nautobot/ui/src/components/RouterButton.js +0 -10
- nautobot/ui/src/components/RouterLink.js +0 -10
- nautobot/ui/src/components/SidebarNav.js +0 -156
- nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +0 -16
- nautobot/ui/src/components/__tests__/AppTab.test.js +0 -21
- nautobot/ui/src/components/__tests__/Apps.test.js +0 -14
- nautobot/ui/src/components/__tests__/Layout.test.js +0 -33
- nautobot/ui/src/components/__tests__/PageSizeForm.test.js +0 -13
- nautobot/ui/src/components/__tests__/Pagination.test.js +0 -43
- nautobot/ui/src/components/__tests__/Table.test.js +0 -39
- nautobot/ui/src/components/__tests__/TableItem.test.js +0 -39
- nautobot/ui/src/components/index.js +0 -4
- nautobot/ui/src/constants/apiPath.js +0 -13
- nautobot/ui/src/constants/icons.js +0 -15
- nautobot/ui/src/constants/size.js +0 -15
- nautobot/ui/src/file_templates/app_imports.js.j2 +0 -7
- nautobot/ui/src/file_templates/jsconfig-base.json +0 -12
- nautobot/ui/src/index.js +0 -65
- nautobot/ui/src/reportWebVitals.js +0 -15
- nautobot/ui/src/router.js +0 -77
- nautobot/ui/src/utils/api.js +0 -160
- nautobot/ui/src/utils/app-import.js +0 -15
- nautobot/ui/src/utils/color.js +0 -15
- nautobot/ui/src/utils/date.js +0 -14
- nautobot/ui/src/utils/index.js +0 -15
- nautobot/ui/src/utils/navigation.js +0 -48
- nautobot/ui/src/utils/session.js +0 -64
- nautobot/ui/src/utils/store.js +0 -242
- nautobot/ui/src/utils/string.js +0 -6
- nautobot/ui/src/utils/url.js +0 -4
- nautobot/ui/src/views/Home.js +0 -142
- nautobot/ui/src/views/InstalledApps.js +0 -80
- nautobot/ui/src/views/Login.js +0 -48
- nautobot/ui/src/views/Logout.js +0 -20
- nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +0 -11
- nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +0 -107
- nautobot/ui/src/views/__tests__/Login.test.js +0 -15
- nautobot/ui/src/views/generic/GenericView.js +0 -191
- nautobot/ui/src/views/generic/ObjectCreate.js +0 -96
- nautobot/ui/src/views/generic/ObjectList.js +0 -137
- nautobot/ui/src/views/generic/ObjectRetrieve.js +0 -87
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
import copy
|
|
2
|
-
from importlib import import_module
|
|
3
|
-
import json
|
|
4
|
-
import os
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
import re
|
|
7
|
-
import shlex
|
|
8
|
-
import subprocess
|
|
9
|
-
|
|
10
|
-
from django.apps import apps
|
|
11
|
-
from django.conf import settings
|
|
12
|
-
from django.contrib.admindocs.views import simplify_regex
|
|
13
|
-
from django.core.management.base import BaseCommand, CommandError
|
|
14
|
-
import jinja2
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class Command(BaseCommand):
|
|
18
|
-
help = "Build the user interface for the Nautobot server environment and installed Nautobot Apps."
|
|
19
|
-
|
|
20
|
-
def add_arguments(self, parser):
|
|
21
|
-
parser.add_argument(
|
|
22
|
-
"--npm-install",
|
|
23
|
-
action="store_true",
|
|
24
|
-
dest="npm_install",
|
|
25
|
-
default=False,
|
|
26
|
-
help="Install UI packages.",
|
|
27
|
-
)
|
|
28
|
-
parser.add_argument(
|
|
29
|
-
"--no-render-apps",
|
|
30
|
-
action="store_false",
|
|
31
|
-
dest="render_apps",
|
|
32
|
-
default=True,
|
|
33
|
-
help="Do not (re)render Nautobot App imports.",
|
|
34
|
-
)
|
|
35
|
-
parser.add_argument(
|
|
36
|
-
"--no-npm-build",
|
|
37
|
-
action="store_false",
|
|
38
|
-
dest="npm_build",
|
|
39
|
-
default=True,
|
|
40
|
-
help="Do not compile UI.",
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
def convert_django_url_regex_to_react_route_path(self, regex):
|
|
44
|
-
"""
|
|
45
|
-
Converts a regular expression object to its equivalent react router path representation.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
regex (re.Pattern): A regular expression object.
|
|
49
|
-
|
|
50
|
-
Example:
|
|
51
|
-
>>> pattern = re.compile('^other-models/(?P<pk>[^/.]+)/notes/$')
|
|
52
|
-
>>> convert_django_url_regex_to_react_route_path(pattern)
|
|
53
|
-
'/other-models/:pk/notes/'
|
|
54
|
-
"""
|
|
55
|
-
pattern = str(regex.pattern)
|
|
56
|
-
path = simplify_regex(pattern).replace("<", ":").replace(">", "").replace("\\Z", "").replace("\\", "")
|
|
57
|
-
return path if path.endswith("/") else f"{path}/"
|
|
58
|
-
|
|
59
|
-
def get_app_component(self, file_path, route_name):
|
|
60
|
-
"""
|
|
61
|
-
Obtains the view component for the given route name from the index.js file of the App.
|
|
62
|
-
This locates the `route_name` in the app configuration `routes_view_components` dict and
|
|
63
|
-
returns the View Component registered for the `route_name`.
|
|
64
|
-
|
|
65
|
-
Parameters:
|
|
66
|
-
file_path (str): The path to the JavaScript file to read from.
|
|
67
|
-
route_name (str): The name of the route to extract the view component for.
|
|
68
|
-
|
|
69
|
-
Returns:
|
|
70
|
-
str: The view component associated with the specified route name, or None if not found.
|
|
71
|
-
|
|
72
|
-
Example:
|
|
73
|
-
>>> get_app_component(file_path="/src/example_plugin/example_plugin/ui/index.js", route_name="example-plugin:examplemodel_list")
|
|
74
|
-
"ExampleModelListView"
|
|
75
|
-
"""
|
|
76
|
-
try:
|
|
77
|
-
with open(file_path, "r") as f:
|
|
78
|
-
js_content = f.read()
|
|
79
|
-
except FileNotFoundError:
|
|
80
|
-
return None
|
|
81
|
-
|
|
82
|
-
# Construct a regular expression that matches the specified key and extracts the associated view component
|
|
83
|
-
pattern = rf'routes_view_components:\s*{{[^}}]*"{re.escape(route_name)}"\s*:\s*"([^"]+)"'
|
|
84
|
-
view_component_match = re.search(pattern, js_content)
|
|
85
|
-
return view_component_match[1] if view_component_match else None
|
|
86
|
-
|
|
87
|
-
def render_routes_imports(self, app_base_path, app_name, app_config):
|
|
88
|
-
"""
|
|
89
|
-
Renders the imports for the React Router components of the App's URLs.
|
|
90
|
-
|
|
91
|
-
This method inspects the `urlpatterns` list of the `urls.py` module of the App and generates
|
|
92
|
-
a list of dictionaries representing the React Router components and their corresponding URL paths.
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
app_base_path (Path): The base path of the Django app.
|
|
96
|
-
app_name (str): The name of the Django app.
|
|
97
|
-
app_config (AppConfig): The configuration object of the Django app.
|
|
98
|
-
|
|
99
|
-
Returns:
|
|
100
|
-
List[Dict[str, str]]: A list of dictionaries representing the React Router components and their
|
|
101
|
-
corresponding URL paths.
|
|
102
|
-
Each dictionary has the following keys:
|
|
103
|
-
- "path": The URL path pattern.
|
|
104
|
-
- "component": The React component associated with the URL path.
|
|
105
|
-
|
|
106
|
-
Example:
|
|
107
|
-
>>> render_routes_imports("/src/example_plugin/", "example_plugin", <AppConfig instance>)
|
|
108
|
-
[
|
|
109
|
-
{ "path": "example-plugin/", "component": "HomeView"},
|
|
110
|
-
{ "path": "example-plugin/config/", "component": "ConfigView"},
|
|
111
|
-
]
|
|
112
|
-
"""
|
|
113
|
-
data = []
|
|
114
|
-
try:
|
|
115
|
-
module = import_module(f"{app_name}.urls")
|
|
116
|
-
base_url = app_config.base_url or app_config.label
|
|
117
|
-
for urlpattern in module.urlpatterns:
|
|
118
|
-
if component := self.get_app_component(
|
|
119
|
-
app_base_path / "ui/index.js",
|
|
120
|
-
f"{base_url}:{urlpattern.name}",
|
|
121
|
-
):
|
|
122
|
-
path_regex = urlpattern.pattern.regex
|
|
123
|
-
url_path = self.convert_django_url_regex_to_react_route_path(path_regex)
|
|
124
|
-
data.append({"path": base_url + url_path, "component": component})
|
|
125
|
-
return data
|
|
126
|
-
except (AttributeError, ModuleNotFoundError):
|
|
127
|
-
# If an app does not include its url.py file or urls.py does not include a urlpatterns, skip.
|
|
128
|
-
return data
|
|
129
|
-
|
|
130
|
-
def render_app_imports(self, render_apps=False):
|
|
131
|
-
"""
|
|
132
|
-
Render dynamically constructed app-related files - `app_imports.js`, `app_routes.json`, `jsconfig.paths.json`.
|
|
133
|
-
|
|
134
|
-
- If `render_apps` is True, these files will be regenerated according to the apps included in settings.PLUGINS.
|
|
135
|
-
- If `render_apps` is False but the files do not yet exist, they will be created but will not include any apps.
|
|
136
|
-
- If `render_apps` is False and the files already exist, they will be left untouched.
|
|
137
|
-
"""
|
|
138
|
-
|
|
139
|
-
ui_dir = settings.NAUTOBOT_UI_DIR
|
|
140
|
-
|
|
141
|
-
# Input files
|
|
142
|
-
router_file_path = Path(ui_dir, "src", "router.js")
|
|
143
|
-
jsconfig_base_file_path = Path(ui_dir, "src", "file_templates", "jsconfig-base.json")
|
|
144
|
-
environment = jinja2.sandbox.SandboxedEnvironment(
|
|
145
|
-
loader=jinja2.FileSystemLoader(Path(ui_dir, "src", "file_templates"))
|
|
146
|
-
)
|
|
147
|
-
template = environment.get_template("app_imports.js.j2")
|
|
148
|
-
|
|
149
|
-
# Output files
|
|
150
|
-
output_dir = Path(ui_dir, "generated")
|
|
151
|
-
os.makedirs(output_dir, exist_ok=True)
|
|
152
|
-
jsconfig_file_path = Path(output_dir, "jsconfig.paths.json")
|
|
153
|
-
app_routes_file_path = Path(output_dir, "app_routes.json")
|
|
154
|
-
app_imports_final_file_path = Path(output_dir, "app_imports.js")
|
|
155
|
-
|
|
156
|
-
app_routes = {}
|
|
157
|
-
with open(jsconfig_base_file_path, "r", encoding="utf-8") as base_config_file:
|
|
158
|
-
jsconfig = json.load(base_config_file)
|
|
159
|
-
|
|
160
|
-
if render_apps:
|
|
161
|
-
self.stdout.write(self.style.WARNING(">>> Rendering Nautobot App imports..."))
|
|
162
|
-
# We're going to modify this list if apps don't have a `ui` directory.
|
|
163
|
-
enabled_apps = copy.copy(settings.PLUGINS)
|
|
164
|
-
|
|
165
|
-
for app_class_path in settings.PLUGINS:
|
|
166
|
-
app_name = app_class_path.split(".")[-1]
|
|
167
|
-
app_config = apps.get_app_config(app_name)
|
|
168
|
-
abs_app_path = Path(app_config.path).resolve()
|
|
169
|
-
abs_app_ui_path = abs_app_path / "ui"
|
|
170
|
-
app_path = Path(os.path.relpath(abs_app_path, ui_dir))
|
|
171
|
-
app_ui_path = app_path / "ui"
|
|
172
|
-
if app_routes_imports := self.render_routes_imports(abs_app_path, app_name, app_config):
|
|
173
|
-
app_routes[app_name] = app_routes_imports
|
|
174
|
-
|
|
175
|
-
# Assert that an App has a UI folder.
|
|
176
|
-
if not abs_app_ui_path.exists():
|
|
177
|
-
self.stdout.write(self.style.ERROR(f" - App {app_name!r} does not publish a UI; Skipping..."))
|
|
178
|
-
enabled_apps.remove(app_class_path)
|
|
179
|
-
continue
|
|
180
|
-
self.stdout.write(self.style.SUCCESS(f" - App {app_name!r} imported"))
|
|
181
|
-
|
|
182
|
-
jsconfig["compilerOptions"]["paths"][f"@{app_name}/*"] = [f"{app_ui_path}/*"]
|
|
183
|
-
else:
|
|
184
|
-
enabled_apps = []
|
|
185
|
-
|
|
186
|
-
files_generated = False
|
|
187
|
-
|
|
188
|
-
if render_apps or not os.path.exists(jsconfig_file_path):
|
|
189
|
-
with open(jsconfig_file_path, "w", encoding="utf-8") as generated_config_file:
|
|
190
|
-
json.dump(jsconfig, generated_config_file, indent=4)
|
|
191
|
-
self.stdout.write(self.style.SUCCESS(f" - Rendered {jsconfig_file_path}"))
|
|
192
|
-
files_generated = True
|
|
193
|
-
|
|
194
|
-
if render_apps or not os.path.exists(app_routes_file_path):
|
|
195
|
-
with open(app_routes_file_path, "w", encoding="utf-8") as app_routes_file:
|
|
196
|
-
json.dump(app_routes, app_routes_file, indent=4)
|
|
197
|
-
self.stdout.write(self.style.SUCCESS(f" - Rendered {app_routes_file_path}"))
|
|
198
|
-
files_generated = True
|
|
199
|
-
|
|
200
|
-
if render_apps or not os.path.exists(app_imports_final_file_path):
|
|
201
|
-
content = template.render(apps=enabled_apps)
|
|
202
|
-
with open(app_imports_final_file_path, "w", encoding="utf-8") as generated_import_file:
|
|
203
|
-
generated_import_file.write(content)
|
|
204
|
-
self.stdout.write(self.style.SUCCESS(f" - Rendered {app_imports_final_file_path}"))
|
|
205
|
-
files_generated = True
|
|
206
|
-
|
|
207
|
-
if files_generated:
|
|
208
|
-
# Touch the router to attempt to trigger a server reload.
|
|
209
|
-
Path(router_file_path).touch()
|
|
210
|
-
|
|
211
|
-
def run_command(self, command, message, cwd=settings.NAUTOBOT_UI_DIR):
|
|
212
|
-
"""
|
|
213
|
-
Run a `command`, displaying `message` and exit. This splits it for you and runs it.
|
|
214
|
-
|
|
215
|
-
Args:
|
|
216
|
-
command (str): The command to execute
|
|
217
|
-
message (str): Message to display when command is executed
|
|
218
|
-
"""
|
|
219
|
-
self.stdout.write(self.style.WARNING(message))
|
|
220
|
-
self.stdout.write(f"Running '{command}' in '{cwd}'...")
|
|
221
|
-
|
|
222
|
-
try:
|
|
223
|
-
result = subprocess.run(
|
|
224
|
-
shlex.split(command),
|
|
225
|
-
check=False,
|
|
226
|
-
cwd=cwd,
|
|
227
|
-
env={**os.environ.copy()},
|
|
228
|
-
encoding="utf-8",
|
|
229
|
-
capture_output=True,
|
|
230
|
-
)
|
|
231
|
-
except FileNotFoundError as err:
|
|
232
|
-
raise CommandError(f"'{command}' failed with error: {err}")
|
|
233
|
-
|
|
234
|
-
if result.returncode:
|
|
235
|
-
self.stdout.write(self.style.NOTICE(result.stdout))
|
|
236
|
-
self.stderr.write(self.style.ERROR(result.stderr))
|
|
237
|
-
raise CommandError(f"'{command}' failed with exit code {result.returncode}")
|
|
238
|
-
|
|
239
|
-
def handle(self, *args, **options):
|
|
240
|
-
verbosity = options["verbosity"]
|
|
241
|
-
|
|
242
|
-
# NAUTOBOT_DEBUG is also set here so that `console.log` isn't suppressed when we want
|
|
243
|
-
# verbosity.
|
|
244
|
-
if verbosity > 1:
|
|
245
|
-
os.environ["NAUTOBOT_DEBUG"] = "1"
|
|
246
|
-
|
|
247
|
-
verbosity_map = {
|
|
248
|
-
0: "silent",
|
|
249
|
-
1: "notice",
|
|
250
|
-
2: "info",
|
|
251
|
-
3: "silly", # MAXIMUM OVERDEBUG
|
|
252
|
-
}
|
|
253
|
-
loglevel = f"--loglevel {verbosity_map[verbosity]}"
|
|
254
|
-
|
|
255
|
-
if not os.path.exists(Path(settings.NAUTOBOT_UI_DIR)):
|
|
256
|
-
os.makedirs(Path(settings.NAUTOBOT_UI_DIR))
|
|
257
|
-
|
|
258
|
-
self.run_command(
|
|
259
|
-
f"cp -r {Path(settings.BASE_DIR, 'ui')}/. {Path(settings.NAUTOBOT_UI_DIR)}",
|
|
260
|
-
">>> Copying UI source files...",
|
|
261
|
-
)
|
|
262
|
-
|
|
263
|
-
# Generate `app_imports.js`, `app_routes.json`, and `jsconfig.paths.json` if necessary or if requested.
|
|
264
|
-
self.render_app_imports(options["render_apps"])
|
|
265
|
-
|
|
266
|
-
# Run `npm install` and keep it silent by default.
|
|
267
|
-
if options["npm_install"]:
|
|
268
|
-
args = f"install {loglevel} --no-progress"
|
|
269
|
-
self.run_command(f"npm {args}", ">>> Installing Nautobot UI dependencies...")
|
|
270
|
-
|
|
271
|
-
# Run `npm build` and keep it silent by default.
|
|
272
|
-
if options["npm_build"]:
|
|
273
|
-
args = f"run build {loglevel}"
|
|
274
|
-
self.run_command(f"npm {args}", ">>> Compiling Nautobot UI packages...")
|
|
275
|
-
self.run_command(
|
|
276
|
-
f"cp {Path(settings.NAUTOBOT_UI_DIR, 'build' ,'asset-manifest.json')} "
|
|
277
|
-
f"{Path(settings.NAUTOBOT_UI_DIR, 'build' , 'static', 'asset-manifest.json')}",
|
|
278
|
-
">>> Copying built manifest...",
|
|
279
|
-
)
|
|
280
|
-
|
|
281
|
-
self.stdout.write(self.style.SUCCESS(">>> Nautobot UI build complete! 🎉"))
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
{% load static %}
|
|
2
|
-
{% load helpers %}
|
|
3
|
-
{% load plugins %}
|
|
4
|
-
<!DOCTYPE html>
|
|
5
|
-
<html lang="en">
|
|
6
|
-
<head>
|
|
7
|
-
<meta charset="utf-8" />
|
|
8
|
-
<link rel="icon" href="/static/img/favicon.ico" />
|
|
9
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
10
|
-
<meta name="theme-color" content="#000000" />
|
|
11
|
-
<meta
|
|
12
|
-
name="description"
|
|
13
|
-
content="Web site created using create-react-app"
|
|
14
|
-
/>
|
|
15
|
-
<link rel="apple-touch-icon" href="/logo192.png" />
|
|
16
|
-
<!--
|
|
17
|
-
manifest.json provides metadata used when your web app is installed on a
|
|
18
|
-
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
|
|
19
|
-
-->
|
|
20
|
-
<link rel="manifest" href="{% static 'asset-manifest.json' %}" />
|
|
21
|
-
<link
|
|
22
|
-
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
|
|
23
|
-
rel="stylesheet"
|
|
24
|
-
/>
|
|
25
|
-
<!--
|
|
26
|
-
Notice the use of %PUBLIC_URL% in the tags above.
|
|
27
|
-
It will be replaced with the URL of the `public` folder during the build.
|
|
28
|
-
Only files inside the `public` folder can be referenced from the HTML.
|
|
29
|
-
|
|
30
|
-
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
|
|
31
|
-
work correctly both with client-side routing and a non-root public URL.
|
|
32
|
-
Learn how to configure a non-root public URL by running `npm run build`.
|
|
33
|
-
-->
|
|
34
|
-
<title>{{ settings.BRANDING_TITLE }}</title>
|
|
35
|
-
<script defer src="{% static 'js/main.js' %}"></script>
|
|
36
|
-
<link href="{% static 'css/main.css' %}" rel="stylesheet">
|
|
37
|
-
</head>
|
|
38
|
-
<body>
|
|
39
|
-
<noscript>You need to enable JavaScript to run this app.</noscript>
|
|
40
|
-
<div id="root"></div>
|
|
41
|
-
<div id="legacy-content" style="display:none">
|
|
42
|
-
{% block content %}{% endblock content %}
|
|
43
|
-
</div>
|
|
44
|
-
<!--
|
|
45
|
-
This HTML file is a template.
|
|
46
|
-
If you open it directly in the browser, you will see an empty page.
|
|
47
|
-
|
|
48
|
-
You can add webfonts, meta tags, or analytics to this file.
|
|
49
|
-
The build step will place the bundled scripts into the <body> tag.
|
|
50
|
-
|
|
51
|
-
To begin the development, run `npm start` or `yarn start`.
|
|
52
|
-
To create a production bundle, use `npm run build` or `yarn build`.
|
|
53
|
-
-->
|
|
54
|
-
</body>
|
|
55
|
-
</html>
|
nautobot/core/tests/test_cli.py
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"""Initial testing of cli.py"""
|
|
2
|
-
|
|
3
|
-
from nautobot.core import cli
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class TestCli:
|
|
7
|
-
def test_cli_setting_monkey_patch_return_value(self):
|
|
8
|
-
"""Validate _setting works provides the expected return value."""
|
|
9
|
-
storages_config = {
|
|
10
|
-
"AWS_ACCESS_KEY_ID": "ASFWDAMWWOQMEOQMWPMDA<WPDA",
|
|
11
|
-
"AWS_SECRET_ACCESS_KEY": "ASFKMWADMsacasdaw/dawrt1231541231231",
|
|
12
|
-
"AWS_STORAGE_BUCKET_NAME": "nautobot",
|
|
13
|
-
"AWS_S3_REGION_NAME": "us-west-1",
|
|
14
|
-
}
|
|
15
|
-
global_config = {"USE_TZ": True}
|
|
16
|
-
configs = storages_config.update(global_config)
|
|
17
|
-
for setting, value in configs.items():
|
|
18
|
-
result = cli._configure_settings._setting(setting)
|
|
19
|
-
assert result == value
|
|
20
|
-
|
|
21
|
-
def test_cli_setting_monkey_patch_return_none(self):
|
|
22
|
-
"""Validate _setting returns none for non-existent setting."""
|
|
23
|
-
configs = ("AWS_NON_EXISTENT_KEY", "STORAGE_NON_EXISTENT_KEY")
|
|
24
|
-
for setting in configs:
|
|
25
|
-
assert not cli._configure_settings._setting(setting)
|
nautobot/ui/.eslintignore
DELETED
nautobot/ui/.gitignore
DELETED
nautobot/ui/.prettierignore
DELETED
nautobot/ui/.prettierrc
DELETED
nautobot/ui/README.md
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# Nautobot v2 UI Prototype
|
|
2
|
-
|
|
3
|
-
## Running it
|
|
4
|
-
|
|
5
|
-
Install and compile dependencies (note that you'll only use `--npm-install` on initial setup):
|
|
6
|
-
|
|
7
|
-
```no-highlight
|
|
8
|
-
nautobot-server build_ui --npm-install
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Start Nautobot on port `8080/tcp`:
|
|
12
|
-
|
|
13
|
-
```no-highlight
|
|
14
|
-
nautobot-server runserver 0.0.0.0:8080 --insecure
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Running test
|
|
18
|
-
|
|
19
|
-
To run all UI test suites, run:
|
|
20
|
-
|
|
21
|
-
```no-highlight
|
|
22
|
-
invoke unittest-ui
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Debugging Startup/Build Failures
|
|
26
|
-
|
|
27
|
-
Nautobot will attempt to build the UI on startup when running `post_upgrade` but during development the React project may fail to build, never allowing the Node.JS container from starting. In that situation, skip running the `post_upgrade` until the React app can start. In container workflows that will mean setting the `NAUTOBOT_DOCKER_SKIP_INIT` environment variable to `True`.
|
nautobot/ui/config/env.js
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
const fs = require("fs");
|
|
2
|
-
const path = require("path");
|
|
3
|
-
const paths = require("./paths");
|
|
4
|
-
|
|
5
|
-
// Make sure that including paths.js after env.js will read .env variables.
|
|
6
|
-
delete require.cache[require.resolve("./paths")];
|
|
7
|
-
|
|
8
|
-
const NODE_ENV = process.env.NODE_ENV;
|
|
9
|
-
if (!NODE_ENV) {
|
|
10
|
-
throw new Error(
|
|
11
|
-
"The NODE_ENV environment variable is required but was not specified."
|
|
12
|
-
);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
|
|
16
|
-
const dotenvFiles = [
|
|
17
|
-
`${paths.dotenv}.${NODE_ENV}.local`,
|
|
18
|
-
// Don't include `.env.local` for `test` environment
|
|
19
|
-
// since normally you expect tests to produce the same
|
|
20
|
-
// results for everyone
|
|
21
|
-
NODE_ENV !== "test" && `${paths.dotenv}.local`,
|
|
22
|
-
`${paths.dotenv}.${NODE_ENV}`,
|
|
23
|
-
paths.dotenv,
|
|
24
|
-
].filter(Boolean);
|
|
25
|
-
|
|
26
|
-
// Load environment variables from .env* files. Suppress warnings using silent
|
|
27
|
-
// if this file is missing. dotenv will never modify any environment variables
|
|
28
|
-
// that have already been set. Variable expansion is supported in .env files.
|
|
29
|
-
// https://github.com/motdotla/dotenv
|
|
30
|
-
// https://github.com/motdotla/dotenv-expand
|
|
31
|
-
dotenvFiles.forEach((dotenvFile) => {
|
|
32
|
-
if (fs.existsSync(dotenvFile)) {
|
|
33
|
-
require("dotenv-expand")(
|
|
34
|
-
require("dotenv").config({
|
|
35
|
-
path: dotenvFile,
|
|
36
|
-
})
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// We support resolving modules according to `NODE_PATH`.
|
|
42
|
-
// This lets you use absolute paths in imports inside large monorepos:
|
|
43
|
-
// https://github.com/facebook/create-react-app/issues/253.
|
|
44
|
-
// It works similar to `NODE_PATH` in Node itself:
|
|
45
|
-
// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
|
|
46
|
-
// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored.
|
|
47
|
-
// Otherwise, we risk importing Node.js core modules into an app instead of webpack shims.
|
|
48
|
-
// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421
|
|
49
|
-
// We also resolve them to make sure all tools using them work consistently.
|
|
50
|
-
const appDirectory = fs.realpathSync(process.cwd());
|
|
51
|
-
process.env.NODE_PATH = (process.env.NODE_PATH || "")
|
|
52
|
-
.split(path.delimiter)
|
|
53
|
-
.filter((folder) => folder && !path.isAbsolute(folder))
|
|
54
|
-
.map((folder) => path.resolve(appDirectory, folder))
|
|
55
|
-
.join(path.delimiter);
|
|
56
|
-
|
|
57
|
-
// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
|
|
58
|
-
// injected into the application via DefinePlugin in webpack configuration.
|
|
59
|
-
const REACT_APP = /^REACT_APP_/i;
|
|
60
|
-
|
|
61
|
-
function getClientEnvironment(publicUrl) {
|
|
62
|
-
const raw = Object.keys(process.env)
|
|
63
|
-
.filter((key) => REACT_APP.test(key))
|
|
64
|
-
.reduce(
|
|
65
|
-
(env, key) => {
|
|
66
|
-
env[key] = process.env[key];
|
|
67
|
-
return env;
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
// Useful for determining whether we’re running in production mode.
|
|
71
|
-
// Most importantly, it switches React into the correct mode.
|
|
72
|
-
NODE_ENV: process.env.NODE_ENV || "development",
|
|
73
|
-
// Useful for resolving the correct path to static assets in `public`.
|
|
74
|
-
// For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
|
|
75
|
-
// This should only be used as an escape hatch. Normally you would put
|
|
76
|
-
// images into the `src` and `import` them in code to get their paths.
|
|
77
|
-
PUBLIC_URL: publicUrl,
|
|
78
|
-
// We support configuring the sockjs pathname during development.
|
|
79
|
-
// These settings let a developer run multiple simultaneous projects.
|
|
80
|
-
// They are used as the connection `hostname`, `pathname` and `port`
|
|
81
|
-
// in webpackHotDevClient. They are used as the `sockHost`, `sockPath`
|
|
82
|
-
// and `sockPort` options in webpack-dev-server.
|
|
83
|
-
WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST,
|
|
84
|
-
WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH,
|
|
85
|
-
WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT,
|
|
86
|
-
// Whether or not react-refresh is enabled.
|
|
87
|
-
// It is defined here so it is available in the webpackHotDevClient.
|
|
88
|
-
FAST_REFRESH: process.env.FAST_REFRESH !== "false",
|
|
89
|
-
}
|
|
90
|
-
);
|
|
91
|
-
// Stringify all values so we can feed into webpack DefinePlugin
|
|
92
|
-
const stringified = {
|
|
93
|
-
"process.env": Object.keys(raw).reduce((env, key) => {
|
|
94
|
-
env[key] = JSON.stringify(raw[key]);
|
|
95
|
-
return env;
|
|
96
|
-
}, {}),
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
return { raw, stringified };
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
module.exports = getClientEnvironment;
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
const fs = require("fs");
|
|
2
|
-
const path = require("path");
|
|
3
|
-
const crypto = require("crypto");
|
|
4
|
-
const chalk = require("react-dev-utils/chalk");
|
|
5
|
-
const paths = require("./paths");
|
|
6
|
-
|
|
7
|
-
// Ensure the certificate and key provided are valid and if not
|
|
8
|
-
// throw an easy to debug error
|
|
9
|
-
function validateKeyAndCerts({ cert, key, keyFile, crtFile }) {
|
|
10
|
-
let encrypted;
|
|
11
|
-
try {
|
|
12
|
-
// publicEncrypt will throw an error with an invalid cert
|
|
13
|
-
encrypted = crypto.publicEncrypt(cert, Buffer.from("test"));
|
|
14
|
-
} catch (err) {
|
|
15
|
-
throw new Error(
|
|
16
|
-
`The certificate "${chalk.yellow(crtFile)}" is invalid.\n${
|
|
17
|
-
err.message
|
|
18
|
-
}`
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
// privateDecrypt will throw an error with an invalid key
|
|
24
|
-
crypto.privateDecrypt(key, encrypted);
|
|
25
|
-
} catch (err) {
|
|
26
|
-
throw new Error(
|
|
27
|
-
`The certificate key "${chalk.yellow(keyFile)}" is invalid.\n${
|
|
28
|
-
err.message
|
|
29
|
-
}`
|
|
30
|
-
);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Read file and throw an error if it doesn't exist
|
|
35
|
-
function readEnvFile(file, type) {
|
|
36
|
-
if (!fs.existsSync(file)) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`You specified ${chalk.cyan(
|
|
39
|
-
type
|
|
40
|
-
)} in your env, but the file "${chalk.yellow(
|
|
41
|
-
file
|
|
42
|
-
)}" can't be found.`
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
return fs.readFileSync(file);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Get the https config
|
|
49
|
-
// Return cert files if provided in env, otherwise just true or false
|
|
50
|
-
function getHttpsConfig() {
|
|
51
|
-
const { SSL_CRT_FILE, SSL_KEY_FILE, HTTPS } = process.env;
|
|
52
|
-
const isHttps = HTTPS === "true";
|
|
53
|
-
|
|
54
|
-
if (isHttps && SSL_CRT_FILE && SSL_KEY_FILE) {
|
|
55
|
-
const crtFile = path.resolve(paths.appPath, SSL_CRT_FILE);
|
|
56
|
-
const keyFile = path.resolve(paths.appPath, SSL_KEY_FILE);
|
|
57
|
-
const config = {
|
|
58
|
-
cert: readEnvFile(crtFile, "SSL_CRT_FILE"),
|
|
59
|
-
key: readEnvFile(keyFile, "SSL_KEY_FILE"),
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
validateKeyAndCerts({ ...config, keyFile, crtFile });
|
|
63
|
-
return config;
|
|
64
|
-
}
|
|
65
|
-
return isHttps;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
module.exports = getHttpsConfig;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
const babelJest = require("babel-jest").default;
|
|
2
|
-
|
|
3
|
-
module.exports = babelJest.createTransformer({
|
|
4
|
-
presets: [
|
|
5
|
-
[
|
|
6
|
-
require.resolve("babel-preset-react-app"),
|
|
7
|
-
{
|
|
8
|
-
runtime: "automatic",
|
|
9
|
-
},
|
|
10
|
-
],
|
|
11
|
-
],
|
|
12
|
-
babelrc: false,
|
|
13
|
-
configFile: false,
|
|
14
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// This is a custom Jest transformer turning style imports into empty objects.
|
|
2
|
-
// http://facebook.github.io/jest/docs/en/webpack.html
|
|
3
|
-
|
|
4
|
-
module.exports = {
|
|
5
|
-
process() {
|
|
6
|
-
return "module.exports = {};";
|
|
7
|
-
},
|
|
8
|
-
getCacheKey() {
|
|
9
|
-
// The output is always the same.
|
|
10
|
-
return "cssTransform";
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
const path = require("path");
|
|
2
|
-
const camelcase = require("camelcase");
|
|
3
|
-
|
|
4
|
-
// This is a custom Jest transformer turning file imports into filenames.
|
|
5
|
-
// http://facebook.github.io/jest/docs/en/webpack.html
|
|
6
|
-
|
|
7
|
-
module.exports = {
|
|
8
|
-
process(src, filename) {
|
|
9
|
-
const assetFilename = JSON.stringify(path.basename(filename));
|
|
10
|
-
|
|
11
|
-
if (filename.match(/\.svg$/)) {
|
|
12
|
-
// Based on how SVGR generates a component name:
|
|
13
|
-
// https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
|
|
14
|
-
const pascalCaseFilename = camelcase(path.parse(filename).name, {
|
|
15
|
-
pascalCase: true,
|
|
16
|
-
});
|
|
17
|
-
const componentName = `Svg${pascalCaseFilename}`;
|
|
18
|
-
return `const React = require('react');
|
|
19
|
-
module.exports = {
|
|
20
|
-
__esModule: true,
|
|
21
|
-
default: ${assetFilename},
|
|
22
|
-
ReactComponent: React.forwardRef(function ${componentName}(props, ref) {
|
|
23
|
-
return {
|
|
24
|
-
$$typeof: Symbol.for('react.element'),
|
|
25
|
-
type: 'svg',
|
|
26
|
-
ref: ref,
|
|
27
|
-
key: null,
|
|
28
|
-
props: Object.assign({}, props, {
|
|
29
|
-
children: ${assetFilename}
|
|
30
|
-
})
|
|
31
|
-
};
|
|
32
|
-
}),
|
|
33
|
-
};`;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return `module.exports = ${assetFilename};`;
|
|
37
|
-
},
|
|
38
|
-
};
|