nautobot 2.0.0a2__py3-none-any.whl → 2.0.0b1__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 -5
- nautobot/apps/api.py +6 -8
- nautobot/apps/forms.py +0 -2
- nautobot/apps/ui.py +0 -8
- nautobot/circuits/api/serializers.py +9 -119
- nautobot/circuits/api/urls.py +1 -1
- nautobot/circuits/api/views.py +0 -1
- nautobot/circuits/choices.py +0 -2
- nautobot/circuits/filters.py +7 -6
- nautobot/circuits/forms.py +3 -73
- nautobot/circuits/migrations/0001_initial_part_1.py +0 -1
- nautobot/circuits/migrations/0002_initial_part_2.py +0 -1
- nautobot/circuits/migrations/0003_auto_slug.py +0 -1
- nautobot/circuits/migrations/0004_increase_provider_account_length.py +0 -1
- nautobot/circuits/migrations/0005_providernetwork.py +0 -1
- nautobot/circuits/migrations/0006_cache_circuit_terminations.py +0 -1
- nautobot/circuits/migrations/0007_circuitterminations_primary_model.py +0 -1
- nautobot/circuits/migrations/0008_add_natural_indexing.py +0 -1
- nautobot/circuits/migrations/0009_circuittermination_location.py +0 -1
- nautobot/circuits/migrations/0010_rename_foreign_keys_and_related_names.py +0 -1
- nautobot/circuits/migrations/0011_remove_site_foreign_key_from_circuit_termination_class.py +0 -1
- nautobot/circuits/migrations/0012_created_datetime.py +0 -1
- nautobot/circuits/migrations/0013_alter_circuittermination__path.py +0 -1
- nautobot/circuits/migrations/0014_related_name_changes.py +1 -2
- nautobot/circuits/migrations/0015_remove_circuittype_provider_slug.py +20 -0
- nautobot/circuits/migrations/0016_tagsfield.py +34 -0
- nautobot/circuits/migrations/0017_fixup_null_statuses.py +22 -0
- nautobot/circuits/migrations/0018_status_nonnullable.py +22 -0
- nautobot/circuits/models.py +3 -93
- nautobot/circuits/navigation.py +14 -69
- nautobot/circuits/signals.py +0 -2
- nautobot/circuits/tables.py +42 -5
- nautobot/circuits/templates/circuits/circuit_retrieve.html +1 -1
- nautobot/circuits/templates/circuits/circuittermination_retrieve.html +1 -1
- nautobot/circuits/templates/circuits/circuittype_retrieve.html +1 -1
- nautobot/circuits/templates/circuits/provider_create.html +0 -1
- nautobot/circuits/templates/circuits/provider_retrieve.html +1 -1
- nautobot/circuits/tests/integration/test_relationships.py +13 -16
- nautobot/circuits/tests/test_api.py +13 -43
- nautobot/circuits/tests/test_filters.py +20 -15
- nautobot/circuits/tests/test_models.py +7 -3
- nautobot/circuits/tests/test_views.py +57 -67
- nautobot/circuits/views.py +18 -9
- nautobot/core/api/__init__.py +8 -2
- nautobot/core/api/authentication.py +0 -3
- nautobot/core/api/fields.py +15 -6
- nautobot/core/api/filter_backends.py +3 -2
- nautobot/core/api/metadata.py +237 -30
- nautobot/core/api/mixins.py +94 -0
- nautobot/core/api/pagination.py +3 -3
- nautobot/core/api/parsers.py +154 -0
- nautobot/core/api/renderers.py +153 -2
- nautobot/core/api/schema.py +47 -3
- nautobot/core/api/serializers.py +377 -37
- nautobot/core/api/urls.py +11 -3
- nautobot/core/api/utils.py +174 -2
- nautobot/core/api/versioning.py +32 -10
- nautobot/core/api/views.py +266 -75
- nautobot/core/apps/__init__.py +138 -221
- nautobot/core/celery/__init__.py +112 -41
- nautobot/core/celery/backends.py +19 -13
- nautobot/core/celery/control.py +46 -0
- nautobot/core/celery/encoders.py +53 -0
- nautobot/core/celery/log.py +38 -0
- nautobot/core/celery/schedulers.py +23 -4
- nautobot/core/celery/task.py +1 -16
- nautobot/core/checks.py +0 -27
- nautobot/core/choices.py +21 -113
- nautobot/core/{cli.py → cli/__init__.py} +1 -2
- nautobot/core/cli/__main__.py +3 -0
- nautobot/core/constants.py +25 -43
- nautobot/core/context_processors.py +12 -0
- nautobot/core/filters.py +2 -2
- nautobot/core/forms/__init__.py +0 -4
- nautobot/core/forms/fields.py +39 -68
- nautobot/core/forms/forms.py +27 -27
- nautobot/core/forms/utils.py +7 -59
- nautobot/core/forms/widgets.py +0 -1
- nautobot/core/graphql/__init__.py +2 -2
- nautobot/core/graphql/schema.py +4 -27
- nautobot/core/jobs/__init__.py +75 -0
- nautobot/core/management/commands/build_ui.py +255 -0
- nautobot/core/management/commands/celery.py +0 -1
- nautobot/core/management/commands/generate_test_data.py +18 -13
- nautobot/core/management/commands/post_upgrade.py +24 -24
- nautobot/core/management/commands/validate_models.py +0 -1
- nautobot/core/middleware.py +0 -1
- nautobot/core/models/__init__.py +26 -1
- nautobot/core/models/fields.py +24 -5
- nautobot/core/models/generics.py +2 -46
- nautobot/core/models/managers.py +5 -0
- nautobot/core/models/name_color_content_types.py +1 -19
- nautobot/core/models/tree_queries.py +14 -4
- nautobot/core/models/utils.py +9 -10
- nautobot/core/models/validators.py +17 -8
- nautobot/core/releases.py +8 -10
- nautobot/core/settings.py +81 -53
- nautobot/core/tables.py +5 -5
- nautobot/core/tasks.py +4 -7
- nautobot/core/templates/base.html +1 -49
- nautobot/core/templates/base_django.html +49 -0
- nautobot/core/templates/base_react.html +55 -0
- nautobot/core/templates/buttons/export.html +6 -4
- nautobot/core/templates/generic/object_bulk_create.html +10 -21
- nautobot/core/templates/generic/object_list.html +4 -1
- nautobot/core/templates/generic/object_retrieve_plugin_full_width.html +3 -0
- nautobot/core/templates/inc/footer.html +1 -0
- nautobot/core/templates/inc/javascript.html +0 -14
- nautobot/core/templates/inc/nav_menu.html +28 -33
- nautobot/core/templates/inc/object_details_advanced_panel.html +13 -0
- nautobot/core/templates/inc/relationships_table_rows.html +2 -2
- nautobot/core/templates/nautobot_config.py.j2 +8 -25
- nautobot/core/templates/plugin_template/__init__.py-tpl +1 -2
- nautobot/core/templates/rest_framework/api.html +8 -0
- nautobot/core/templatetags/buttons.py +32 -29
- nautobot/core/templatetags/helpers.py +1 -1
- nautobot/core/testing/__init__.py +47 -44
- nautobot/core/testing/api.py +365 -47
- nautobot/core/testing/filters.py +12 -7
- nautobot/core/testing/integration.py +1 -1
- nautobot/core/testing/migrations.py +2 -0
- nautobot/core/testing/mixins.py +22 -12
- nautobot/core/testing/schema.py +2 -1
- nautobot/core/testing/views.py +28 -51
- nautobot/core/tests/integration/test_filters.py +17 -8
- nautobot/core/tests/integration/test_navbar.py +11 -34
- nautobot/core/tests/integration/test_plugin_navbar.py +9 -103
- nautobot/core/tests/nautobot_config.py +2 -3
- nautobot/core/tests/runner.py +0 -1
- nautobot/core/tests/test_api.py +290 -24
- nautobot/core/tests/test_authentication.py +57 -14
- nautobot/core/tests/test_checks.py +0 -7
- nautobot/core/tests/test_choices.py +0 -1
- nautobot/core/tests/test_filters.py +117 -110
- nautobot/core/tests/test_forms.py +47 -110
- nautobot/core/tests/test_graphql.py +158 -135
- nautobot/core/tests/test_logging.py +4 -1
- nautobot/core/tests/test_managers.py +3 -5
- nautobot/core/tests/test_models.py +2 -0
- nautobot/core/tests/test_ordering.py +0 -2
- nautobot/core/tests/test_paginator.py +3 -1
- nautobot/core/tests/test_releases.py +12 -12
- nautobot/core/tests/test_templatetags_helpers.py +7 -4
- nautobot/core/tests/test_utils.py +112 -78
- nautobot/core/tests/test_views.py +12 -17
- nautobot/core/tests/test_views_utils.py +6 -9
- nautobot/core/utils/data.py +17 -0
- nautobot/core/utils/deprecation.py +13 -20
- nautobot/core/utils/filtering.py +53 -9
- nautobot/core/utils/git.py +12 -4
- nautobot/core/utils/lookup.py +3 -1
- nautobot/core/utils/requests.py +23 -116
- nautobot/core/views/__init__.py +1 -2
- nautobot/core/views/generic.py +131 -119
- nautobot/core/views/mixins.py +53 -62
- nautobot/core/views/paginator.py +0 -1
- nautobot/core/views/renderers.py +14 -12
- nautobot/core/views/utils.py +87 -4
- nautobot/dcim/api/serializers.py +160 -672
- nautobot/dcim/api/urls.py +1 -1
- nautobot/dcim/api/views.py +7 -46
- nautobot/dcim/choices.py +2 -25
- nautobot/dcim/elevations.py +0 -1
- nautobot/dcim/factory.py +15 -4
- nautobot/dcim/filters/__init__.py +42 -13
- nautobot/dcim/form_mixins.py +1 -27
- nautobot/dcim/forms.py +58 -797
- nautobot/dcim/management/commands/trace_paths.py +0 -1
- nautobot/dcim/migrations/0001_initial_part_1.py +0 -1
- nautobot/dcim/migrations/0002_initial_part_2.py +0 -1
- nautobot/dcim/migrations/0003_initial_part_3.py +0 -1
- nautobot/dcim/migrations/0004_initial_part_4.py +0 -1
- nautobot/dcim/migrations/0005_device_local_context_schema.py +0 -1
- nautobot/dcim/migrations/0006_auto_slug.py +0 -1
- nautobot/dcim/migrations/0007_device_secrets_group.py +0 -1
- nautobot/dcim/migrations/0008_increase_all_serial_lengths.py +0 -1
- nautobot/dcim/migrations/0009_add_natural_indexing.py +0 -1
- nautobot/dcim/migrations/0010_interface_status.py +0 -1
- nautobot/dcim/migrations/0011_interface_status_data_migration.py +0 -1
- nautobot/dcim/migrations/0012_interface_parent_bridge.py +0 -1
- nautobot/dcim/migrations/0013_location_location_type.py +0 -1
- nautobot/dcim/migrations/0014_location_status_data_migration.py +0 -1
- nautobot/dcim/migrations/0015_device_components__changeloggedmodel.py +0 -1
- nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
- nautobot/dcim/migrations/0017_locationtype_nestable.py +0 -1
- nautobot/dcim/migrations/0018_device_redundancy_group.py +0 -1
- nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +0 -1
- nautobot/dcim/migrations/0020_move_site_fields_to_location_model.py +0 -1
- nautobot/dcim/migrations/0021_mptt_to_tree_queries.py +0 -1
- nautobot/dcim/migrations/0022_interface_mac_address_data_migration.py +0 -1
- nautobot/dcim/migrations/0023_alter_interface_mac_address.py +0 -1
- nautobot/dcim/migrations/0024_alter_device_and_rack_role_add_new_role.py +2 -2
- nautobot/dcim/migrations/0025_device_and_rack_roles_data_migrations.py +19 -14
- nautobot/dcim/migrations/0026_rename_device_and_rack_role.py +0 -1
- nautobot/dcim/migrations/0027_remove_device_role_and_rack_role.py +1 -2
- nautobot/dcim/migrations/0028_rename_foreignkey_fields.py +1 -2
- nautobot/dcim/migrations/0029_add_tree_managers_and_foreign_keys_pre_data_migration.py +0 -1
- nautobot/dcim/migrations/0030_migrate_region_and_site_data_to_locations.py +2 -2
- nautobot/dcim/migrations/0031_rename_path_end_point_related_name.py +0 -1
- nautobot/dcim/migrations/0032_remove_site_foreign_key_from_dcim_models.py +0 -1
- nautobot/dcim/migrations/0033_created_datetime.py +0 -1
- nautobot/dcim/migrations/0034_fixup_fks_and_related_names.py +0 -1
- nautobot/dcim/migrations/0035_related_name_changes.py +1 -2
- nautobot/dcim/migrations/0036_remove_region_and_site.py +1 -2
- nautobot/dcim/migrations/0037_interface_ip_addresses_m2m.py +0 -1
- nautobot/dcim/migrations/0038_alter_location_managers.py +0 -1
- nautobot/dcim/migrations/0039_remove_slug.py +24 -0
- nautobot/dcim/migrations/0040_tagsfield.py +109 -0
- nautobot/dcim/migrations/0041_ipam__namespaces.py +25 -0
- nautobot/dcim/migrations/0042_fixup_null_statuses.py +51 -0
- nautobot/dcim/migrations/0043_status_nonnullable.py +72 -0
- nautobot/dcim/models/cables.py +4 -35
- nautobot/dcim/models/device_component_templates.py +7 -2
- nautobot/dcim/models/device_components.py +26 -203
- nautobot/dcim/models/devices.py +30 -152
- nautobot/dcim/models/locations.py +3 -64
- nautobot/dcim/models/power.py +3 -51
- nautobot/dcim/models/racks.py +7 -86
- nautobot/dcim/navigation.py +141 -467
- nautobot/dcim/signals.py +0 -2
- nautobot/dcim/tables/devices.py +8 -5
- nautobot/dcim/tables/devicetypes.py +1 -1
- nautobot/dcim/tables/locations.py +2 -2
- nautobot/dcim/tables/power.py +2 -2
- nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -0
- nautobot/dcim/templates/dcim/device.html +15 -4
- nautobot/dcim/templates/dcim/device_edit.html +6 -0
- nautobot/dcim/templates/dcim/deviceredundancygroup_create.html +0 -1
- nautobot/dcim/templates/dcim/devicetype.html +2 -2
- nautobot/dcim/templates/dcim/interface.html +4 -0
- nautobot/dcim/templates/dcim/interface_connection_list.html +7 -0
- nautobot/dcim/templates/dcim/interface_edit.html +1 -0
- nautobot/dcim/templates/dcim/location.html +16 -1
- nautobot/dcim/templates/dcim/locationtype.html +15 -0
- nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -0
- nautobot/dcim/templates/dcim/rackgroup.html +0 -12
- nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
- nautobot/dcim/tests/test_api.py +202 -130
- nautobot/dcim/tests/test_cablepaths.py +47 -42
- nautobot/dcim/tests/test_filters.py +156 -134
- nautobot/dcim/tests/test_forms.py +12 -213
- nautobot/dcim/tests/test_graphql.py +8 -3
- nautobot/dcim/tests/test_migrations.py +6 -11
- nautobot/dcim/tests/test_models.py +208 -158
- nautobot/dcim/tests/test_natural_ordering.py +12 -14
- nautobot/dcim/tests/test_signals.py +7 -4
- nautobot/dcim/tests/test_views.py +270 -264
- nautobot/dcim/urls.py +21 -26
- nautobot/dcim/views.py +14 -156
- nautobot/docs/additional-features/caching.md +6 -87
- nautobot/docs/additional-features/job-scheduling-and-approvals.md +3 -0
- nautobot/docs/additional-features/jobs.md +179 -197
- nautobot/docs/administration/nautobot-server.md +9 -24
- nautobot/docs/administration/nautobot-shell.md +6 -6
- nautobot/docs/administration/replicating-nautobot.md +0 -10
- nautobot/docs/configuration/index.md +9 -9
- nautobot/docs/configuration/optional-settings.md +32 -61
- nautobot/docs/configuration/required-settings.md +11 -52
- nautobot/docs/development/application-registry.md +2 -13
- nautobot/docs/development/best-practices.md +2 -1
- nautobot/docs/development/docker-compose-advanced-use-cases.md +1 -1
- nautobot/docs/development/extending-models.md +15 -17
- nautobot/docs/development/generic-views.md +0 -2
- nautobot/docs/development/getting-started.md +56 -6
- nautobot/docs/development/navigation-menu.md +22 -93
- nautobot/docs/development/react-ui.md +105 -0
- nautobot/docs/development/release-checklist.md +3 -3
- nautobot/docs/development/role-internals.md +1 -3
- nautobot/docs/development/style-guide.md +6 -4
- nautobot/docs/development/templates.md +2 -1
- nautobot/docs/docker/index.md +16 -14
- nautobot/docs/index.md +7 -3
- nautobot/docs/installation/index.md +4 -1
- nautobot/docs/installation/migrating-from-netbox.md +12 -43
- nautobot/docs/installation/migrating-from-postgresql.md +1 -1
- nautobot/docs/installation/nautobot.md +1 -1
- nautobot/docs/installation/tables/v2-api-behavior-changes.yaml +70 -0
- nautobot/docs/installation/tables/v2-api-removed-fields.yaml +142 -0
- nautobot/docs/installation/tables/v2-api-renamed-fields.yaml +124 -0
- nautobot/docs/installation/tables/v2-code-location-changes.yaml +241 -0
- nautobot/docs/installation/tables/v2-code-removals.yaml +67 -0
- nautobot/docs/installation/tables/v2-database-behavior-changes.yaml +37 -0
- nautobot/docs/installation/tables/v2-database-removed-fields.yaml +166 -0
- nautobot/docs/installation/tables/v2-database-renamed-fields.yaml +340 -0
- nautobot/docs/installation/tables/v2-filters-corrected-fields.yaml +28 -0
- nautobot/docs/installation/tables/v2-filters-enhanced-fields.yaml +241 -0
- nautobot/docs/installation/tables/v2-filters-removed-fields.yaml +553 -0
- nautobot/docs/installation/tables/v2-filters-renamed-fields.yaml +223 -0
- nautobot/docs/installation/tables/v2-logging-renamed-loggers.yaml +23 -0
- nautobot/docs/installation/upgrading-from-nautobot-v1.md +190 -636
- nautobot/docs/installation/upgrading.md +5 -2
- nautobot/docs/models/dcim/device.md +3 -0
- nautobot/docs/models/dcim/deviceredundancygroup.md +3 -3
- nautobot/docs/models/extras/computedfield.md +4 -4
- nautobot/docs/models/extras/dynamicgroup.md +9 -9
- nautobot/docs/models/extras/gitrepository.md +3 -0
- nautobot/docs/models/extras/job.md +1 -0
- nautobot/docs/models/extras/jobbutton.md +18 -13
- nautobot/docs/models/extras/jobhook.md +7 -4
- nautobot/docs/models/extras/jobresult.md +6 -2
- nautobot/docs/models/extras/relationship.md +2 -2
- nautobot/docs/models/extras/status.md +6 -19
- nautobot/docs/models/ipam/ipaddress.md +3 -0
- nautobot/docs/models/ipam/vrf.md +0 -3
- nautobot/docs/models/virtualization/virtualmachine.md +3 -0
- nautobot/docs/plugins/development.md +92 -24
- nautobot/docs/release-notes/version-1.5.md +96 -0
- nautobot/docs/release-notes/version-2.0.md +216 -0
- nautobot/docs/requirements.txt +5 -4
- nautobot/docs/rest-api/overview.md +384 -215
- nautobot/docs/rest-api/ui-related-endpoints.md +9 -0
- nautobot/extras/admin.py +3 -5
- nautobot/extras/api/customfields.py +15 -39
- nautobot/extras/api/fields.py +0 -11
- nautobot/extras/api/mixins.py +45 -0
- nautobot/extras/api/relationships.py +63 -159
- nautobot/extras/api/serializers.py +165 -706
- nautobot/extras/api/urls.py +1 -1
- nautobot/extras/api/views.py +295 -282
- nautobot/extras/apps.py +4 -7
- nautobot/extras/choices.py +11 -22
- nautobot/extras/constants.py +9 -3
- nautobot/extras/datasources/__init__.py +2 -0
- nautobot/extras/datasources/git.py +135 -186
- nautobot/extras/datasources/registry.py +25 -35
- nautobot/extras/factory.py +1 -3
- nautobot/extras/filters/__init__.py +49 -47
- nautobot/extras/filters/mixins.py +10 -8
- nautobot/extras/forms/forms.py +72 -148
- nautobot/extras/forms/mixins.py +34 -57
- nautobot/extras/health_checks.py +0 -33
- nautobot/extras/jobs.py +387 -566
- nautobot/extras/management/__init__.py +55 -48
- nautobot/extras/management/commands/renaturalize.py +0 -1
- nautobot/extras/management/commands/runjob.py +24 -62
- nautobot/extras/management/commands/webhook_receiver.py +0 -1
- nautobot/extras/managers.py +30 -7
- nautobot/extras/migrations/0001_initial_part_1.py +0 -1
- nautobot/extras/migrations/0002_initial_part_2.py +0 -1
- nautobot/extras/migrations/0003_initial_part_3.py +0 -1
- nautobot/extras/migrations/0004_populate_default_status_records.py +0 -1
- nautobot/extras/migrations/0005_configcontext_device_types.py +0 -1
- nautobot/extras/migrations/0006_graphqlquery.py +0 -1
- nautobot/extras/migrations/0007_configcontextschema.py +0 -1
- nautobot/extras/migrations/0008_jobresult__custom_field_data.py +0 -1
- nautobot/extras/migrations/0009_computedfield.py +0 -1
- nautobot/extras/migrations/0010_change_cf_validation_max_min_field_to_bigint.py +0 -1
- nautobot/extras/migrations/0011_fileattachment_fileproxy.py +0 -1
- nautobot/extras/migrations/0012_healthchecktestmodel.py +0 -1
- nautobot/extras/migrations/0013_default_fallback_value_computedfield.py +0 -1
- nautobot/extras/migrations/0014_auto_slug.py +0 -1
- nautobot/extras/migrations/0015_scheduled_job.py +0 -1
- nautobot/extras/migrations/0016_secret.py +0 -1
- nautobot/extras/migrations/0017_joblogentry.py +0 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +0 -2
- nautobot/extras/migrations/0019_joblogentry__meta_options__related_name.py +0 -1
- nautobot/extras/migrations/0020_customfield_changelog.py +0 -1
- nautobot/extras/migrations/0021_customfield_changelog_data.py +0 -1
- nautobot/extras/migrations/0022_objectchange_object_datav2.py +0 -1
- nautobot/extras/migrations/0023_job_model.py +0 -1
- nautobot/extras/migrations/0024_job_data_migration.py +0 -1
- nautobot/extras/migrations/0025_add_advanced_ui_boolean_to_customfield_conputedfield_and_relationship.py +0 -1
- nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +0 -1
- nautobot/extras/migrations/0027_job_gitrepository_data_migration.py +0 -1
- nautobot/extras/migrations/0028_job_reduce_source.py +0 -1
- nautobot/extras/migrations/0029_dynamicgroup.py +0 -1
- nautobot/extras/migrations/0030_webhook_alter_unique_together.py +0 -1
- nautobot/extras/migrations/0031_tag_content_types.py +0 -1
- nautobot/extras/migrations/0032_tag_content_types_data_migration.py +0 -1
- nautobot/extras/migrations/0033_add__optimized_indexing.py +0 -1
- nautobot/extras/migrations/0034_alter_fileattachment_mimetype.py +0 -1
- nautobot/extras/migrations/0035_scheduledjob_crontab.py +0 -1
- nautobot/extras/migrations/0036_job_add_has_sensitive_variables.py +0 -1
- nautobot/extras/migrations/0037_configcontextschema__remove_name_unique__create_constraint_unique_name_owner.py +0 -1
- nautobot/extras/migrations/0038_configcontext_locations.py +0 -1
- nautobot/extras/migrations/0039_objectchange__add_change_context.py +0 -1
- nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +0 -1
- nautobot/extras/migrations/0041_jobresult_job_kwargs.py +0 -1
- nautobot/extras/migrations/0042_job__add_is_job_hook_receiver.py +0 -1
- nautobot/extras/migrations/0043_note.py +0 -1
- nautobot/extras/migrations/0044_add_job_hook.py +0 -1
- nautobot/extras/migrations/0045_add_custom_field_slug.py +0 -1
- nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +0 -1
- nautobot/extras/migrations/0047_enforce_custom_field_slug.py +0 -1
- nautobot/extras/migrations/0048_alter_objectchange_change_context_detail.py +0 -1
- nautobot/extras/migrations/0049_alter_tag_slug.py +0 -1
- nautobot/extras/migrations/0050_customfield_grouping.py +0 -1
- nautobot/extras/migrations/0051_add_job_task_queues.py +0 -1
- nautobot/extras/migrations/0052_configcontext_device_redundancy_groups.py +0 -1
- nautobot/extras/migrations/0053_relationship_required_on.py +0 -1
- nautobot/extras/migrations/0054_scheduledjob_kwargs_request_user_change.py +0 -1
- nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +0 -1
- nautobot/extras/migrations/0056_objectchange_add_reverse_time_idx.py +0 -1
- nautobot/extras/migrations/0057_jobbutton.py +0 -1
- nautobot/extras/migrations/0058_jobresult_add_time_status_idxs.py +38 -0
- nautobot/extras/migrations/{0058_joblogentry_scheduledjob_webhook_data_migration.py → 0059_joblogentry_scheduledjob_webhook_data_migration.py} +1 -2
- nautobot/extras/migrations/{0059_alter_joblogentry_scheduledjob_webhook_fields.py → 0060_alter_joblogentry_scheduledjob_webhook_fields.py} +1 -2
- nautobot/extras/migrations/{0060_role_and_alter_status.py → 0061_role_and_alter_status.py} +1 -8
- nautobot/extras/migrations/{0061_collect_roles_from_related_apps_roles.py → 0062_collect_roles_from_related_apps_roles.py} +33 -33
- nautobot/extras/migrations/{0062_alter_role_options.py → 0063_alter_role_options.py} +1 -2
- nautobot/extras/migrations/{0063_alter_configcontext_and_add_new_role.py → 0064_alter_configcontext_and_add_new_role.py} +1 -2
- nautobot/extras/migrations/0065_configcontext_data_migrations.py +44 -0
- nautobot/extras/migrations/{0065_rename_configcontext_role.py → 0066_rename_configcontext_role.py} +1 -2
- nautobot/extras/migrations/{0066_jobresult__add_celery_fields.py → 0067_jobresult__add_celery_fields.py} +36 -3
- nautobot/extras/migrations/{0067_created_datetime.py → 0068_created_datetime.py} +1 -2
- nautobot/extras/migrations/{0068_remove_site_and_region_attributes_from_config_context.py → 0069_remove_site_and_region_attributes_from_config_context.py} +1 -2
- nautobot/extras/migrations/{0069_replace_related_names.py → 0070_replace_related_names.py} +1 -1
- nautobot/extras/migrations/{0070_rename_model_fields.py → 0071_rename_model_fields.py} +1 -2
- nautobot/extras/migrations/0072_job__unique_name_data_migration.py +86 -0
- nautobot/extras/migrations/{0072_job__unique_name.py → 0073_job__unique_name.py} +13 -10
- nautobot/extras/migrations/{0073_remove_gitrepository_fields.py → 0074_remove_gitrepository_fields.py} +1 -2
- nautobot/extras/migrations/{0074_rename_slug_to_key_for_custom_field.py → 0075_rename_slug_to_key_for_custom_field.py} +1 -1
- nautobot/extras/migrations/{0075_migrate_custom_field_data.py → 0076_migrate_custom_field_data.py} +1 -1
- nautobot/extras/migrations/{0076_remove_name_field_and_make_label_field_non_nullable.py → 0077_remove_name_field_and_make_label_field_non_nullable.py} +1 -1
- nautobot/extras/migrations/0078_remove_slug.py +45 -0
- nautobot/extras/migrations/0079_tagsfield.py +28 -0
- nautobot/extras/migrations/0080_rename_relationship_slug_to_key.py +17 -0
- nautobot/extras/migrations/0081_rename_relationship_name_to_label.py +29 -0
- nautobot/extras/migrations/0082_ensure_relationship_keys_are_unique.py +43 -0
- nautobot/extras/migrations/0083_rename_computed_field_slug_to_key.py +21 -0
- nautobot/extras/migrations/0084_taggeditem_cleanup.py +43 -0
- nautobot/extras/migrations/0085_taggeditem_uniqueness.py +22 -0
- nautobot/extras/migrations/0086_job__celery_task_fields__dryrun_support.py +81 -0
- nautobot/extras/migrations/0087_job__commit_default_data_migration.py +26 -0
- nautobot/extras/migrations/0088_joblogentry__log_level_default.py +17 -0
- nautobot/extras/migrations/0089_joblogentry__log_level_data_migration.py +34 -0
- nautobot/extras/migrations/0090_scheduledjob__data_migration.py +57 -0
- nautobot/extras/models/__init__.py +2 -3
- nautobot/extras/models/change_logging.py +0 -36
- nautobot/extras/models/customfields.py +39 -33
- nautobot/extras/models/datasources.py +48 -50
- nautobot/extras/models/groups.py +5 -12
- nautobot/extras/models/jobs.py +190 -323
- nautobot/extras/models/mixins.py +0 -71
- nautobot/extras/models/models.py +1 -22
- nautobot/extras/models/relationships.py +20 -21
- nautobot/extras/models/roles.py +0 -23
- nautobot/extras/models/secrets.py +2 -31
- nautobot/extras/models/statuses.py +6 -5
- nautobot/extras/models/tags.py +2 -17
- nautobot/extras/navigation.py +89 -307
- nautobot/extras/plugins/__init__.py +3 -121
- nautobot/extras/plugins/utils.py +0 -3
- nautobot/extras/plugins/validators.py +5 -4
- nautobot/extras/plugins/views.py +16 -4
- nautobot/extras/querysets.py +1 -7
- nautobot/extras/registry.py +3 -0
- nautobot/extras/signals.py +26 -60
- nautobot/extras/tables.py +42 -49
- nautobot/extras/tasks.py +0 -12
- nautobot/extras/templates/extras/configcontext.html +1 -1
- nautobot/extras/templates/extras/configcontextschema.html +16 -1
- nautobot/extras/templates/extras/customfield.html +0 -13
- nautobot/extras/templates/extras/dynamicgroup_edit.html +0 -1
- nautobot/extras/templates/extras/gitrepository.html +3 -3
- nautobot/extras/templates/extras/inc/jobresult.html +10 -0
- nautobot/extras/templates/extras/inc/panel_jobhistory.html +1 -1
- nautobot/extras/templates/extras/job.html +35 -25
- nautobot/extras/templates/extras/job_approval_request.html +15 -30
- nautobot/extras/templates/extras/job_detail.html +13 -31
- nautobot/extras/templates/extras/job_edit.html +14 -17
- nautobot/extras/templates/extras/jobresult.html +24 -6
- nautobot/extras/templates/extras/objectchange_list.html +1 -1
- nautobot/extras/templates/extras/scheduledjob.html +2 -2
- nautobot/extras/templates/extras/secret.html +28 -0
- nautobot/extras/templates/extras/secret_edit.html +0 -1
- nautobot/extras/templates/extras/secretsgroup_edit.html +0 -1
- nautobot/extras/templatetags/custom_links.py +0 -2
- nautobot/extras/templatetags/job_buttons.py +1 -0
- nautobot/extras/templatetags/plugins.py +0 -1
- nautobot/extras/{tests/example_jobs → test_jobs}/api_test_job.py +13 -6
- nautobot/extras/test_jobs/atomic_transaction.py +53 -0
- nautobot/extras/test_jobs/dry_run.py +29 -0
- nautobot/extras/{tests/example_jobs/test_duplicate_name.py → test_jobs/duplicate_name.py} +4 -0
- nautobot/extras/test_jobs/duplicate_name2.py +9 -0
- nautobot/extras/test_jobs/fail.py +23 -0
- nautobot/extras/{tests/example_jobs/test_field_default.py → test_jobs/field_default.py} +4 -0
- nautobot/extras/{tests/example_jobs/test_field_order.py → test_jobs/field_order.py} +4 -0
- nautobot/extras/{tests/example_jobs/test_file_upload_fail.py → test_jobs/file_upload_fail.py} +11 -6
- nautobot/extras/test_jobs/file_upload_pass.py +25 -0
- nautobot/extras/test_jobs/has_sensitive_variables.py +25 -0
- nautobot/extras/test_jobs/ipaddress_vars.py +66 -0
- nautobot/extras/test_jobs/job_button_receiver.py +28 -0
- nautobot/extras/test_jobs/job_hook_receiver.py +29 -0
- nautobot/extras/test_jobs/job_variables.py +88 -0
- nautobot/extras/test_jobs/location_with_custom_field.py +45 -0
- nautobot/extras/test_jobs/log_redaction.py +20 -0
- nautobot/extras/test_jobs/log_skip_db_logging.py +17 -0
- nautobot/extras/test_jobs/modify_db.py +25 -0
- nautobot/extras/{tests/example_jobs/test_no_field_order.py → test_jobs/no_field_order.py} +4 -0
- nautobot/extras/test_jobs/object_var_optional.py +21 -0
- nautobot/extras/test_jobs/object_var_required.py +21 -0
- nautobot/extras/test_jobs/object_vars.py +26 -0
- nautobot/extras/test_jobs/pass.py +25 -0
- nautobot/extras/test_jobs/profiling.py +32 -0
- nautobot/extras/test_jobs/read_only_job.py +15 -0
- nautobot/extras/{tests/example_jobs/test_required_args.py → test_jobs/required_args.py} +4 -0
- nautobot/extras/{tests/example_jobs/test_soft_time_limit_greater_than_time_limit.py → test_jobs/soft_time_limit_greater_than_time_limit.py} +5 -1
- nautobot/extras/{tests/example_jobs/test_task_queues.py → test_jobs/task_queues.py} +5 -1
- nautobot/extras/tests/integration/__init__.py +3 -3
- nautobot/extras/tests/integration/test_computedfields.py +1 -1
- nautobot/extras/tests/integration/test_configcontextschema.py +7 -5
- nautobot/extras/tests/integration/test_customfields.py +4 -2
- nautobot/extras/tests/integration/test_dynamicgroups.py +2 -2
- nautobot/extras/tests/integration/test_jobs.py +25 -27
- nautobot/extras/tests/integration/test_notes.py +8 -4
- nautobot/extras/tests/integration/test_plugins.py +4 -4
- nautobot/extras/tests/integration/test_relationships.py +2 -2
- nautobot/extras/tests/test_api.py +371 -381
- nautobot/extras/tests/test_changelog.py +17 -16
- nautobot/extras/tests/test_context_managers.py +5 -6
- nautobot/extras/tests/test_customfields.py +112 -73
- nautobot/extras/tests/test_datasources.py +191 -117
- nautobot/extras/tests/test_dynamicgroups.py +45 -68
- nautobot/extras/tests/test_filters.py +170 -130
- nautobot/extras/tests/test_forms.py +107 -109
- nautobot/extras/tests/{test_scripts.py → test_job_variables.py} +43 -49
- nautobot/extras/tests/test_jobs.py +271 -273
- nautobot/extras/tests/test_management.py +3 -6
- nautobot/extras/tests/test_migrations.py +5 -3
- nautobot/extras/tests/test_models.py +121 -173
- nautobot/extras/tests/test_notes.py +0 -1
- nautobot/extras/tests/test_plugins.py +55 -89
- nautobot/extras/tests/test_relationships.py +174 -130
- nautobot/extras/tests/test_tags.py +6 -12
- nautobot/extras/tests/test_utils.py +31 -1
- nautobot/extras/tests/test_views.py +223 -184
- nautobot/extras/tests/test_webhooks.py +16 -15
- nautobot/extras/urls.py +69 -69
- nautobot/extras/utils.py +137 -163
- nautobot/extras/views.py +81 -153
- nautobot/ipam/api/fields.py +17 -0
- nautobot/ipam/api/serializers.py +77 -164
- nautobot/ipam/api/urls.py +4 -1
- nautobot/ipam/api/views.py +28 -19
- nautobot/ipam/apps.py +1 -0
- nautobot/ipam/choices.py +5 -12
- nautobot/ipam/constants.py +1 -0
- nautobot/ipam/factory.py +41 -30
- nautobot/ipam/filters.py +58 -25
- nautobot/ipam/forms.py +82 -211
- nautobot/ipam/graphql/types.py +0 -9
- nautobot/ipam/lookups.py +13 -8
- nautobot/ipam/management/commands/__init__.py +0 -0
- nautobot/ipam/management/commands/fix_prefix_broadcast.py +17 -0
- nautobot/ipam/migrations/0001_initial_part_1.py +0 -1
- nautobot/ipam/migrations/0002_initial_part_2.py +0 -1
- nautobot/ipam/migrations/0003_remove_max_length.py +0 -1
- nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
- nautobot/ipam/migrations/0005_auto_slug.py +0 -1
- nautobot/ipam/migrations/0006_ipaddress_nat_outside_list.py +0 -1
- nautobot/ipam/migrations/0007_add_natural_indexing.py +0 -1
- nautobot/ipam/migrations/0008_prefix_vlan_vlangroup_location.py +0 -1
- nautobot/ipam/migrations/0009_alter_vlan_name.py +0 -1
- nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -2
- nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +32 -39
- nautobot/ipam/migrations/0012_rename_ipam_roles.py +0 -1
- nautobot/ipam/migrations/0013_delete_role.py +0 -1
- nautobot/ipam/migrations/0014_rename_foreign_keys_and_related_names.py +0 -1
- nautobot/ipam/migrations/0015_prefix_add_type.py +0 -1
- nautobot/ipam/migrations/0016_prefix_type_data_migration.py +0 -3
- nautobot/ipam/migrations/0017_prefix_remove_is_pool.py +0 -1
- nautobot/ipam/migrations/0018_remove_site_foreign_key_from_ipam_models.py +0 -1
- nautobot/ipam/migrations/0019_created_datetime.py +0 -1
- nautobot/ipam/migrations/0020_related_name_changes.py +1 -2
- nautobot/ipam/migrations/0021_prefix_add_rir_and_date_allocated.py +0 -1
- nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +3 -5
- nautobot/ipam/migrations/0023_delete_aggregate.py +0 -1
- nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +0 -1
- nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +0 -1
- nautobot/ipam/migrations/0026_ipaddress_remove_assigned_object.py +0 -1
- nautobot/ipam/migrations/0027_remove_rir_slug.py +16 -0
- nautobot/ipam/migrations/0028_tagsfield.py +44 -0
- nautobot/ipam/migrations/0029_ip_address_to_interface_uniqueness_constraints.py +18 -0
- nautobot/ipam/migrations/0030_ipam__namespaces.py +231 -0
- nautobot/ipam/migrations/0031_ipam__prefix__add_parent.py +58 -0
- nautobot/ipam/migrations/0032_ipam__namespaces_finish.py +63 -0
- nautobot/ipam/migrations/0033_fixup_null_statuses.py +26 -0
- nautobot/ipam/migrations/0034_status_nonnullable.py +36 -0
- nautobot/ipam/models.py +579 -368
- nautobot/ipam/navigation.py +36 -159
- nautobot/ipam/querysets.py +117 -90
- nautobot/ipam/signals.py +89 -0
- nautobot/ipam/tables.py +86 -28
- nautobot/ipam/templates/ipam/ipaddress.html +14 -30
- nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -0
- nautobot/ipam/templates/ipam/namespace_ipaddresses.html +11 -0
- nautobot/ipam/templates/ipam/namespace_prefixes.html +11 -0
- nautobot/ipam/templates/ipam/namespace_retrieve.html +42 -0
- nautobot/ipam/templates/ipam/namespace_vrfs.html +11 -0
- nautobot/ipam/templates/ipam/prefix.html +27 -33
- nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
- nautobot/ipam/templates/ipam/vlangroup.html +0 -13
- nautobot/ipam/templates/ipam/vrf.html +6 -4
- nautobot/ipam/templates/ipam/vrf_edit.html +20 -2
- nautobot/ipam/tests/integration/test_prefixes.py +4 -27
- nautobot/ipam/tests/test_api.py +60 -61
- nautobot/ipam/tests/test_filters.py +187 -126
- nautobot/ipam/tests/test_forms.py +12 -6
- nautobot/ipam/tests/test_graphql.py +8 -6
- nautobot/ipam/tests/test_migrations.py +8 -13
- nautobot/ipam/tests/test_models.py +426 -274
- nautobot/ipam/tests/test_ordering.py +6 -3
- nautobot/ipam/tests/test_querysets.py +340 -96
- nautobot/ipam/tests/test_views.py +100 -55
- nautobot/ipam/urls.py +28 -5
- nautobot/ipam/{utils.py → utils/__init__.py} +2 -2
- nautobot/ipam/utils/migrations.py +713 -0
- nautobot/ipam/views.py +237 -122
- nautobot/project-static/docs/404.html +1399 -166
- nautobot/project-static/docs/additional-features/caching.html +1416 -320
- nautobot/project-static/docs/additional-features/change-logging.html +1389 -190
- nautobot/project-static/docs/additional-features/config-contexts.html +1389 -190
- nautobot/project-static/docs/additional-features/graphql.html +1389 -190
- nautobot/project-static/docs/additional-features/healthcheck.html +1389 -190
- nautobot/project-static/docs/additional-features/job-scheduling-and-approvals.html +1393 -190
- nautobot/project-static/docs/additional-features/jobs.html +1677 -460
- nautobot/project-static/docs/additional-features/napalm.html +1389 -190
- nautobot/project-static/docs/additional-features/prometheus-metrics.html +1389 -190
- nautobot/project-static/docs/additional-features/template-filters.html +1389 -190
- nautobot/project-static/docs/administration/celery-queues.html +1389 -190
- nautobot/project-static/docs/administration/nautobot-server.html +1553 -375
- nautobot/project-static/docs/administration/nautobot-shell.html +1395 -196
- nautobot/project-static/docs/administration/permissions.html +1389 -190
- nautobot/project-static/docs/administration/replicating-nautobot.html +1387 -207
- nautobot/project-static/docs/apps/index.html +1389 -190
- nautobot/project-static/docs/apps/nautobot-apps.html +1387 -175
- nautobot/project-static/docs/assets/javascripts/bundle.51198bba.min.js +29 -0
- nautobot/project-static/docs/assets/javascripts/bundle.51198bba.min.js.map +8 -0
- nautobot/project-static/docs/assets/javascripts/workers/{search.16e2a7d4.min.js → search.208ed371.min.js} +9 -15
- nautobot/project-static/docs/assets/javascripts/workers/{search.16e2a7d4.min.js.map → search.208ed371.min.js.map} +4 -4
- nautobot/project-static/docs/assets/stylesheets/main.ded33207.min.css +1 -0
- nautobot/project-static/docs/assets/stylesheets/main.ded33207.min.css.map +1 -0
- nautobot/project-static/docs/assets/stylesheets/palette.a0c5b2b5.min.css +1 -0
- nautobot/project-static/docs/assets/stylesheets/palette.a0c5b2b5.min.css.map +1 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +1775 -590
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +1389 -190
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +3588 -1922
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +1461 -262
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1401 -170
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1396 -191
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +2095 -894
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +2357 -1194
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2258 -940
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1389 -190
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1400 -201
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +11068 -7861
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +2867 -2224
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1389 -190
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +2641 -1573
- nautobot/project-static/docs/configuration/authentication/ldap.html +1389 -190
- nautobot/project-static/docs/configuration/authentication/remote.html +1389 -190
- nautobot/project-static/docs/configuration/authentication/sso.html +1389 -190
- nautobot/project-static/docs/configuration/index.html +1398 -199
- nautobot/project-static/docs/configuration/optional-settings.html +1418 -274
- nautobot/project-static/docs/configuration/required-settings.html +1419 -287
- nautobot/project-static/docs/core-functionality/circuits.html +1446 -247
- nautobot/project-static/docs/core-functionality/device-types.html +1448 -249
- nautobot/project-static/docs/core-functionality/devices.html +1452 -249
- nautobot/project-static/docs/core-functionality/ipam.html +1452 -253
- nautobot/project-static/docs/core-functionality/power.html +1448 -249
- nautobot/project-static/docs/core-functionality/secrets.html +1448 -249
- nautobot/project-static/docs/core-functionality/services.html +1448 -249
- nautobot/project-static/docs/core-functionality/sites-and-racks.html +1448 -249
- nautobot/project-static/docs/core-functionality/tenancy.html +1448 -249
- nautobot/project-static/docs/core-functionality/virtualization.html +1452 -249
- nautobot/project-static/docs/core-functionality/vlans.html +1448 -249
- nautobot/project-static/docs/development/application-registry.html +1393 -214
- nautobot/project-static/docs/development/best-practices.html +1392 -192
- nautobot/project-static/docs/development/docker-compose-advanced-use-cases.html +1390 -191
- nautobot/project-static/docs/development/extending-models.html +1443 -257
- nautobot/project-static/docs/development/generic-views.html +1403 -174
- nautobot/project-static/docs/development/getting-started.html +1568 -262
- nautobot/project-static/docs/development/homepage.html +1389 -190
- nautobot/project-static/docs/development/index.html +1389 -190
- nautobot/project-static/docs/development/model-features.html +1389 -190
- nautobot/project-static/docs/development/natural-keys.html +1389 -190
- nautobot/project-static/docs/development/navigation-menu.html +1451 -330
- nautobot/project-static/docs/development/react-ui.html +4199 -0
- nautobot/project-static/docs/development/release-checklist.html +1392 -193
- nautobot/project-static/docs/development/role-internals.html +1402 -172
- nautobot/project-static/docs/development/style-guide.html +1399 -199
- nautobot/project-static/docs/development/templates.html +1391 -191
- nautobot/project-static/docs/development/testing.html +1389 -190
- nautobot/project-static/docs/development/user-preferences.html +1389 -190
- nautobot/project-static/docs/docker/index.html +1408 -206
- nautobot/project-static/docs/index.html +1397 -180
- nautobot/project-static/docs/installation/centos.html +1401 -170
- nautobot/project-static/docs/installation/external-authentication.html +1389 -190
- nautobot/project-static/docs/installation/http-server.html +1389 -190
- nautobot/project-static/docs/installation/index.html +1394 -191
- nautobot/project-static/docs/installation/migrating-from-netbox.html +1452 -305
- nautobot/project-static/docs/installation/migrating-from-postgresql.html +1390 -191
- nautobot/project-static/docs/installation/nautobot.html +1390 -191
- nautobot/project-static/docs/installation/region-and-site-data-migration-guide.html +1389 -190
- nautobot/project-static/docs/installation/selinux-troubleshooting.html +1401 -170
- nautobot/project-static/docs/installation/services.html +1389 -190
- nautobot/project-static/docs/installation/tables/v2-api-behavior-changes.yaml +70 -0
- nautobot/project-static/docs/installation/tables/v2-api-removed-fields.yaml +142 -0
- nautobot/project-static/docs/installation/tables/v2-api-renamed-fields.yaml +124 -0
- nautobot/project-static/docs/installation/tables/v2-code-location-changes.yaml +241 -0
- nautobot/project-static/docs/installation/tables/v2-code-removals.yaml +67 -0
- nautobot/project-static/docs/installation/tables/v2-database-behavior-changes.yaml +37 -0
- nautobot/project-static/docs/installation/tables/v2-database-removed-fields.yaml +166 -0
- nautobot/project-static/docs/installation/tables/v2-database-renamed-fields.yaml +340 -0
- nautobot/project-static/docs/installation/tables/v2-filters-corrected-fields.yaml +28 -0
- nautobot/project-static/docs/installation/tables/v2-filters-enhanced-fields.yaml +241 -0
- nautobot/project-static/docs/installation/tables/v2-filters-removed-fields.yaml +553 -0
- nautobot/project-static/docs/installation/tables/v2-filters-renamed-fields.yaml +223 -0
- nautobot/project-static/docs/installation/tables/v2-logging-renamed-loggers.yaml +23 -0
- nautobot/project-static/docs/installation/ubuntu.html +1401 -170
- nautobot/project-static/docs/installation/upgrading-from-nautobot-v1.html +4254 -1923
- nautobot/project-static/docs/installation/upgrading.html +1395 -192
- nautobot/project-static/docs/models/circuits/circuit.html +1427 -174
- nautobot/project-static/docs/models/circuits/circuittermination.html +1427 -174
- nautobot/project-static/docs/models/circuits/circuittype.html +1427 -174
- nautobot/project-static/docs/models/circuits/provider.html +1427 -174
- nautobot/project-static/docs/models/circuits/providernetwork.html +1427 -174
- nautobot/project-static/docs/models/dcim/cable.html +1458 -174
- nautobot/project-static/docs/models/dcim/consoleport.html +1427 -174
- nautobot/project-static/docs/models/dcim/consoleporttemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/consoleserverport.html +1427 -174
- nautobot/project-static/docs/models/dcim/consoleserverporttemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/device.html +1431 -174
- nautobot/project-static/docs/models/dcim/devicebay.html +1427 -174
- nautobot/project-static/docs/models/dcim/devicebaytemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/deviceredundancygroup.html +1522 -177
- nautobot/project-static/docs/models/dcim/devicetype.html +1427 -174
- nautobot/project-static/docs/models/dcim/frontport.html +1427 -174
- nautobot/project-static/docs/models/dcim/frontporttemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/interface.html +1427 -174
- nautobot/project-static/docs/models/dcim/interfacetemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/inventoryitem.html +1427 -174
- nautobot/project-static/docs/models/dcim/location.html +1427 -174
- nautobot/project-static/docs/models/dcim/locationtype.html +1427 -174
- nautobot/project-static/docs/models/dcim/manufacturer.html +1427 -174
- nautobot/project-static/docs/models/dcim/platform.html +1427 -174
- nautobot/project-static/docs/models/dcim/powerfeed.html +1425 -172
- nautobot/project-static/docs/models/dcim/poweroutlet.html +1427 -174
- nautobot/project-static/docs/models/dcim/poweroutlettemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/powerpanel.html +1425 -172
- nautobot/project-static/docs/models/dcim/powerport.html +1427 -174
- nautobot/project-static/docs/models/dcim/powerporttemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/rack.html +1427 -174
- nautobot/project-static/docs/models/dcim/rackgroup.html +1427 -174
- nautobot/project-static/docs/models/dcim/rackreservation.html +1427 -174
- nautobot/project-static/docs/models/dcim/rearport.html +1427 -174
- nautobot/project-static/docs/models/dcim/rearporttemplate.html +1427 -174
- nautobot/project-static/docs/models/dcim/region.html +1401 -170
- nautobot/project-static/docs/models/dcim/site.html +1401 -170
- nautobot/project-static/docs/models/dcim/virtualchassis.html +1425 -172
- nautobot/project-static/docs/models/extras/computedfield.html +1393 -194
- nautobot/project-static/docs/models/extras/configcontext.html +1465 -174
- nautobot/project-static/docs/models/extras/configcontextschema.html +1421 -168
- nautobot/project-static/docs/models/extras/customfield.html +1389 -190
- nautobot/project-static/docs/models/extras/customlink.html +1389 -190
- nautobot/project-static/docs/models/extras/dynamicgroup.html +1398 -199
- nautobot/project-static/docs/models/extras/exporttemplate.html +1389 -190
- nautobot/project-static/docs/models/extras/gitrepository.html +1393 -190
- nautobot/project-static/docs/models/extras/graphqlquery.html +1469 -171
- nautobot/project-static/docs/models/extras/imageattachment.html +1434 -181
- nautobot/project-static/docs/models/extras/job.html +1411 -157
- nautobot/project-static/docs/models/extras/jobbutton.html +1410 -207
- nautobot/project-static/docs/models/extras/jobhook.html +1397 -194
- nautobot/project-static/docs/models/extras/joblogentry.html +1408 -155
- nautobot/project-static/docs/models/extras/jobresult.html +1417 -159
- nautobot/project-static/docs/models/extras/note.html +1389 -190
- nautobot/project-static/docs/models/extras/relationship.html +1391 -192
- nautobot/project-static/docs/models/extras/role.html +1495 -198
- nautobot/project-static/docs/models/extras/secret.html +1492 -201
- nautobot/project-static/docs/models/extras/secretsgroup.html +1410 -157
- nautobot/project-static/docs/models/extras/status.html +1381 -221
- nautobot/project-static/docs/models/extras/tag.html +1389 -190
- nautobot/project-static/docs/models/extras/webhook.html +1389 -190
- nautobot/project-static/docs/models/ipam/ipaddress.html +1488 -200
- nautobot/project-static/docs/models/ipam/prefix.html +1410 -157
- nautobot/project-static/docs/models/ipam/rir.html +1410 -157
- nautobot/project-static/docs/models/ipam/routetarget.html +1410 -157
- nautobot/project-static/docs/models/ipam/service.html +1410 -157
- nautobot/project-static/docs/models/ipam/vlan.html +1410 -157
- nautobot/project-static/docs/models/ipam/vlangroup.html +1410 -157
- nautobot/project-static/docs/models/ipam/vrf.html +1410 -161
- nautobot/project-static/docs/models/tenancy/tenant.html +1412 -159
- nautobot/project-static/docs/models/tenancy/tenantgroup.html +1412 -159
- nautobot/project-static/docs/models/users/objectpermission.html +1462 -171
- nautobot/project-static/docs/models/users/token.html +1410 -157
- nautobot/project-static/docs/models/virtualization/cluster.html +1410 -157
- nautobot/project-static/docs/models/virtualization/clustergroup.html +1410 -157
- nautobot/project-static/docs/models/virtualization/clustertype.html +1410 -157
- nautobot/project-static/docs/models/virtualization/virtualmachine.html +1414 -157
- nautobot/project-static/docs/models/virtualization/vminterface.html +1410 -157
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/plugins/development.html +1916 -646
- nautobot/project-static/docs/plugins/index.html +1389 -190
- nautobot/project-static/docs/plugins/porting-from-netbox.html +1389 -190
- nautobot/project-static/docs/release-notes/index.html +1389 -190
- nautobot/project-static/docs/release-notes/version-1.0.html +1389 -190
- nautobot/project-static/docs/release-notes/version-1.1.html +1389 -190
- nautobot/project-static/docs/release-notes/version-1.2.html +1389 -190
- nautobot/project-static/docs/release-notes/version-1.3.html +1389 -190
- nautobot/project-static/docs/release-notes/version-1.4.html +1389 -190
- nautobot/project-static/docs/release-notes/version-1.5.html +2016 -397
- nautobot/project-static/docs/release-notes/version-2.0.html +1935 -287
- nautobot/project-static/docs/requirements.txt +5 -4
- nautobot/project-static/docs/rest-api/authentication.html +1389 -190
- nautobot/project-static/docs/rest-api/filtering.html +1389 -190
- nautobot/project-static/docs/rest-api/overview.html +2002 -576
- nautobot/project-static/docs/rest-api/ui-related-endpoints.html +4057 -0
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +197 -187
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guides/custom-fields.html +1390 -191
- nautobot/project-static/docs/user-guides/getting-started/creating-devices.html +1392 -193
- nautobot/project-static/docs/user-guides/getting-started/index.html +1388 -189
- nautobot/project-static/docs/user-guides/getting-started/interfaces.html +1388 -189
- nautobot/project-static/docs/user-guides/getting-started/ipam.html +1386 -187
- nautobot/project-static/docs/user-guides/getting-started/platforms.html +1448 -249
- nautobot/project-static/docs/user-guides/getting-started/regions.html +1411 -212
- nautobot/project-static/docs/user-guides/getting-started/search-bar.html +1395 -196
- nautobot/project-static/docs/user-guides/getting-started/tenants.html +1448 -249
- nautobot/project-static/docs/user-guides/getting-started/vlans-and-vlan-groups.html +1448 -249
- nautobot/project-static/docs/user-guides/git-data-source.html +1405 -206
- nautobot/project-static/docs/user-guides/graphql.html +1402 -203
- nautobot/project-static/docs/user-guides/relationships.html +1448 -249
- nautobot/project-static/docs/user-guides/s3-django-storage.html +1448 -249
- nautobot/project-static/js/forms.js +16 -9
- nautobot/project-static/js/theme.js +5 -0
- nautobot/tenancy/api/serializers.py +4 -34
- nautobot/tenancy/api/urls.py +1 -1
- nautobot/tenancy/filters/__init__.py +9 -7
- nautobot/tenancy/filters/mixins.py +3 -2
- nautobot/tenancy/forms.py +3 -36
- nautobot/tenancy/migrations/0001_initial.py +0 -1
- nautobot/tenancy/migrations/0002_auto_slug.py +0 -1
- nautobot/tenancy/migrations/0003_mptt_to_tree_queries.py +0 -1
- nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +0 -1
- nautobot/tenancy/migrations/0005_rename_foreign_keys_and_related_names.py +0 -1
- nautobot/tenancy/migrations/0006_created_datetime.py +0 -1
- nautobot/tenancy/migrations/0007_remove_tenant_tenantgroup_slug.py +20 -0
- nautobot/tenancy/migrations/0008_tagsfield.py +19 -0
- nautobot/tenancy/models.py +0 -30
- nautobot/tenancy/navigation.py +6 -39
- nautobot/tenancy/tables.py +4 -4
- nautobot/tenancy/templates/tenancy/tenant.html +12 -12
- nautobot/tenancy/templates/tenancy/tenant_edit.html +0 -1
- nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
- nautobot/tenancy/tests/test_api.py +1 -12
- nautobot/tenancy/tests/test_filters.py +20 -12
- nautobot/tenancy/tests/test_views.py +11 -29
- nautobot/tenancy/urls.py +10 -10
- nautobot/tenancy/views.py +0 -3
- nautobot/ui/.eslintignore +6 -0
- nautobot/ui/.gitignore +10 -0
- nautobot/ui/.prettierignore +9 -0
- nautobot/ui/.prettierrc +4 -0
- nautobot/ui/README.md +33 -0
- nautobot/ui/app_imports.js.j2 +7 -0
- nautobot/ui/craco.config.js +46 -0
- nautobot/ui/jsconfig-base.json +11 -0
- nautobot/ui/jsconfig.json +5 -0
- nautobot/ui/lib/nautobot-craco-alias-plugin.js +40 -0
- nautobot/ui/package-lock.json +21451 -0
- nautobot/ui/package.json +70 -0
- nautobot/ui/public/index.html +47 -0
- nautobot/ui/public/logo192.png +0 -0
- nautobot/ui/public/logo512.png +0 -0
- nautobot/ui/public/manifest.json +25 -0
- nautobot/ui/public/nautobot_logo.svg +131 -0
- nautobot/ui/public/robots.txt +3 -0
- nautobot/ui/src/App.js +71 -0
- nautobot/ui/src/components/AppFullWidthComponents.js +8 -0
- nautobot/ui/src/components/AppTab.js +40 -0
- nautobot/ui/src/components/Apps.js +60 -0
- nautobot/ui/src/components/HomeChangelogPanel.js +98 -0
- nautobot/ui/src/components/HomePanel.js +58 -0
- nautobot/ui/src/components/JobHistoryTable.js +78 -0
- nautobot/ui/src/components/Layout.js +53 -0
- nautobot/ui/src/components/LoadingWidget.js +25 -0
- nautobot/ui/src/components/Navbar.js +116 -0
- nautobot/ui/src/components/NotificationPopover.js +27 -0
- nautobot/ui/src/components/ObjectListTable.js +209 -0
- nautobot/ui/src/components/ReferenceDataTag.js +35 -0
- nautobot/ui/src/components/RouterButton.js +10 -0
- nautobot/ui/src/components/RouterLink.js +10 -0
- nautobot/ui/src/components/SidebarNav.js +147 -0
- nautobot/ui/src/components/Table.js +48 -0
- nautobot/ui/src/components/TableItem.js +71 -0
- nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +16 -0
- nautobot/ui/src/components/__tests__/AppTab.test.js +21 -0
- nautobot/ui/src/components/__tests__/Apps.test.js +14 -0
- nautobot/ui/src/components/__tests__/Layout.test.js +33 -0
- nautobot/ui/src/components/__tests__/Table.test.js +36 -0
- nautobot/ui/src/components/__tests__/TableItem.test.js +37 -0
- nautobot/ui/src/components/__tests__/paginator.test.js +43 -0
- nautobot/ui/src/components/__tests__/paginator_form.test.js +13 -0
- nautobot/ui/src/components/pagination.js +93 -0
- nautobot/ui/src/components/paginator.js +79 -0
- nautobot/ui/src/components/paginator_form.js +43 -0
- nautobot/ui/src/components/usePagination.js +57 -0
- nautobot/ui/src/constants/apiPath.js +10 -0
- nautobot/ui/src/constants/icons.js +15 -0
- nautobot/ui/src/constants/size.js +15 -0
- nautobot/ui/src/index.js +65 -0
- nautobot/ui/src/reportWebVitals.js +15 -0
- nautobot/ui/src/router.js +77 -0
- nautobot/ui/src/utils/api.js +131 -0
- nautobot/ui/src/utils/app-import.js +15 -0
- nautobot/ui/src/utils/color.js +15 -0
- nautobot/ui/src/utils/date.js +14 -0
- nautobot/ui/src/utils/index.js +15 -0
- nautobot/ui/src/utils/navigation.js +32 -0
- nautobot/ui/src/utils/session.js +64 -0
- nautobot/ui/src/utils/store.js +242 -0
- nautobot/ui/src/utils/string.js +6 -0
- nautobot/ui/src/utils/url.js +4 -0
- nautobot/ui/src/views/Home.js +138 -0
- nautobot/ui/src/views/InstalledApps.js +80 -0
- nautobot/ui/src/views/Login.js +48 -0
- nautobot/ui/src/views/Logout.js +20 -0
- nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +11 -0
- nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +107 -0
- nautobot/ui/src/views/__tests__/Login.test.js +15 -0
- nautobot/ui/src/views/generic/GenericView.js +142 -0
- nautobot/ui/src/views/generic/ObjectCreate.js +96 -0
- nautobot/ui/src/views/generic/ObjectList.js +127 -0
- nautobot/ui/src/views/generic/ObjectRetrieve.js +551 -0
- nautobot/users/admin.py +1 -1
- nautobot/users/api/serializers.py +51 -61
- nautobot/users/api/urls.py +1 -1
- nautobot/users/api/views.py +53 -2
- nautobot/users/migrations/0001_initial.py +0 -1
- nautobot/users/migrations/0002_token_ordering_by_created.py +0 -1
- nautobot/users/migrations/0003_alter_user_options.py +0 -1
- nautobot/users/migrations/0004_alter_user_managers.py +0 -1
- nautobot/users/tests/test_api.py +109 -28
- nautobot/users/tests/test_filters.py +0 -4
- nautobot/users/tests/test_models.py +0 -1
- nautobot/users/views.py +0 -7
- nautobot/virtualization/api/serializers.py +18 -132
- nautobot/virtualization/api/urls.py +1 -1
- nautobot/virtualization/api/views.py +1 -22
- nautobot/virtualization/choices.py +0 -2
- nautobot/virtualization/filters.py +12 -7
- nautobot/virtualization/forms.py +21 -117
- nautobot/virtualization/migrations/0001_initial.py +0 -1
- nautobot/virtualization/migrations/0002_virtualmachine_local_context_schema.py +0 -1
- nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +0 -1
- nautobot/virtualization/migrations/0004_auto_slug.py +0 -1
- nautobot/virtualization/migrations/0005_add_natural_indexing.py +0 -1
- nautobot/virtualization/migrations/0006_vminterface_status.py +0 -1
- nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +0 -1
- nautobot/virtualization/migrations/0008_vminterface_parent.py +0 -1
- nautobot/virtualization/migrations/0009_cluster_location.py +0 -1
- nautobot/virtualization/migrations/0010_vminterface_mac_address_data_migration.py +0 -1
- nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +0 -1
- nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -2
- nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +18 -12
- nautobot/virtualization/migrations/0014_rename_virtualmachine_roles.py +0 -1
- nautobot/virtualization/migrations/0015_rename_foreignkey_fields.py +1 -2
- nautobot/virtualization/migrations/0016_remove_site_foreign_key_from_cluster_class.py +0 -1
- nautobot/virtualization/migrations/0017_created_datetime.py +0 -1
- nautobot/virtualization/migrations/0018_related_name_changes.py +1 -2
- nautobot/virtualization/migrations/0019_vminterface_ip_addresses_m2m.py +0 -1
- nautobot/virtualization/migrations/0020_remove_clustergroup_clustertype_slug.py +20 -0
- nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +39 -0
- nautobot/virtualization/migrations/0022_vminterface_timestamps_data_migration.py +17 -0
- nautobot/virtualization/migrations/0023_ipam__namespaces.py +25 -0
- nautobot/virtualization/migrations/0024_fixup_null_statuses.py +25 -0
- nautobot/virtualization/migrations/0025_status_nonnullable.py +29 -0
- nautobot/virtualization/models.py +39 -131
- nautobot/virtualization/navigation.py +18 -99
- nautobot/virtualization/tables.py +4 -4
- nautobot/virtualization/templates/virtualization/virtualmachine.html +13 -2
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +6 -0
- nautobot/virtualization/tests/test_api.py +42 -52
- nautobot/virtualization/tests/test_filters.py +98 -75
- nautobot/virtualization/tests/test_models.py +36 -13
- nautobot/virtualization/tests/test_views.py +68 -73
- nautobot/virtualization/urls.py +10 -10
- nautobot/virtualization/views.py +8 -14
- {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/METADATA +15 -22
- {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/RECORD +987 -834
- {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/WHEEL +1 -1
- nautobot/circuits/api/nested_serializers.py +0 -69
- nautobot/core/templates/plugin_template/navigation.py-tpl +0 -22
- nautobot/dcim/api/nested_serializers.py +0 -356
- nautobot/dcim/templates/dcim/device_import.html +0 -5
- nautobot/dcim/templates/dcim/device_import_child.html +0 -5
- nautobot/dcim/templates/dcim/inc/device_import_header.html +0 -4
- nautobot/extras/api/nested_serializers.py +0 -353
- nautobot/extras/migrations/0064_configcontext_data_migrations.py +0 -42
- nautobot/extras/migrations/0071_job__unique_name_data_migration.py +0 -47
- nautobot/extras/reports.py +0 -60
- nautobot/extras/scripts.py +0 -72
- nautobot/extras/tests/example_jobs/script_variables.py +0 -67
- nautobot/extras/tests/example_jobs/test_duplicate_name2.py +0 -5
- nautobot/extras/tests/example_jobs/test_fail.py +0 -16
- nautobot/extras/tests/example_jobs/test_file_upload_pass.py +0 -20
- nautobot/extras/tests/example_jobs/test_ipaddress_vars.py +0 -52
- nautobot/extras/tests/example_jobs/test_job_button_receiver.py +0 -21
- nautobot/extras/tests/example_jobs/test_job_hook_receiver.py +0 -20
- nautobot/extras/tests/example_jobs/test_location_with_custom_field.py +0 -35
- nautobot/extras/tests/example_jobs/test_log_redaction.py +0 -14
- nautobot/extras/tests/example_jobs/test_modify_db.py +0 -19
- nautobot/extras/tests/example_jobs/test_object_var_optional.py +0 -14
- nautobot/extras/tests/example_jobs/test_object_var_required.py +0 -14
- nautobot/extras/tests/example_jobs/test_object_vars.py +0 -29
- nautobot/extras/tests/example_jobs/test_pass.py +0 -19
- nautobot/extras/tests/example_jobs/test_read_only_fail.py +0 -24
- nautobot/extras/tests/example_jobs/test_read_only_no_commit_field.py +0 -10
- nautobot/extras/tests/example_jobs/test_read_only_pass.py +0 -22
- nautobot/ipam/api/nested_serializers.py +0 -143
- nautobot/project-static/docs/assets/javascripts/bundle.5a2dcb6a.min.js +0 -29
- nautobot/project-static/docs/assets/javascripts/bundle.5a2dcb6a.min.js.map +0 -8
- nautobot/project-static/docs/assets/javascripts/extra/bundle.5f09fbc3.min.js +0 -18
- nautobot/project-static/docs/assets/javascripts/extra/bundle.5f09fbc3.min.js.map +0 -8
- nautobot/project-static/docs/assets/stylesheets/extra.0d2c79a8.min.css +0 -1
- nautobot/project-static/docs/assets/stylesheets/extra.0d2c79a8.min.css.map +0 -1
- nautobot/project-static/docs/assets/stylesheets/main.975780f9.min.css +0 -1
- nautobot/project-static/docs/assets/stylesheets/main.975780f9.min.css.map +0 -1
- nautobot/project-static/docs/assets/stylesheets/palette.2505c338.min.css +0 -1
- nautobot/project-static/docs/assets/stylesheets/palette.2505c338.min.css.map +0 -1
- nautobot/tenancy/api/nested_serializers.py +0 -31
- nautobot/users/api/nested_serializers.py +0 -67
- nautobot/virtualization/api/nested_serializers.py +0 -65
- /nautobot/extras/{tests/example_jobs → test_jobs}/__init__.py +0 -0
- /nautobot/{dcim/models/sites.py → ipam/management/__init__.py} +0 -0
- {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/entry_points.txt +0 -0
nautobot/core/models/generics.py
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
import sys
|
|
3
|
-
|
|
4
|
-
from taggit.managers import TaggableManager, _TaggableManager
|
|
5
2
|
|
|
6
3
|
from nautobot.extras.models.change_logging import ChangeLoggedModel
|
|
7
4
|
from nautobot.extras.models.customfields import CustomFieldModel
|
|
8
5
|
from nautobot.extras.models.mixins import DynamicGroupMixin, NotesMixin
|
|
9
6
|
from nautobot.extras.models.relationships import RelationshipModel
|
|
10
|
-
from nautobot.extras.models.tags import TaggedItem
|
|
11
7
|
from nautobot.core.models import BaseModel
|
|
8
|
+
from nautobot.core.models.fields import TagsField
|
|
12
9
|
|
|
13
10
|
|
|
14
11
|
logger = logging.getLogger(__name__)
|
|
@@ -31,47 +28,6 @@ class OrganizationalModel(
|
|
|
31
28
|
abstract = True
|
|
32
29
|
|
|
33
30
|
|
|
34
|
-
# 2.0 TODO: remove this, force migration to the newer django-taggit API.
|
|
35
|
-
class _NautobotTaggableManager(_TaggableManager):
|
|
36
|
-
"""Extend _TaggableManager to work around a breaking API change between django-taggit 1.x and 2.x.
|
|
37
|
-
|
|
38
|
-
This is a bit confusing, as there's also a related `TaggableManager` class as well.
|
|
39
|
-
`TaggableManager` is the *model field* (subclass of `models.fields.related.RelatedField`),
|
|
40
|
-
while `_TaggableManager` is the *associated manager* (subclass of `models.Manager`).
|
|
41
|
-
|
|
42
|
-
For `TaggableManager`, we chose to monkey-patch rather than subclass to override its `formfield` method;
|
|
43
|
-
replacing it with a subclass would create database migrations for every PrimaryModel with a `tags` field.
|
|
44
|
-
In 2.0 we'll want to bite the bullet and make the cutover (#1633).
|
|
45
|
-
|
|
46
|
-
For `_TaggableManager`, we can subclass rather than monkey-patching because replacing it *doesn't* require
|
|
47
|
-
a database migration, and this is cleaner than a monkey-patch.
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
def set(self, *tags, through_defaults=None, **kwargs):
|
|
51
|
-
"""
|
|
52
|
-
Patch model.tags.set() to be backwards-compatible with django-taggit 1.x and forward-compatible with later.
|
|
53
|
-
|
|
54
|
-
Both of these approaches are supported:
|
|
55
|
-
|
|
56
|
-
- tags.set("tag 1", "tag 2") # django-taggit 1.x
|
|
57
|
-
- tags.set(["tag 1", "tag 2"]) # django-taggit 2.x and later
|
|
58
|
-
"""
|
|
59
|
-
if len(tags) == 1 and not isinstance(tags[0], (self.through.tag_model(), str)):
|
|
60
|
-
# taggit 2.x+ style, i.e. `set([tag, tag, tag])`
|
|
61
|
-
tags = tags[0]
|
|
62
|
-
else:
|
|
63
|
-
# taggit 1.x style, i.e. `set(tag, tag, tag)`
|
|
64
|
-
# Note: logger.warning() only supports a `stacklevel` parameter in Python 3.8 and later
|
|
65
|
-
tags_unpacked = ", ".join([repr(tag) for tag in tags])
|
|
66
|
-
tags_list = list(tags)
|
|
67
|
-
message = "Deprecated `tags.set(%s)` was called, please change to `tags.set(%s)` instead"
|
|
68
|
-
if sys.version_info >= (3, 8):
|
|
69
|
-
logger.warning(message, tags_unpacked, tags_list, stacklevel=2)
|
|
70
|
-
else: # Python 3.7
|
|
71
|
-
logger.warning(message, tags_unpacked, tags_list)
|
|
72
|
-
return super().set(tags, through_defaults=through_defaults, **kwargs)
|
|
73
|
-
|
|
74
|
-
|
|
75
31
|
class PrimaryModel(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, DynamicGroupMixin, NotesMixin):
|
|
76
32
|
"""
|
|
77
33
|
Base abstract model for all primary models.
|
|
@@ -82,7 +38,7 @@ class PrimaryModel(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipM
|
|
|
82
38
|
tangible or logical resources on the network, or within the organization.
|
|
83
39
|
"""
|
|
84
40
|
|
|
85
|
-
tags =
|
|
41
|
+
tags = TagsField()
|
|
86
42
|
|
|
87
43
|
class Meta:
|
|
88
44
|
abstract = True
|
nautobot/core/models/managers.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from django.db.models import Manager
|
|
2
|
+
from taggit.managers import _TaggableManager
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
class BaseManager(Manager):
|
|
@@ -43,3 +44,7 @@ class BaseManager(Manager):
|
|
|
43
44
|
raise self.model.DoesNotExist() from exc
|
|
44
45
|
|
|
45
46
|
return self.get(**kwargs)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TagsManager(_TaggableManager, BaseManager):
|
|
50
|
+
"""Manager class for model 'tags' fields."""
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
from django.contrib.contenttypes.models import ContentType
|
|
2
2
|
from django.db import models
|
|
3
3
|
from django.db.models import Q
|
|
4
|
-
from django.urls import reverse
|
|
5
4
|
|
|
6
5
|
from nautobot.core.choices import ColorChoices
|
|
7
6
|
from nautobot.core.models import BaseManager, BaseModel
|
|
8
|
-
from nautobot.core.models.fields import
|
|
7
|
+
from nautobot.core.models.fields import ColorField
|
|
9
8
|
from nautobot.core.models.querysets import RestrictedQuerySet
|
|
10
9
|
|
|
11
10
|
# Importing CustomFieldModel, ChangeLoggedModel, RelationshipModel from nautobot.extras.models
|
|
@@ -58,8 +57,6 @@ class NameColorContentTypesModel(
|
|
|
58
57
|
help_text="The content type(s) to which this model applies.",
|
|
59
58
|
)
|
|
60
59
|
name = models.CharField(max_length=100, unique=True)
|
|
61
|
-
# TODO (timizuo): Remove slug
|
|
62
|
-
slug = AutoSlugField(populate_from="name", max_length=100)
|
|
63
60
|
color = ColorField(default=ColorChoices.COLOR_GREY)
|
|
64
61
|
description = models.CharField(
|
|
65
62
|
max_length=200,
|
|
@@ -68,7 +65,6 @@ class NameColorContentTypesModel(
|
|
|
68
65
|
|
|
69
66
|
objects = BaseManager.from_queryset(ContentTypeRelatedQuerySet)()
|
|
70
67
|
|
|
71
|
-
csv_headers = ["name", "slug", "color", "content_types", "description"]
|
|
72
68
|
clone_fields = ["color", "content_types"]
|
|
73
69
|
|
|
74
70
|
class Meta:
|
|
@@ -78,19 +74,5 @@ class NameColorContentTypesModel(
|
|
|
78
74
|
def __str__(self):
|
|
79
75
|
return self.name
|
|
80
76
|
|
|
81
|
-
def get_absolute_url(self):
|
|
82
|
-
ct = f"{self._meta.app_label}:{self._meta.model_name}"
|
|
83
|
-
# TODO(timizuo): Replace self.slug with natural key or pk
|
|
84
|
-
return reverse(ct, args=[self.slug])
|
|
85
|
-
|
|
86
77
|
def get_content_types(self):
|
|
87
78
|
return ",".join(f"{ct.app_label}.{ct.model}" for ct in self.content_types.all())
|
|
88
|
-
|
|
89
|
-
def to_csv(self):
|
|
90
|
-
return (
|
|
91
|
-
self.name,
|
|
92
|
-
self.slug,
|
|
93
|
-
self.color,
|
|
94
|
-
self.get_content_types(),
|
|
95
|
-
self.description,
|
|
96
|
-
)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from django.core.cache import cache
|
|
2
|
+
|
|
1
3
|
from tree_queries.models import TreeNode
|
|
2
4
|
from tree_queries.query import TreeManager as TreeManager_
|
|
3
5
|
from tree_queries.query import TreeQuerySet as TreeQuerySet_
|
|
@@ -41,16 +43,24 @@ class TreeModel(TreeNode):
|
|
|
41
43
|
|
|
42
44
|
@property
|
|
43
45
|
def display(self):
|
|
44
|
-
"""
|
|
46
|
+
"""
|
|
47
|
+
By default, TreeModels display their full ancestry for clarity.
|
|
48
|
+
|
|
49
|
+
As this is an expensive thing to calculate, we cache it for a few seconds in the case of repeated lookups.
|
|
50
|
+
"""
|
|
45
51
|
if not hasattr(self, "name"):
|
|
46
52
|
raise NotImplementedError("default TreeModel.display implementation requires a `name` attribute!")
|
|
47
|
-
|
|
53
|
+
cache_key = f"{self.__class__.__name__}.{self.id}.display"
|
|
54
|
+
display_str = cache.get(cache_key, "")
|
|
55
|
+
if display_str:
|
|
56
|
+
return display_str
|
|
48
57
|
try:
|
|
49
|
-
|
|
50
|
-
display_str
|
|
58
|
+
if self.parent is not None:
|
|
59
|
+
display_str = self.parent.display + " → "
|
|
51
60
|
except self.DoesNotExist:
|
|
52
61
|
# Expected to occur at times during bulk-delete operations
|
|
53
62
|
pass
|
|
54
63
|
finally:
|
|
55
64
|
display_str += self.name
|
|
65
|
+
cache.set(cache_key, display_str, 5)
|
|
56
66
|
return display_str # pylint: disable=lost-exception
|
nautobot/core/models/utils.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
from itertools import count, groupby
|
|
2
1
|
import json
|
|
2
|
+
|
|
3
|
+
from itertools import count, groupby
|
|
3
4
|
from urllib.parse import quote_plus, unquote_plus
|
|
4
5
|
|
|
5
6
|
from django.apps import apps
|
|
6
7
|
from django.core.exceptions import FieldDoesNotExist
|
|
7
8
|
from django.core.serializers import serialize
|
|
8
9
|
from django.utils.tree import Node
|
|
9
|
-
from taggit.managers import _TaggableManager
|
|
10
10
|
|
|
11
11
|
from nautobot.core.models.constants import NATURAL_KEY_SLUG_SEPARATOR
|
|
12
12
|
|
|
@@ -35,10 +35,9 @@ def is_taggable(obj):
|
|
|
35
35
|
"""
|
|
36
36
|
Return True if the instance can have Tags assigned to it; False otherwise.
|
|
37
37
|
"""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return False
|
|
38
|
+
from nautobot.core.models.managers import TagsManager
|
|
39
|
+
|
|
40
|
+
return hasattr(obj, "tags") and isinstance(obj.tags, TagsManager)
|
|
42
41
|
|
|
43
42
|
|
|
44
43
|
def pretty_print_query(query):
|
|
@@ -54,11 +53,11 @@ def pretty_print_query(query):
|
|
|
54
53
|
Example:
|
|
55
54
|
>>> print(pretty_print_query(Q))
|
|
56
55
|
(
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
location__name='Campus-01' OR location__name='Campus-02' OR (
|
|
57
|
+
location__name='Room-01' AND status__name='Active'
|
|
59
58
|
) OR (
|
|
60
|
-
|
|
61
|
-
NOT (
|
|
59
|
+
location__name='Building-01' AND (
|
|
60
|
+
NOT (location__name='Building-01' AND status__name='Decommissioning')
|
|
62
61
|
)
|
|
63
62
|
)
|
|
64
63
|
)
|
|
@@ -2,7 +2,7 @@ import re
|
|
|
2
2
|
|
|
3
3
|
from django.conf import settings
|
|
4
4
|
from django.core.exceptions import ValidationError
|
|
5
|
-
from django.core.validators import BaseValidator, URLValidator, _lazy_re_compile
|
|
5
|
+
from django.core.validators import BaseValidator, RegexValidator, URLValidator, _lazy_re_compile
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class EnhancedURLValidator(URLValidator):
|
|
@@ -41,12 +41,21 @@ class ExclusionValidator(BaseValidator):
|
|
|
41
41
|
return a in b
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
class ValidRegexValidator(RegexValidator):
|
|
45
45
|
"""
|
|
46
|
-
Checks that the value is a valid regular expression.
|
|
47
|
-
|
|
46
|
+
Checks that the value is a valid regular expression.
|
|
47
|
+
|
|
48
|
+
Don't confuse this with `RegexValidator`, which *uses* a regex to validate a value.
|
|
48
49
|
"""
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
|
|
51
|
+
message = "%(value)r is not a valid regular expression."
|
|
52
|
+
code = "regex_invalid"
|
|
53
|
+
|
|
54
|
+
def __call__(self, value):
|
|
55
|
+
try:
|
|
56
|
+
return re.compile(value)
|
|
57
|
+
except (re.error, TypeError):
|
|
58
|
+
raise ValidationError(self.message, code=self.code, params={"value": value})
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
validate_regex = ValidRegexValidator()
|
nautobot/core/releases.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from django.core.cache import cache
|
|
4
4
|
|
|
5
5
|
from nautobot.core.utils.config import get_settings_or_config
|
|
6
6
|
from nautobot.core.tasks import get_releases
|
|
@@ -18,15 +18,13 @@ def get_latest_release(pre_releases=False):
|
|
|
18
18
|
"""
|
|
19
19
|
if get_settings_or_config("RELEASE_CHECK_URL"):
|
|
20
20
|
logger.debug("Checking for most recent release")
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
logger.info("Initiating background task to retrieve updated releases list")
|
|
29
|
-
get_releases.delay(pre_releases=pre_releases)
|
|
21
|
+
latest_release = cache.get("latest_release")
|
|
22
|
+
if latest_release is not None:
|
|
23
|
+
logger.debug(f"Found cached release: {latest_release}")
|
|
24
|
+
return latest_release
|
|
25
|
+
# Get the releases in the background worker, it will fill the cache
|
|
26
|
+
logger.info("Initiating background task to retrieve updated releases list")
|
|
27
|
+
get_releases.delay(pre_releases=pre_releases)
|
|
30
28
|
|
|
31
29
|
else:
|
|
32
30
|
logger.debug("Skipping release check; RELEASE_CHECK_URL not defined")
|
nautobot/core/settings.py
CHANGED
|
@@ -13,7 +13,7 @@ from nautobot.core.settings_funcs import is_truthy, parse_redis_connection, Cons
|
|
|
13
13
|
# Environment setup
|
|
14
14
|
#
|
|
15
15
|
|
|
16
|
-
# This is used for display in the UI.
|
|
16
|
+
# This is used for display in the UI. There are also VERSION_MAJOR and VERSION_MINOR derived from this later.
|
|
17
17
|
VERSION = __version__
|
|
18
18
|
|
|
19
19
|
# Hostname of the system. This is displayed in the web UI footers along with the
|
|
@@ -59,15 +59,13 @@ ALLOWED_URL_SCHEMES = (
|
|
|
59
59
|
# Base directory wherein all created files (jobs, git repositories, file uploads, static files) will be stored)
|
|
60
60
|
NAUTOBOT_ROOT = os.getenv("NAUTOBOT_ROOT", os.path.expanduser("~/.nautobot"))
|
|
61
61
|
|
|
62
|
+
# The directory where the Nautobot UI packaging is stored.
|
|
63
|
+
NAUTOBOT_UI_DIR = os.path.join(NAUTOBOT_ROOT, "ui")
|
|
64
|
+
|
|
62
65
|
# Disable linking of Config Context objects via Dynamic Groups by default. This could cause performance impacts
|
|
63
66
|
# when a large number of dynamic groups are present
|
|
64
67
|
CONFIG_CONTEXT_DYNAMIC_GROUPS_ENABLED = is_truthy(os.getenv("NAUTOBOT_CONFIG_CONTEXT_DYNAMIC_GROUPS_ENABLED", "False"))
|
|
65
68
|
|
|
66
|
-
# By default, Nautobot will permit users to create duplicate prefixes and IP addresses in the global
|
|
67
|
-
# table (that is, those which are not assigned to any VRF). This behavior can be disabled by setting
|
|
68
|
-
# ENFORCE_GLOBAL_UNIQUE to True.
|
|
69
|
-
ENFORCE_GLOBAL_UNIQUE = is_truthy(os.getenv("NAUTOBOT_ENFORCE_GLOBAL_UNIQUE", "False"))
|
|
70
|
-
|
|
71
69
|
# Exclude potentially sensitive models from wildcard view exemption. These may still be exempted
|
|
72
70
|
# by specifying the model individually in the EXEMPT_VIEW_PERMISSIONS configuration parameter.
|
|
73
71
|
EXEMPT_EXCLUDE_MODELS = (
|
|
@@ -115,7 +113,7 @@ SOCIAL_AUTH_BACKEND_PREFIX = "social_core.backends"
|
|
|
115
113
|
SANITIZER_PATTERNS = [
|
|
116
114
|
# General removal of username-like and password-like tokens
|
|
117
115
|
(re.compile(r"(https?://)?\S+\s*@", re.IGNORECASE), r"\1{replacement}@"),
|
|
118
|
-
(re.compile(r"(username|password|passwd|pwd)(
|
|
116
|
+
(re.compile(r"(username|password|passwd|pwd)((?:\s+is.?|:)?\s+)\S+", re.IGNORECASE), r"\1\2{replacement}"),
|
|
119
117
|
]
|
|
120
118
|
|
|
121
119
|
# Storage
|
|
@@ -166,11 +164,11 @@ STRICT_FILTERING = is_truthy(os.getenv("NAUTOBOT_STRICT_FILTERING", "True"))
|
|
|
166
164
|
#
|
|
167
165
|
|
|
168
166
|
REST_FRAMEWORK_VERSION = VERSION.rsplit(".", 1)[0] # Use major.minor as API version
|
|
169
|
-
|
|
167
|
+
VERSION_MAJOR, VERSION_MINOR = [int(v) for v in REST_FRAMEWORK_VERSION.split(".")]
|
|
170
168
|
# We support all major.minor API versions from 2.0 to the present latest version.
|
|
171
169
|
# Similar logic exists in tasks.py, please keep them in sync!
|
|
172
|
-
assert
|
|
173
|
-
REST_FRAMEWORK_ALLOWED_VERSIONS = [f"{
|
|
170
|
+
assert VERSION_MAJOR == 2, f"REST_FRAMEWORK_ALLOWED_VERSIONS needs to be updated to handle version {VERSION_MAJOR}"
|
|
171
|
+
REST_FRAMEWORK_ALLOWED_VERSIONS = [f"{VERSION_MAJOR}.{minor}" for minor in range(0, VERSION_MINOR + 1)]
|
|
174
172
|
|
|
175
173
|
REST_FRAMEWORK = {
|
|
176
174
|
"ALLOWED_VERSIONS": REST_FRAMEWORK_ALLOWED_VERSIONS,
|
|
@@ -178,20 +176,27 @@ REST_FRAMEWORK = {
|
|
|
178
176
|
"rest_framework.authentication.SessionAuthentication",
|
|
179
177
|
"nautobot.core.api.authentication.TokenAuthentication",
|
|
180
178
|
),
|
|
181
|
-
"DEFAULT_FILTER_BACKENDS": (
|
|
179
|
+
"DEFAULT_FILTER_BACKENDS": (
|
|
180
|
+
"nautobot.core.api.filter_backends.NautobotFilterBackend",
|
|
181
|
+
"rest_framework.filters.OrderingFilter",
|
|
182
|
+
),
|
|
182
183
|
"DEFAULT_METADATA_CLASS": "nautobot.core.api.metadata.NautobotMetadata",
|
|
183
184
|
"DEFAULT_PAGINATION_CLASS": "nautobot.core.api.pagination.OptionalLimitOffsetPagination",
|
|
184
185
|
"DEFAULT_PERMISSION_CLASSES": ("nautobot.core.api.authentication.TokenPermissions",),
|
|
185
186
|
"DEFAULT_RENDERER_CLASSES": (
|
|
186
|
-
"
|
|
187
|
+
"nautobot.core.api.renderers.NautobotJSONRenderer",
|
|
187
188
|
"nautobot.core.api.renderers.FormlessBrowsableAPIRenderer",
|
|
189
|
+
"nautobot.core.api.renderers.NautobotCSVRenderer",
|
|
190
|
+
),
|
|
191
|
+
"DEFAULT_PARSER_CLASSES": (
|
|
192
|
+
"rest_framework.parsers.JSONParser",
|
|
193
|
+
"nautobot.core.api.parsers.NautobotCSVParser",
|
|
188
194
|
),
|
|
189
|
-
"DEFAULT_PARSER_CLASSES": ("rest_framework.parsers.JSONParser",),
|
|
190
195
|
"DEFAULT_SCHEMA_CLASS": "nautobot.core.api.schema.NautobotAutoSchema",
|
|
191
|
-
# Version to use if the client doesn't request otherwise.
|
|
192
|
-
|
|
193
|
-
"DEFAULT_VERSION": "2.0",
|
|
196
|
+
# Version to use if the client doesn't request otherwise. Default to current (i.e. latest)
|
|
197
|
+
"DEFAULT_VERSION": REST_FRAMEWORK_VERSION,
|
|
194
198
|
"DEFAULT_VERSIONING_CLASS": "nautobot.core.api.versioning.NautobotAPIVersioning",
|
|
199
|
+
"ORDERING_PARAM": "sort", # This is not meant to be changed by users, but is used internally by the API
|
|
195
200
|
"PAGE_SIZE": None,
|
|
196
201
|
"SCHEMA_COERCE_METHOD_NAMES": {
|
|
197
202
|
# Default mappings
|
|
@@ -271,7 +276,10 @@ DATABASES = {
|
|
|
271
276
|
"HOST": os.getenv("NAUTOBOT_DB_HOST", "localhost"),
|
|
272
277
|
"PORT": os.getenv("NAUTOBOT_DB_PORT", ""),
|
|
273
278
|
"CONN_MAX_AGE": int(os.getenv("NAUTOBOT_DB_TIMEOUT", "300")),
|
|
274
|
-
"ENGINE": os.getenv(
|
|
279
|
+
"ENGINE": os.getenv(
|
|
280
|
+
"NAUTOBOT_DB_ENGINE",
|
|
281
|
+
"django_prometheus.db.backends.postgresql" if METRICS_ENABLED else "django.db.backends.postgresql",
|
|
282
|
+
),
|
|
275
283
|
}
|
|
276
284
|
}
|
|
277
285
|
|
|
@@ -292,13 +300,18 @@ DEBUG = is_truthy(os.getenv("NAUTOBOT_DEBUG", "False"))
|
|
|
292
300
|
INTERNAL_IPS = ("127.0.0.1", "::1")
|
|
293
301
|
FORCE_SCRIPT_NAME = None
|
|
294
302
|
|
|
295
|
-
TESTING =
|
|
303
|
+
TESTING = "test" in sys.argv
|
|
296
304
|
|
|
297
305
|
LOG_LEVEL = "DEBUG" if DEBUG else "INFO"
|
|
298
306
|
|
|
299
307
|
if TESTING:
|
|
300
|
-
#
|
|
301
|
-
LOGGING = {
|
|
308
|
+
# Log to null handler instead of stderr during testing
|
|
309
|
+
LOGGING = {
|
|
310
|
+
"version": 1,
|
|
311
|
+
"disable_existing_loggers": False,
|
|
312
|
+
"handlers": {"console": {"level": "INFO", "class": "logging.NullHandler"}},
|
|
313
|
+
"loggers": {"nautobot": {"handlers": ["console"], "level": "INFO"}},
|
|
314
|
+
}
|
|
302
315
|
else:
|
|
303
316
|
LOGGING = {
|
|
304
317
|
"version": 1,
|
|
@@ -355,7 +368,6 @@ INSTALLED_APPS = [
|
|
|
355
368
|
"django.contrib.messages",
|
|
356
369
|
"django.contrib.staticfiles",
|
|
357
370
|
"django.contrib.humanize",
|
|
358
|
-
"cacheops", # v2 TODO(jathan); Remove cacheops.
|
|
359
371
|
"corsheaders",
|
|
360
372
|
"django_filters",
|
|
361
373
|
"django_jinja",
|
|
@@ -470,7 +482,10 @@ X_FRAME_OPTIONS = "DENY"
|
|
|
470
482
|
# Static files (CSS, JavaScript, Images)
|
|
471
483
|
STATIC_ROOT = os.path.join(NAUTOBOT_ROOT, "static")
|
|
472
484
|
STATIC_URL = "static/"
|
|
473
|
-
STATICFILES_DIRS = (
|
|
485
|
+
STATICFILES_DIRS = (
|
|
486
|
+
os.path.join(BASE_DIR, "project-static"),
|
|
487
|
+
os.path.join(NAUTOBOT_UI_DIR, "build", "static"),
|
|
488
|
+
)
|
|
474
489
|
|
|
475
490
|
# Media
|
|
476
491
|
MEDIA_URL = "media/"
|
|
@@ -538,11 +553,6 @@ CONSTANCE_CONFIG = {
|
|
|
538
553
|
help_text="Number of days to retain object changelog history.\nSet this to 0 to retain changes indefinitely.",
|
|
539
554
|
field_type=int,
|
|
540
555
|
),
|
|
541
|
-
"DISABLE_PREFIX_LIST_HIERARCHY": ConstanceConfigItem(
|
|
542
|
-
default=False,
|
|
543
|
-
help_text="Disable rendering parent/child relationships in the IPAM Prefix list view and instead show a flat list.",
|
|
544
|
-
field_type=bool,
|
|
545
|
-
),
|
|
546
556
|
"HIDE_RESTRICTED_UI": ConstanceConfigItem(
|
|
547
557
|
default=False,
|
|
548
558
|
help_text="If set to True, users with limited permissions will not be shown menu items and home-page elements that "
|
|
@@ -602,7 +612,7 @@ CONSTANCE_CONFIG_FIELDSETS = {
|
|
|
602
612
|
"Pagination": ["PAGINATE_COUNT", "MAX_PAGE_SIZE", "PER_PAGE_DEFAULTS"],
|
|
603
613
|
"Rack Elevation Rendering": ["RACK_ELEVATION_DEFAULT_UNIT_HEIGHT", "RACK_ELEVATION_DEFAULT_UNIT_WIDTH"],
|
|
604
614
|
"Release Checking": ["RELEASE_CHECK_URL", "RELEASE_CHECK_TIMEOUT"],
|
|
605
|
-
"User Interface": ["
|
|
615
|
+
"User Interface": ["HIDE_RESTRICTED_UI"],
|
|
606
616
|
}
|
|
607
617
|
|
|
608
618
|
#
|
|
@@ -639,31 +649,14 @@ GRAPHQL_COMPUTED_FIELD_PREFIX = "cpf"
|
|
|
639
649
|
# Caching
|
|
640
650
|
#
|
|
641
651
|
|
|
642
|
-
# v2 TODO(jathan): Remove all cacheops settings.
|
|
643
|
-
# The django-cacheops plugin is used to cache querysets. The built-in Django
|
|
644
|
-
# caching is not used.
|
|
645
|
-
CACHEOPS = {
|
|
646
|
-
"auth.user": {"ops": "get", "timeout": 60 * 15},
|
|
647
|
-
"auth.*": {"ops": ("fetch", "get")},
|
|
648
|
-
"auth.permission": {"ops": "all"},
|
|
649
|
-
"circuits.*": {"ops": "all"},
|
|
650
|
-
"dcim.*": {"ops": "all"},
|
|
651
|
-
"ipam.*": {"ops": "all"},
|
|
652
|
-
"extras.*": {"ops": "all"},
|
|
653
|
-
"users.*": {"ops": "all"},
|
|
654
|
-
"tenancy.*": {"ops": "all"},
|
|
655
|
-
"virtualization.*": {"ops": "all"},
|
|
656
|
-
}
|
|
657
|
-
CACHEOPS_DEGRADE_ON_FAILURE = True
|
|
658
|
-
CACHEOPS_ENABLED = is_truthy(os.getenv("NAUTOBOT_CACHEOPS_ENABLED", "False"))
|
|
659
|
-
CACHEOPS_REDIS = os.getenv("NAUTOBOT_CACHEOPS_REDIS", parse_redis_connection(redis_database=1))
|
|
660
|
-
CACHEOPS_DEFAULTS = {"timeout": int(os.getenv("NAUTOBOT_CACHEOPS_TIMEOUT", "900"))}
|
|
661
|
-
|
|
662
652
|
# The django-redis cache is used to establish concurrent locks using Redis.
|
|
663
653
|
CACHES = {
|
|
664
654
|
"default": {
|
|
665
|
-
"BACKEND":
|
|
666
|
-
|
|
655
|
+
"BACKEND": os.getenv(
|
|
656
|
+
"NAUTOBOT_CACHES_BACKEND",
|
|
657
|
+
"django_prometheus.cache.backends.redis.RedisCache" if METRICS_ENABLED else "django_redis.cache.RedisCache",
|
|
658
|
+
),
|
|
659
|
+
"LOCATION": parse_redis_connection(redis_database=1),
|
|
667
660
|
"TIMEOUT": 300,
|
|
668
661
|
"OPTIONS": {
|
|
669
662
|
"CLIENT_CLASS": "django_redis.client.DefaultClient",
|
|
@@ -688,15 +681,18 @@ CELERY_RESULT_EXTENDED = True
|
|
|
688
681
|
# A value of None or 0 means results will never expire (depending on backend specifications).
|
|
689
682
|
CELERY_RESULT_EXPIRES = None
|
|
690
683
|
|
|
691
|
-
# If set to True, result messages will be persistent. This means the messages won’t be lost after a broker restart.
|
|
692
|
-
CELERY_RESULT_PERSISTENT = True
|
|
693
|
-
|
|
694
684
|
# Instruct celery to report the started status of a job, instead of just `pending`, `finished`, or `failed`
|
|
695
685
|
CELERY_TASK_TRACK_STARTED = True
|
|
696
686
|
|
|
697
687
|
# If enabled, a `task-sent` event will be sent for every task so tasks can be tracked before they’re consumed by a worker.
|
|
698
688
|
CELERY_TASK_SEND_SENT_EVENT = True
|
|
699
689
|
|
|
690
|
+
# If enabled stdout and stderr of running jobs will be redirected to the task logger.
|
|
691
|
+
CELERY_WORKER_REDIRECT_STDOUTS = is_truthy(os.getenv("NAUTOBOT_CELERY_WORKER_REDIRECT_STDOUTS", "True"))
|
|
692
|
+
|
|
693
|
+
# The log level of log messages generated by redirected job stdout and stderr. Can be one of `DEBUG`, `INFO`, `WARNING`, `ERROR`, or `CRITICAL`.
|
|
694
|
+
CELERY_WORKER_REDIRECT_STDOUTS_LEVEL = os.getenv("NAUTOBOT_CELERY_WORKER_REDIRECT_STDOUTS_LEVEL", "WARNING")
|
|
695
|
+
|
|
700
696
|
# Send task-related events so that tasks can be monitored using tools like flower. Sets the default value for the workers -E argument.
|
|
701
697
|
CELERY_WORKER_SEND_TASK_EVENTS = True
|
|
702
698
|
|
|
@@ -793,3 +789,35 @@ def UI_RACK_VIEW_TRUNCATE_FUNCTION(device_display_name):
|
|
|
793
789
|
:type: str
|
|
794
790
|
"""
|
|
795
791
|
return str(device_display_name).split(".")[0]
|
|
792
|
+
|
|
793
|
+
|
|
794
|
+
# Custom JSON schema serializer field type mappingss. These will be added to
|
|
795
|
+
# `NautobotProcessingMixin.TYPE_MAP`.
|
|
796
|
+
# Format: `{serializer_field_class.__name__}` => `{json_schema_type}`
|
|
797
|
+
# See: https://github.com/yoyowallet/drf-react-template-framework#settings
|
|
798
|
+
DRF_REACT_TEMPLATE_TYPE_MAP = {
|
|
799
|
+
"ContentTypeField": {"type": "string", "enum": "choices"},
|
|
800
|
+
"CustomFieldsDataField": {"type": "object", "widget": "textarea"},
|
|
801
|
+
"DateTimeField": {"type": "string", "format": "date-time", "widget": "date-time"},
|
|
802
|
+
"ImageField": {"type": "string", "format": "data-url"},
|
|
803
|
+
"IPFieldSerializer": {"type": "string"},
|
|
804
|
+
"JSONField": {"type": "string", "widget": "textarea"},
|
|
805
|
+
"MultipleChoiceJSONField": {"type": "array", "required": [], "enum": "choices"},
|
|
806
|
+
"ManyRelatedField": {"type": "array", "required": []},
|
|
807
|
+
#
|
|
808
|
+
# Foreign Key fields
|
|
809
|
+
#
|
|
810
|
+
# enum=choices is the one that works in the UI as a related field but it
|
|
811
|
+
# includes ALL related objects in the schema.
|
|
812
|
+
# "NautobotHyperlinkedRelatedField": {"type": "string", "enum": "choices"},
|
|
813
|
+
# readOnly=True disables the fields in the UI; not what we want.
|
|
814
|
+
# "NautobotHyperlinkedRelatedField": {"type": "string", "readOnly": True},
|
|
815
|
+
# type=string results in a free text field; also not what we want. For now,
|
|
816
|
+
# however, this will keep things moving so the unit tests pass.
|
|
817
|
+
"NautobotHyperlinkedRelatedField": {"type": "string", "format": "uuid"},
|
|
818
|
+
"PrimaryKeyRelatedField": {"type": "string", "enum": "choices"},
|
|
819
|
+
"RelationshipsDataField": {"type": "object"},
|
|
820
|
+
"SlugField": {"type": "string"},
|
|
821
|
+
"TimeZoneSerializerField": {"type": "string"},
|
|
822
|
+
"UUIDField": {"type": "string", "format": "uuid"},
|
|
823
|
+
}
|
nautobot/core/tables.py
CHANGED
|
@@ -37,21 +37,21 @@ class BaseTable(django_tables2.Table):
|
|
|
37
37
|
self.base_columns[name] = CustomFieldColumn(cf)
|
|
38
38
|
|
|
39
39
|
for cpf in models.ComputedField.objects.filter(content_type=obj_type):
|
|
40
|
-
self.base_columns[f"cpf_{cpf.
|
|
40
|
+
self.base_columns[f"cpf_{cpf.key}"] = ComputedFieldColumn(cpf)
|
|
41
41
|
|
|
42
42
|
for relationship in models.Relationship.objects.filter(source_type=obj_type):
|
|
43
43
|
if not relationship.symmetric:
|
|
44
|
-
self.base_columns[f"cr_{relationship.
|
|
44
|
+
self.base_columns[f"cr_{relationship.key}_src"] = RelationshipColumn(
|
|
45
45
|
relationship, side=choices.RelationshipSideChoices.SIDE_SOURCE
|
|
46
46
|
)
|
|
47
47
|
else:
|
|
48
|
-
self.base_columns[f"cr_{relationship.
|
|
48
|
+
self.base_columns[f"cr_{relationship.key}_peer"] = RelationshipColumn(
|
|
49
49
|
relationship, side=choices.RelationshipSideChoices.SIDE_PEER
|
|
50
50
|
)
|
|
51
51
|
|
|
52
52
|
for relationship in models.Relationship.objects.filter(destination_type=obj_type):
|
|
53
53
|
if not relationship.symmetric:
|
|
54
|
-
self.base_columns[f"cr_{relationship.
|
|
54
|
+
self.base_columns[f"cr_{relationship.key}_dst"] = RelationshipColumn(
|
|
55
55
|
relationship, side=choices.RelationshipSideChoices.SIDE_DESTINATION
|
|
56
56
|
)
|
|
57
57
|
# symmetric relationships are already handled above in the source_type case
|
|
@@ -443,7 +443,7 @@ class RelationshipColumn(django_tables2.Column):
|
|
|
443
443
|
template += format_html(
|
|
444
444
|
'<a href="{}?relationship={}&{}_id={}">{} {}</a>',
|
|
445
445
|
reverse("extras:relationshipassociation_list"),
|
|
446
|
-
self.relationship.
|
|
446
|
+
self.relationship.key,
|
|
447
447
|
self.side,
|
|
448
448
|
record.id,
|
|
449
449
|
len(value),
|
nautobot/core/tasks.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
from cacheops.simple import CacheMiss, cache
|
|
4
3
|
from django.conf import settings
|
|
4
|
+
from django.core.cache import cache
|
|
5
5
|
from packaging import version
|
|
6
6
|
import requests
|
|
7
7
|
|
|
@@ -21,12 +21,9 @@ def get_releases(pre_releases=False):
|
|
|
21
21
|
releases = []
|
|
22
22
|
|
|
23
23
|
# Check whether this URL has failed recently and shouldn't be retried yet
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return []
|
|
28
|
-
except CacheMiss:
|
|
29
|
-
pass
|
|
24
|
+
if url == cache.get("latest_release_no_retry"):
|
|
25
|
+
logger.info(f"Skipping release check; URL failed recently: {url}")
|
|
26
|
+
return []
|
|
30
27
|
|
|
31
28
|
try:
|
|
32
29
|
logger.debug(f"Fetching new releases from {url}")
|
|
@@ -1,49 +1 @@
|
|
|
1
|
-
{%
|
|
2
|
-
{% load helpers %}
|
|
3
|
-
{% load plugins %}
|
|
4
|
-
|
|
5
|
-
<!DOCTYPE html>
|
|
6
|
-
<html lang="en"{% if request.COOKIES|get_item:"theme" == 'dark' %} data-theme="dark"{% endif %}>
|
|
7
|
-
<head>
|
|
8
|
-
<title>{% block title %}Home{% endblock %} - {{ settings.BRANDING_TITLE }}</title>
|
|
9
|
-
{% include 'inc/media.html' %}
|
|
10
|
-
{% block extra_styles %}{% endblock %}
|
|
11
|
-
</head>
|
|
12
|
-
<body>
|
|
13
|
-
{% include 'inc/nav_menu.html' %}
|
|
14
|
-
<div class="container-fluid wrapper">
|
|
15
|
-
{% if "BANNER_TOP"|settings_or_config %}
|
|
16
|
-
<div class="alert alert-info text-center" role="alert">
|
|
17
|
-
{{ "BANNER_TOP"|settings_or_config|safe }}
|
|
18
|
-
</div>
|
|
19
|
-
{% endif %}
|
|
20
|
-
{% if settings.MAINTENANCE_MODE %}
|
|
21
|
-
<div class="alert alert-warning text-center" role="alert">
|
|
22
|
-
<h4><i class="mdi mdi-alert"></i> Maintenance Mode</h4>
|
|
23
|
-
<p>Nautobot is currently in maintenance mode. Functionality may be limited.</p>
|
|
24
|
-
</div>
|
|
25
|
-
{% endif %}
|
|
26
|
-
{% plugin_banners %}
|
|
27
|
-
{% for message in messages %}
|
|
28
|
-
<div class="alert alert-{{ message.tags }} alert-dismissable" role="alert">
|
|
29
|
-
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
|
30
|
-
<span>×</span>
|
|
31
|
-
</button>
|
|
32
|
-
{{ message }}
|
|
33
|
-
</div>
|
|
34
|
-
{% endfor %}
|
|
35
|
-
{% block header %}{% endblock header %}
|
|
36
|
-
{% block content %}{% endblock content %}
|
|
37
|
-
<div class="push"></div>
|
|
38
|
-
{% if "BANNER_BOTTOM"|settings_or_config %}
|
|
39
|
-
<div class="alert alert-info text-center banner-bottom" role="alert">
|
|
40
|
-
{{ "BANNER_BOTTOM"|settings_or_config|safe }}
|
|
41
|
-
</div>
|
|
42
|
-
{% endif %}
|
|
43
|
-
</div>
|
|
44
|
-
{% include 'modals/modal_theme.html' with name='theme'%}
|
|
45
|
-
{% include 'inc/footer.html' %}
|
|
46
|
-
{% include 'inc/javascript.html' %}
|
|
47
|
-
{% block javascript %}{% endblock %}
|
|
48
|
-
</body>
|
|
49
|
-
</html>
|
|
1
|
+
{% extends root_template|default:'base_django.html' %}
|