nautobot 2.1.0b1__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nautobot/__init__.py +1 -3
- nautobot/apps/__init__.py +1 -2
- nautobot/apps/admin.py +0 -1
- nautobot/apps/api.py +0 -1
- nautobot/apps/change_logging.py +0 -1
- nautobot/apps/choices.py +0 -3
- nautobot/apps/datasources.py +2 -2
- nautobot/apps/exceptions.py +0 -1
- nautobot/apps/factory.py +0 -1
- nautobot/apps/filters.py +6 -9
- nautobot/apps/forms.py +1 -2
- nautobot/apps/graphql.py +0 -1
- nautobot/apps/jobs.py +2 -1
- nautobot/apps/models.py +4 -2
- nautobot/apps/querysets.py +0 -1
- nautobot/apps/secrets.py +0 -1
- nautobot/apps/tables.py +0 -1
- nautobot/apps/testing.py +0 -1
- nautobot/apps/ui.py +1 -3
- nautobot/apps/urls.py +0 -1
- nautobot/apps/utils.py +0 -1
- nautobot/apps/views.py +0 -1
- nautobot/circuits/api/serializers.py +1 -1
- nautobot/circuits/api/urls.py +1 -1
- nautobot/circuits/api/views.py +2 -1
- nautobot/circuits/apps.py +1 -1
- nautobot/circuits/choices.py +0 -1
- nautobot/circuits/factory.py +1 -1
- nautobot/circuits/filters.py +2 -1
- nautobot/circuits/forms.py +2 -2
- nautobot/circuits/homepage.py +0 -1
- nautobot/circuits/migrations/0001_initial_part_1.py +3 -1
- nautobot/circuits/migrations/0002_initial_part_2.py +2 -1
- nautobot/circuits/migrations/0003_auto_slug.py +1 -0
- nautobot/circuits/migrations/0005_providernetwork.py +4 -2
- nautobot/circuits/migrations/0013_alter_circuittermination__path.py +1 -0
- nautobot/circuits/migrations/0014_related_name_changes.py +1 -0
- nautobot/circuits/migrations/0016_tagsfield.py +1 -0
- nautobot/circuits/migrations/0018_status_nonnullable.py +1 -0
- nautobot/circuits/models.py +2 -2
- nautobot/circuits/navigation.py +0 -1
- nautobot/circuits/signals.py +3 -2
- nautobot/circuits/tables.py +1 -0
- nautobot/circuits/tests/integration/test_relationships.py +1 -1
- nautobot/circuits/tests/test_api.py +1 -1
- nautobot/circuits/tests/test_urls.py +1 -1
- nautobot/circuits/tests/test_views.py +1 -0
- nautobot/circuits/urls.py +1 -1
- nautobot/circuits/views.py +1 -10
- nautobot/core/__init__.py +0 -1
- nautobot/core/admin.py +3 -5
- nautobot/core/api/__init__.py +0 -1
- nautobot/core/api/metadata.py +4 -6
- nautobot/core/api/pagination.py +2 -2
- nautobot/core/api/parsers.py +1 -3
- nautobot/core/api/renderers.py +0 -1
- nautobot/core/api/schema.py +2 -3
- nautobot/core/api/serializers.py +9 -7
- nautobot/core/api/urls.py +1 -5
- nautobot/core/api/utils.py +14 -15
- nautobot/core/api/versioning.py +1 -1
- nautobot/core/api/views.py +22 -91
- nautobot/core/apps/__init__.py +5 -7
- nautobot/core/authentication.py +1 -1
- nautobot/core/celery/__init__.py +1 -2
- nautobot/core/celery/control.py +0 -2
- nautobot/core/celery/encoders.py +0 -1
- nautobot/core/celery/schedulers.py +1 -2
- nautobot/core/celery/task.py +1 -1
- nautobot/core/checks.py +31 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/cli/__init__.py +8 -17
- nautobot/core/context_processors.py +1 -5
- nautobot/core/factory.py +2 -2
- nautobot/core/filters.py +1 -1
- nautobot/core/forms/fields.py +2 -4
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/search.py +1 -1
- nautobot/core/forms/utils.py +1 -1
- nautobot/core/graphql/__init__.py +2 -3
- nautobot/core/graphql/generators.py +2 -2
- nautobot/core/graphql/schema.py +21 -8
- nautobot/core/graphql/schema_init.py +0 -1
- nautobot/core/graphql/types.py +10 -0
- nautobot/core/graphql/utils.py +1 -2
- nautobot/core/management/commands/generate_test_data.py +7 -6
- nautobot/core/management/commands/makemigrations.py +1 -1
- nautobot/core/management/commands/migrate.py +1 -1
- nautobot/core/management/commands/post_upgrade.py +1 -15
- nautobot/core/management/commands/refresh_content_type_cache.py +1 -2
- nautobot/core/management/commands/send_installation_metrics.py +2 -3
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/middleware.py +2 -2
- nautobot/core/models/__init__.py +12 -12
- nautobot/core/models/fields.py +1 -1
- nautobot/core/models/generics.py +2 -3
- nautobot/core/models/managers.py +0 -1
- nautobot/core/models/name_color_content_types.py +2 -2
- nautobot/core/models/tree_queries.py +2 -4
- nautobot/core/models/validators.py +1 -1
- nautobot/core/releases.py +1 -1
- nautobot/core/runner/importer.py +2 -25
- nautobot/core/runner/runner.py +2 -2
- nautobot/core/runner/settings.py +1 -1
- nautobot/core/settings.py +15 -21
- nautobot/core/settings_funcs.py +1 -2
- nautobot/core/signals.py +0 -1
- nautobot/core/tables.py +1 -1
- nautobot/core/templates/admin/base.html +9 -9
- nautobot/core/templates/exceptions/programming_error.html +2 -2
- nautobot/core/templates/graphene/graphiql.html +9 -3
- nautobot/core/templates/home.html +26 -6
- nautobot/core/templates/inc/footer.html +0 -7
- nautobot/core/templates/inc/javascript.html +4 -2
- nautobot/core/templates/inc/media.html +2 -2
- nautobot/core/templates/inc/nav_menu.html +27 -25
- nautobot/core/templates/inc/object_details_advanced_panel.html +12 -0
- nautobot/core/templates/nautobot_config.py.j2 +4 -4
- nautobot/core/templates/utilities/theme_preview.html +883 -0
- nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
- nautobot/core/templatetags/buttons.py +2 -1
- nautobot/core/templatetags/helpers.py +45 -18
- nautobot/core/testing/__init__.py +1 -2
- nautobot/core/testing/api.py +2 -4
- nautobot/core/testing/filters.py +1 -1
- nautobot/core/testing/integration.py +2 -2
- nautobot/core/testing/migrations.py +1 -0
- nautobot/core/testing/mixins.py +1 -2
- nautobot/core/testing/schema.py +1 -1
- nautobot/core/testing/utils.py +3 -3
- nautobot/core/testing/views.py +8 -8
- nautobot/core/tests/integration/test_home.py +1 -1
- nautobot/core/tests/integration/test_navbar.py +2 -2
- nautobot/core/tests/integration/test_plugin_home.py +2 -1
- nautobot/core/tests/integration/test_plugin_navbar.py +6 -6
- nautobot/core/tests/nautobot_config.py +3 -3
- nautobot/core/tests/runner.py +3 -4
- nautobot/core/tests/test_api.py +6 -51
- nautobot/core/tests/test_authentication.py +2 -3
- nautobot/core/tests/test_checks.py +1 -2
- nautobot/core/tests/test_config.py +1 -1
- nautobot/core/tests/test_csv.py +4 -4
- nautobot/core/tests/test_factory.py +1 -3
- nautobot/core/tests/test_filters.py +4 -7
- nautobot/core/tests/test_forms.py +3 -6
- nautobot/core/tests/test_graphql.py +33 -17
- nautobot/core/tests/test_jinja_filters.py +5 -4
- nautobot/core/tests/test_jobs.py +1 -1
- nautobot/core/tests/test_models.py +28 -3
- nautobot/core/tests/test_navigations.py +2 -1
- nautobot/core/tests/test_openapi.py +0 -1
- nautobot/core/tests/test_paginator.py +2 -2
- nautobot/core/tests/test_releases.py +2 -2
- nautobot/core/tests/test_tables.py +1 -1
- nautobot/core/tests/test_templatetags_helpers.py +17 -2
- nautobot/core/tests/test_templatetags_netutils.py +1 -2
- nautobot/core/tests/test_utils.py +4 -8
- nautobot/core/tests/test_views.py +95 -1
- nautobot/core/tests/test_views_utils.py +0 -1
- nautobot/core/urls.py +24 -4
- nautobot/core/utils/color.py +1 -1
- nautobot/core/utils/data.py +1 -2
- nautobot/core/utils/filtering.py +4 -5
- nautobot/core/utils/git.py +6 -2
- nautobot/core/utils/logging.py +2 -1
- nautobot/core/utils/lookup.py +4 -6
- nautobot/core/utils/migrations.py +1 -0
- nautobot/core/utils/permissions.py +2 -4
- nautobot/core/utils/requests.py +10 -0
- nautobot/core/views/__init__.py +32 -8
- nautobot/core/views/generic.py +14 -13
- nautobot/core/views/mixins.py +24 -22
- nautobot/core/views/renderers.py +1 -1
- nautobot/core/views/routers.py +6 -0
- nautobot/core/views/utils.py +2 -1
- nautobot/dcim/api/urls.py +1 -1
- nautobot/dcim/api/views.py +6 -5
- nautobot/dcim/apps.py +1 -1
- nautobot/dcim/choices.py +4 -1
- nautobot/dcim/constants.py +0 -1
- nautobot/dcim/elevations.py +1 -2
- nautobot/dcim/factory.py +125 -13
- nautobot/dcim/fields.py +1 -0
- nautobot/dcim/filters/__init__.py +2 -3
- nautobot/dcim/filters/mixins.py +1 -1
- nautobot/dcim/forms.py +37 -44
- nautobot/dcim/graphql/types.py +16 -17
- nautobot/dcim/migrations/0001_initial_part_1.py +4 -2
- nautobot/dcim/migrations/0002_initial_part_2.py +2 -1
- nautobot/dcim/migrations/0003_initial_part_3.py +2 -1
- nautobot/dcim/migrations/0004_initial_part_4.py +2 -1
- nautobot/dcim/migrations/0006_auto_slug.py +1 -0
- nautobot/dcim/migrations/0009_add_natural_indexing.py +1 -0
- nautobot/dcim/migrations/0010_interface_status.py +1 -0
- nautobot/dcim/migrations/0011_interface_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0013_location_location_type.py +4 -2
- nautobot/dcim/migrations/0014_location_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
- nautobot/dcim/migrations/0018_device_redundancy_group.py +4 -2
- nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0022_interface_redundancy_group.py +3 -1
- nautobot/dcim/migrations/0023_interface_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0024_move_site_fields_to_location_model.py +2 -1
- nautobot/dcim/migrations/0027_alter_interface_mac_address.py +1 -0
- nautobot/dcim/migrations/0028_alter_device_and_rack_role_add_new_role.py +1 -0
- nautobot/dcim/migrations/0029_device_and_rack_roles_data_migrations.py +1 -0
- nautobot/dcim/migrations/0033_add_tree_managers_and_foreign_keys_pre_data_migration.py +1 -0
- nautobot/dcim/migrations/0034_migrate_region_and_site_data_to_locations.py +1 -2
- nautobot/dcim/migrations/0038_fixup_fks_and_related_names.py +1 -0
- nautobot/dcim/migrations/0039_related_name_changes.py +1 -0
- nautobot/dcim/migrations/0042_alter_location_managers.py +1 -0
- nautobot/dcim/migrations/0044_tagsfield.py +1 -0
- nautobot/dcim/migrations/0047_status_nonnullable.py +1 -0
- nautobot/dcim/migrations/0051_interface_redundancy_group_nullable_status.py +1 -0
- nautobot/dcim/models/cables.py +3 -3
- nautobot/dcim/models/device_component_templates.py +6 -6
- nautobot/dcim/models/devices.py +9 -4
- nautobot/dcim/models/locations.py +6 -1
- nautobot/dcim/models/power.py +1 -1
- nautobot/dcim/models/racks.py +5 -4
- nautobot/dcim/navigation.py +0 -1
- nautobot/dcim/signals.py +3 -2
- nautobot/dcim/tables/__init__.py +5 -4
- nautobot/dcim/tables/cables.py +1 -0
- nautobot/dcim/tables/devices.py +1 -0
- nautobot/dcim/tables/locations.py +1 -1
- nautobot/dcim/tables/power.py +1 -0
- nautobot/dcim/tables/racks.py +2 -1
- nautobot/dcim/templates/dcim/device/consoleports.html +2 -2
- nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -2
- nautobot/dcim/templates/dcim/device/devicebays.html +1 -1
- nautobot/dcim/templates/dcim/device/frontports.html +2 -2
- nautobot/dcim/templates/dcim/device/interfaces.html +4 -4
- nautobot/dcim/templates/dcim/device/inventory.html +1 -1
- nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -2
- nautobot/dcim/templates/dcim/device/powerports.html +2 -2
- nautobot/dcim/templates/dcim/device/rearports.html +2 -2
- nautobot/dcim/templates/dcim/inc/location_hierarchy.html +4 -2
- nautobot/dcim/templates/dcim/rack.html +1 -1
- nautobot/dcim/templates/dcim/rack_elevation_list.html +1 -1
- nautobot/dcim/templates/dcim/rackreservation.html +1 -1
- nautobot/dcim/tests/test_api.py +7 -7
- nautobot/dcim/tests/test_cablepaths.py +0 -1
- nautobot/dcim/tests/test_filters.py +16 -13
- nautobot/dcim/tests/test_forms.py +2 -3
- nautobot/dcim/tests/test_graphql.py +1 -0
- nautobot/dcim/tests/test_migrations.py +2 -2
- nautobot/dcim/tests/test_models.py +2 -2
- nautobot/dcim/tests/test_views.py +77 -14
- nautobot/dcim/urls.py +3 -2
- nautobot/dcim/utils.py +1 -1
- nautobot/dcim/views.py +4 -3
- nautobot/extras/admin.py +2 -1
- nautobot/extras/api/customfields.py +0 -2
- nautobot/extras/api/mixins.py +0 -1
- nautobot/extras/api/serializers.py +4 -4
- nautobot/extras/api/urls.py +1 -1
- nautobot/extras/api/views.py +1 -1
- nautobot/extras/apps.py +3 -4
- nautobot/extras/choices.py +3 -18
- nautobot/extras/context_managers.py +1 -1
- nautobot/extras/datasources/__init__.py +3 -1
- nautobot/extras/datasources/git.py +33 -12
- nautobot/extras/datasources/utils.py +0 -1
- nautobot/extras/factory.py +20 -0
- nautobot/extras/filters/__init__.py +2 -3
- nautobot/extras/filters/customfields.py +0 -1
- nautobot/extras/filters/mixins.py +1 -1
- nautobot/extras/forms/__init__.py +3 -4
- nautobot/extras/forms/base.py +1 -1
- nautobot/extras/forms/forms.py +29 -11
- nautobot/extras/forms/mixins.py +1 -1
- nautobot/extras/graphql/types.py +2 -2
- nautobot/extras/health_checks.py +1 -1
- nautobot/extras/jobs.py +43 -25
- nautobot/extras/management/__init__.py +0 -1
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -1
- nautobot/extras/management/commands/runjob.py +3 -3
- nautobot/extras/management/commands/webhook_receiver.py +1 -2
- nautobot/extras/migrations/0001_initial_part_1.py +2 -1
- nautobot/extras/migrations/0002_initial_part_2.py +2 -1
- nautobot/extras/migrations/0003_initial_part_3.py +1 -0
- nautobot/extras/migrations/0006_graphqlquery.py +2 -1
- nautobot/extras/migrations/0007_configcontextschema.py +3 -1
- nautobot/extras/migrations/0009_computedfield.py +3 -1
- nautobot/extras/migrations/0011_fileattachment_fileproxy.py +3 -1
- nautobot/extras/migrations/0012_healthchecktestmodel.py +2 -1
- nautobot/extras/migrations/0014_auto_slug.py +1 -0
- nautobot/extras/migrations/0015_scheduled_job.py +3 -1
- nautobot/extras/migrations/0016_secret.py +4 -2
- nautobot/extras/migrations/0017_joblogentry.py +2 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +2 -1
- nautobot/extras/migrations/0021_customfield_changelog_data.py +3 -2
- nautobot/extras/migrations/0022_objectchange_object_datav2.py +1 -0
- nautobot/extras/migrations/0023_job_model.py +4 -2
- nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +1 -0
- nautobot/extras/migrations/0029_dynamicgroup.py +3 -1
- nautobot/extras/migrations/0031_tag_content_types.py +1 -0
- nautobot/extras/migrations/0032_tag_content_types_data_migration.py +1 -0
- nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +2 -1
- nautobot/extras/migrations/0041_jobresult_job_kwargs.py +1 -0
- nautobot/extras/migrations/0043_note.py +3 -1
- nautobot/extras/migrations/0044_add_job_hook.py +3 -1
- nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +1 -0
- nautobot/extras/migrations/0047_enforce_custom_field_slug.py +1 -0
- nautobot/extras/migrations/0051_add_job_task_queues.py +1 -0
- nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +1 -0
- nautobot/extras/migrations/0057_jobbutton.py +3 -1
- nautobot/extras/migrations/0065_configcontext_data_migrations.py +1 -0
- nautobot/extras/migrations/0067_migrate_job_result_status.py +0 -1
- nautobot/extras/migrations/0068_jobresult__add_celery_fields.py +1 -0
- nautobot/extras/migrations/0071_replace_related_names.py +1 -0
- nautobot/extras/migrations/0077_migrate_custom_field_data.py +1 -0
- nautobot/extras/migrations/0078_remove_name_field_and_make_label_field_non_nullable.py +1 -0
- nautobot/extras/migrations/0080_tagsfield.py +1 -0
- nautobot/extras/migrations/0082_rename_relationship_name_to_label.py +1 -0
- nautobot/extras/migrations/0083_ensure_relationship_keys_are_unique.py +1 -0
- nautobot/extras/migrations/0090_joblogentry__log_level_data_migration.py +0 -1
- nautobot/extras/migrations/0095_ensure_note_timestamps_are_unique.py +4 -5
- nautobot/extras/migrations/0097_alter_job_result_remove_result.py +1 -0
- nautobot/extras/migrations/0100_fileproxy_job_result.py +1 -0
- nautobot/extras/migrations/0101_externalintegration.py +9 -1
- nautobot/extras/models/__init__.py +2 -3
- nautobot/extras/models/change_logging.py +0 -1
- nautobot/extras/models/customfields.py +13 -4
- nautobot/extras/models/datasources.py +2 -2
- nautobot/extras/models/groups.py +3 -4
- nautobot/extras/models/jobs.py +13 -7
- nautobot/extras/models/models.py +61 -24
- nautobot/extras/models/relationships.py +8 -4
- nautobot/extras/models/roles.py +1 -1
- nautobot/extras/models/secrets.py +1 -3
- nautobot/extras/models/tags.py +0 -1
- nautobot/extras/navigation.py +0 -1
- nautobot/extras/plugins/__init__.py +6 -7
- nautobot/extras/plugins/tables.py +1 -2
- nautobot/extras/plugins/utils.py +1 -1
- nautobot/extras/plugins/views.py +21 -21
- nautobot/extras/querysets.py +30 -13
- nautobot/extras/signals.py +6 -7
- nautobot/extras/tables.py +13 -5
- nautobot/extras/tasks.py +1 -2
- nautobot/extras/templates/extras/configcontext_edit.html +1 -1
- nautobot/extras/templates/extras/customfield_edit.html +7 -12
- nautobot/extras/templates/extras/dynamicgroup_edit.html +42 -47
- nautobot/extras/templates/extras/externalintegration_retrieve.html +12 -0
- nautobot/extras/templates/extras/externalintegration_update.html +28 -0
- nautobot/extras/templates/extras/gitrepository_result.html +2 -2
- nautobot/extras/templates/extras/graphqlquery.html +4 -2
- nautobot/extras/templates/extras/inc/jobresult_js.html +1 -1
- nautobot/extras/templates/extras/job_list.html +1 -1
- nautobot/extras/templates/extras/jobresult.html +2 -2
- nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
- nautobot/extras/templatetags/custom_links.py +2 -3
- nautobot/extras/templatetags/job_buttons.py +76 -83
- nautobot/extras/templatetags/log_levels.py +0 -1
- nautobot/extras/templatetags/plugins.py +1 -1
- nautobot/extras/test_jobs/api_test_job.py +1 -2
- nautobot/extras/test_jobs/atomic_transaction.py +1 -2
- nautobot/extras/test_jobs/dry_run.py +1 -2
- nautobot/extras/test_jobs/fail.py +1 -2
- nautobot/extras/test_jobs/field_order.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -2
- nautobot/extras/test_jobs/file_upload_pass.py +1 -2
- nautobot/extras/test_jobs/has_sensitive_variables.py +1 -2
- nautobot/extras/test_jobs/ipaddress_vars.py +1 -4
- nautobot/extras/test_jobs/job_button_receiver.py +1 -2
- nautobot/extras/test_jobs/job_hook_receiver.py +1 -2
- nautobot/extras/test_jobs/job_variables.py +7 -2
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -2
- nautobot/extras/test_jobs/log_redaction.py +1 -2
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -2
- nautobot/extras/test_jobs/modify_db.py +1 -2
- nautobot/extras/test_jobs/object_var_optional.py +1 -2
- nautobot/extras/test_jobs/object_var_required.py +1 -2
- nautobot/extras/test_jobs/object_vars.py +1 -2
- nautobot/extras/test_jobs/pass.py +1 -2
- nautobot/extras/test_jobs/profiling.py +1 -2
- nautobot/extras/tests/integration/__init__.py +1 -1
- nautobot/extras/tests/integration/test_computedfields.py +2 -2
- nautobot/extras/tests/integration/test_configcontextschema.py +5 -5
- nautobot/extras/tests/integration/test_plugins.py +5 -4
- nautobot/extras/tests/integration/test_tagfilter.py +1 -1
- nautobot/extras/tests/test_api.py +15 -9
- nautobot/extras/tests/test_changelog.py +3 -2
- nautobot/extras/tests/test_context_managers.py +6 -3
- nautobot/extras/tests/test_customfields.py +4 -4
- nautobot/extras/tests/test_datasources.py +1 -1
- nautobot/extras/tests/test_dynamicgroups.py +3 -3
- nautobot/extras/tests/test_filters.py +3 -2
- nautobot/extras/tests/test_forms.py +5 -6
- nautobot/extras/tests/test_git.py +1 -1
- nautobot/extras/tests/test_job_variables.py +20 -1
- nautobot/extras/tests/test_jobs.py +34 -5
- nautobot/extras/tests/test_models.py +156 -6
- nautobot/extras/tests/test_notes.py +0 -1
- nautobot/extras/tests/test_plugins.py +71 -9
- nautobot/extras/tests/test_relationships.py +3 -3
- nautobot/extras/tests/test_tags.py +1 -1
- nautobot/extras/tests/test_views.py +105 -25
- nautobot/extras/tests/test_webhooks.py +4 -5
- nautobot/extras/urls.py +0 -2
- nautobot/extras/utils.py +11 -9
- nautobot/extras/views.py +42 -44
- nautobot/generate_secret_key.py +10 -5
- nautobot/ipam/api/serializers.py +1 -2
- nautobot/ipam/api/urls.py +1 -1
- nautobot/ipam/api/views.py +1 -0
- nautobot/ipam/apps.py +2 -1
- nautobot/ipam/factory.py +6 -9
- nautobot/ipam/fields.py +1 -1
- nautobot/ipam/filters.py +42 -58
- nautobot/ipam/formfields.py +1 -2
- nautobot/ipam/forms.py +5 -4
- nautobot/ipam/graphql/types.py +1 -1
- nautobot/ipam/homepage.py +0 -1
- nautobot/ipam/lookups.py +2 -3
- nautobot/ipam/migrations/0002_initial_part_2.py +2 -1
- nautobot/ipam/migrations/0003_remove_max_length.py +1 -0
- nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
- nautobot/ipam/migrations/0005_auto_slug.py +1 -0
- nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -0
- nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +1 -0
- nautobot/ipam/migrations/0020_related_name_changes.py +1 -0
- nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +1 -2
- nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +2 -1
- nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +15 -13
- nautobot/ipam/migrations/0028_tagsfield.py +1 -0
- nautobot/ipam/migrations/0030_ipam__namespaces.py +3 -1
- nautobot/ipam/migrations/0034_status_nonnullable.py +1 -0
- nautobot/ipam/migrations/0037_data_migration_vlan_group_name_uniqueness.py +0 -1
- nautobot/ipam/migrations/0039_alter_ipaddresstointerface_ip_address.py +20 -0
- nautobot/ipam/models.py +11 -8
- nautobot/ipam/navigation.py +0 -1
- nautobot/ipam/querysets.py +48 -49
- nautobot/ipam/tables.py +11 -2
- nautobot/ipam/templates/ipam/ipaddress.html +30 -6
- nautobot/ipam/templates/ipam/ipaddress_interfaces.html +3 -3
- nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +32 -0
- nautobot/ipam/tests/test_api.py +2 -2
- nautobot/ipam/tests/test_filters.py +13 -17
- nautobot/ipam/tests/test_migrations.py +1 -2
- nautobot/ipam/tests/test_models.py +17 -2
- nautobot/ipam/tests/test_ordering.py +1 -1
- nautobot/ipam/tests/test_querysets.py +2 -2
- nautobot/ipam/tests/test_views.py +6 -6
- nautobot/ipam/urls.py +6 -0
- nautobot/ipam/utils/migrations.py +0 -1
- nautobot/ipam/views.py +26 -6
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +142 -142
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +307 -307
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
- nautobot/project-static/css/base.css +59 -30
- nautobot/project-static/css/dark.css +38 -31
- nautobot/project-static/docs/404.html +17 -87
- nautobot/project-static/docs/apps/index.html +17 -87
- nautobot/project-static/docs/apps/nautobot-apps.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +405 -475
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +28 -98
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2334 -2396
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +132 -202
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +155 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +42 -112
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1028 -1098
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +186 -256
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1454 -1156
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1443 -1507
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +157 -203
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +17 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +32 -102
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3822 -3888
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +990 -1060
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +65 -123
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1431 -1495
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3618 -3640
- nautobot/project-static/docs/development/apps/api/configuration-view.html +17 -87
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +19 -89
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +17 -87
- nautobot/project-static/docs/development/apps/api/models/global-search.html +17 -87
- nautobot/project-static/docs/development/apps/api/models/graphql.html +17 -87
- nautobot/project-static/docs/development/apps/api/models/index.html +17 -87
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +19 -89
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +19 -89
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +19 -89
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +21 -87
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +17 -87
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +17 -87
- nautobot/project-static/docs/development/apps/api/prometheus.html +17 -87
- nautobot/project-static/docs/development/apps/api/setup.html +17 -87
- nautobot/project-static/docs/development/apps/api/testing.html +20 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +17 -87
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +17 -87
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +17 -87
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +19 -89
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +209 -140
- nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +13 -5390
- nautobot/project-static/docs/development/apps/api/views/base-template.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +22 -92
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/index.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/notes.html +19 -89
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/urls.html +17 -87
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5385
- nautobot/project-static/docs/development/apps/index.html +17 -87
- nautobot/project-static/docs/development/apps/migration/code-updates.html +17 -87
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +17 -87
- nautobot/project-static/docs/development/apps/migration/from-v1.html +17 -88
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +17 -87
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +17 -87
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +17 -87
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +17 -87
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +17 -87
- nautobot/project-static/docs/development/core/application-registry.html +20 -90
- nautobot/project-static/docs/development/core/best-practices.html +20 -90
- nautobot/project-static/docs/development/core/bootstrap-ui.html +5360 -0
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +17 -87
- nautobot/project-static/docs/development/core/extending-models.html +21 -87
- nautobot/project-static/docs/development/core/generic-views.html +17 -87
- nautobot/project-static/docs/development/core/getting-started.html +124 -301
- nautobot/project-static/docs/development/core/homepage.html +17 -87
- nautobot/project-static/docs/development/core/index.html +17 -87
- nautobot/project-static/docs/development/core/model-features.html +17 -87
- nautobot/project-static/docs/development/core/natural-keys.html +17 -87
- nautobot/project-static/docs/development/core/navigation-menu.html +17 -87
- nautobot/project-static/docs/development/core/react-ui.html +13 -5668
- nautobot/project-static/docs/development/core/release-checklist.html +20 -96
- nautobot/project-static/docs/development/core/role-internals.html +20 -90
- nautobot/project-static/docs/development/core/style-guide.html +77 -146
- nautobot/project-static/docs/development/core/templates.html +20 -90
- nautobot/project-static/docs/development/core/testing.html +17 -87
- nautobot/project-static/docs/development/core/user-preferences.html +17 -87
- nautobot/project-static/docs/development/index.html +17 -87
- nautobot/project-static/docs/development/jobs/index.html +424 -425
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +75 -98
- nautobot/project-static/docs/development/react-ui.html +3 -3
- nautobot/project-static/docs/img/relationship_w_json_filter.png +0 -0
- nautobot/project-static/docs/index.html +90 -93
- nautobot/project-static/docs/media/admin_ui_run_permission.png +0 -0
- nautobot/project-static/docs/media/development/homepage_changelog_panel.png +0 -0
- nautobot/project-static/docs/media/development/homepage_dcim_panel.png +0 -0
- nautobot/project-static/docs/media/installation/nautobot_ui_admin.png +0 -0
- nautobot/project-static/docs/media/installation/nautobot_ui_login.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_filtering_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_02.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_03.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_04.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_05.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_02.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_03.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_04.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_05.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_06.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_07.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_01.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_02.png +0 -0
- nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_03.png +0 -0
- nautobot/project-static/docs/media/models/jobbutton_form.png +0 -0
- nautobot/project-static/docs/media/models/site_jobbuttons.png +0 -0
- nautobot/project-static/docs/media/plugins/plugin_admin_config.png +0 -0
- nautobot/project-static/docs/media/plugins/plugin_admin_ui.png +0 -0
- nautobot/project-static/docs/media/ss_config_contexts.png +0 -0
- nautobot/project-static/docs/media/ss_graphiql.png +0 -0
- nautobot/project-static/docs/media/ss_main_page.png +0 -0
- nautobot/project-static/docs/media/ss_plugin_chatops.png +0 -0
- nautobot/project-static/docs/media/ss_plugin_golden_config.png +0 -0
- nautobot/project-static/docs/media/ss_prefix_hierarchy.png +0 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/release-notes/index.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.0.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.1.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.2.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.3.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.4.html +18 -88
- nautobot/project-static/docs/release-notes/version-1.5.html +17 -87
- nautobot/project-static/docs/release-notes/version-1.6.html +17 -87
- nautobot/project-static/docs/release-notes/version-2.0.html +467 -336
- nautobot/project-static/docs/release-notes/version-2.1.html +470 -108
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +240 -255
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +17 -87
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +20 -90
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +17 -87
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +17 -87
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5417
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +47 -113
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +17 -87
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/index.html +22 -109
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +18 -101
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +23 -140
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +17 -87
- nautobot/project-static/docs/user-guide/administration/installation/services.html +17 -87
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +17 -87
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +17 -87
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +92 -181
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +18 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +17 -87
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +23 -89
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +18 -88
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio +259 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.png +0 -0
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +18 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +17 -87
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +23 -93
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +17 -87
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +26 -96
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +35 -103
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +19 -89
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +19 -91
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +19 -89
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +24 -94
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +39 -258
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +45 -243
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_choices.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_grouped.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_label.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_edit.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_select.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/1-create-location-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/10-add-platform.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/11-platforms-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/12-add-tenant.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/13-assign-tenant-to-device.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/14-assign-tenant-to-device-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/15-create-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/16-interface-templates.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/17-templated-interfaces.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/18-assign-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/19-edit-ints-for-lag.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/2-create-manufacturer.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/20-ints-int-lag.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/21-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/22-create-vlans.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/23-create-vlans-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/24-vlan-main-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/25-add-vlan-to-interface.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/26-add-vlan-to-interface-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/27-add-rir.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/3-create-role.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/30-add-prefix.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/32-add-ip-addr.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/33-assign-address.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/34-assign-address-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/35-assign-address-3.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/36-verify-address.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/37-verify-prefix.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/38-verify-prefix2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/4-create-device-type.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/41-device-search-results.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/42-address-search-v2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/43-get-to-device-main-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/44-add-platform.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/5-create-device.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/6-create-location.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/7-location-type-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/8-location-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/01-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/02-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/03-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/04-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/05-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/06-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/07-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/08-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/09-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/10-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/11-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/12-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/13-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/14-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/15-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/16-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/17-git-data-source.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/00-graphiql.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/01-graphiql-explorer.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/02-graphiql-explorer-device-query.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/03-graphiql-explorer-device-attributes.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/04-graphql-query-01.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/05-graphiql-autocomplete.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/06-graphql-query-02.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/07-graphql-query-03.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/08-graphql-query-04.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/09-graphql-query-05.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/10-graphql-swagger.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/graphql/11-graphql-query-06.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/ip_merge_button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/no_more_dup_ips.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/skip_button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/unselect_ips.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/01-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/02-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/03-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/04-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/05-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/06-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/07-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/08-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/09-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/10-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/relationships/11-relationships.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +20 -90
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +22 -92
- nautobot/project-static/docs/user-guide/index.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +22 -88
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +68 -87
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +18 -88
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +22 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +18 -88
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +43 -91
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +21 -87
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +17 -87
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +17 -87
- nautobot/project-static/js/homepage_layout.js +170 -0
- nautobot/project-static/js/theme.js +0 -5
- nautobot/tenancy/api/urls.py +1 -1
- nautobot/tenancy/api/views.py +1 -0
- nautobot/tenancy/factory.py +2 -2
- nautobot/tenancy/filters/__init__.py +1 -2
- nautobot/tenancy/forms.py +2 -2
- nautobot/tenancy/homepage.py +0 -1
- nautobot/tenancy/migrations/0001_initial.py +2 -1
- nautobot/tenancy/migrations/0002_auto_slug.py +1 -0
- nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +1 -0
- nautobot/tenancy/migrations/0008_tagsfield.py +1 -0
- nautobot/tenancy/models.py +0 -1
- nautobot/tenancy/navigation.py +0 -1
- nautobot/tenancy/tables.py +1 -0
- nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
- nautobot/tenancy/tests/test_filters.py +5 -5
- nautobot/tenancy/urls.py +1 -0
- nautobot/tenancy/views.py +2 -2
- nautobot/users/admin.py +1 -2
- nautobot/users/api/urls.py +1 -1
- nautobot/users/api/views.py +6 -4
- nautobot/users/factory.py +8 -24
- nautobot/users/filters.py +4 -4
- nautobot/users/forms.py +1 -0
- nautobot/users/migrations/0004_alter_user_managers.py +1 -0
- nautobot/users/migrations/0008_make_object_permission_a_changelogged_model.py +22 -0
- nautobot/users/models.py +2 -2
- nautobot/users/tests/test_api.py +7 -6
- nautobot/users/tests/test_filters.py +0 -1
- nautobot/users/tests/test_models.py +0 -1
- nautobot/users/tests/test_password_ui.py +1 -1
- nautobot/users/views.py +5 -4
- nautobot/virtualization/api/urls.py +1 -1
- nautobot/virtualization/api/views.py +2 -1
- nautobot/virtualization/apps.py +1 -1
- nautobot/virtualization/choices.py +0 -1
- nautobot/virtualization/factory.py +1 -1
- nautobot/virtualization/filters.py +1 -1
- nautobot/virtualization/forms.py +6 -6
- nautobot/virtualization/homepage.py +0 -1
- nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +1 -0
- nautobot/virtualization/migrations/0004_auto_slug.py +1 -0
- nautobot/virtualization/migrations/0005_add_natural_indexing.py +1 -0
- nautobot/virtualization/migrations/0006_vminterface_status.py +1 -0
- nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +1 -0
- nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +1 -0
- nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -0
- nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +1 -0
- nautobot/virtualization/migrations/0018_related_name_changes.py +1 -0
- nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +1 -0
- nautobot/virtualization/migrations/0025_status_nonnullable.py +1 -0
- nautobot/virtualization/models.py +1 -2
- nautobot/virtualization/navigation.py +0 -1
- nautobot/virtualization/signals.py +0 -1
- nautobot/virtualization/tables.py +1 -0
- nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -2
- nautobot/virtualization/tests/test_filters.py +3 -3
- nautobot/virtualization/tests/test_models.py +1 -1
- nautobot/virtualization/tests/test_views.py +2 -2
- nautobot/virtualization/urls.py +1 -0
- nautobot/virtualization/views.py +1 -1
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/METADATA +10 -2
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/RECORD +895 -993
- nautobot/core/management/commands/build_ui.py +0 -281
- nautobot/core/templates/base_react.html +0 -55
- nautobot/core/tests/test_cli.py +0 -25
- nautobot/project-static/docs/media/installation/nautobot_ui_guest.png +0 -0
- nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.svg +0 -4
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/39-address-search.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/40-addr-main-page.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/18-git-data-source.png +0 -0
- nautobot/ui/.eslintignore +0 -3
- nautobot/ui/.gitignore +0 -7
- nautobot/ui/.prettierignore +0 -6
- nautobot/ui/.prettierrc +0 -4
- nautobot/ui/README.md +0 -27
- nautobot/ui/config/env.js +0 -102
- nautobot/ui/config/getHttpsConfig.js +0 -68
- nautobot/ui/config/jest/babelTransform.js +0 -14
- nautobot/ui/config/jest/cssTransform.js +0 -12
- nautobot/ui/config/jest/fileTransform.js +0 -38
- nautobot/ui/config/modules.js +0 -151
- nautobot/ui/config/paths.js +0 -67
- nautobot/ui/config/webpack/persistentCache/createEnvironmentHash.js +0 -8
- nautobot/ui/config/webpack.config.js +0 -674
- nautobot/ui/config/webpackDevServer.config.js +0 -127
- nautobot/ui/jest.config.js +0 -35
- nautobot/ui/jsconfig.json +0 -4
- nautobot/ui/package-lock.json +0 -22947
- nautobot/ui/package.json +0 -119
- nautobot/ui/public/index.html +0 -47
- nautobot/ui/public/logo192.png +0 -0
- nautobot/ui/public/logo512.png +0 -0
- nautobot/ui/public/manifest.json +0 -25
- nautobot/ui/public/nautobot_logo.svg +0 -131
- nautobot/ui/public/robots.txt +0 -3
- nautobot/ui/scripts/build.js +0 -224
- nautobot/ui/scripts/start.js +0 -140
- nautobot/ui/scripts/test.js +0 -40
- nautobot/ui/src/App.js +0 -79
- nautobot/ui/src/components/AppFullWidthComponents.js +0 -8
- nautobot/ui/src/components/AppTab.js +0 -40
- nautobot/ui/src/components/Apps.js +0 -60
- nautobot/ui/src/components/FeedbackModal.js +0 -123
- nautobot/ui/src/components/FiltersPanel.js +0 -693
- nautobot/ui/src/components/HomeChangelogPanel.js +0 -98
- nautobot/ui/src/components/HomePanel.js +0 -58
- nautobot/ui/src/components/JobHistoryTable.js +0 -78
- nautobot/ui/src/components/Layout.js +0 -76
- nautobot/ui/src/components/LoadingWidget.js +0 -14
- nautobot/ui/src/components/Navbar.js +0 -204
- nautobot/ui/src/components/NotificationPopover.js +0 -27
- nautobot/ui/src/components/ObjectTable/ObjectListTable.js +0 -300
- nautobot/ui/src/components/ObjectTable/ObjectTable.js +0 -96
- nautobot/ui/src/components/ObjectTable/ObjectTableItem.js +0 -70
- nautobot/ui/src/components/ObjectTable/index.js +0 -3
- nautobot/ui/src/components/Pagination/PageNumberForm.js +0 -228
- nautobot/ui/src/components/Pagination/PageSizeForm.js +0 -65
- nautobot/ui/src/components/Pagination/Pagination.js +0 -67
- nautobot/ui/src/components/Pagination/index.js +0 -3
- nautobot/ui/src/components/ReferenceDataTag.js +0 -35
- nautobot/ui/src/components/Retrieve/RenderChangeLogsTab.js +0 -58
- nautobot/ui/src/components/Retrieve/RenderColumn.js +0 -30
- nautobot/ui/src/components/Retrieve/RenderGroup.js +0 -24
- nautobot/ui/src/components/Retrieve/RenderHeader.js +0 -125
- nautobot/ui/src/components/Retrieve/RenderNotesTab.js +0 -60
- nautobot/ui/src/components/Retrieve/RenderTable.js +0 -33
- nautobot/ui/src/components/Retrieve/RenderTabs.js +0 -56
- nautobot/ui/src/components/Retrieve/index.js +0 -7
- nautobot/ui/src/components/RouterButton.js +0 -10
- nautobot/ui/src/components/RouterLink.js +0 -10
- nautobot/ui/src/components/SidebarNav.js +0 -156
- nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +0 -16
- nautobot/ui/src/components/__tests__/AppTab.test.js +0 -21
- nautobot/ui/src/components/__tests__/Apps.test.js +0 -14
- nautobot/ui/src/components/__tests__/Layout.test.js +0 -33
- nautobot/ui/src/components/__tests__/PageSizeForm.test.js +0 -13
- nautobot/ui/src/components/__tests__/Pagination.test.js +0 -43
- nautobot/ui/src/components/__tests__/Table.test.js +0 -39
- nautobot/ui/src/components/__tests__/TableItem.test.js +0 -39
- nautobot/ui/src/components/index.js +0 -4
- nautobot/ui/src/constants/apiPath.js +0 -13
- nautobot/ui/src/constants/icons.js +0 -15
- nautobot/ui/src/constants/size.js +0 -15
- nautobot/ui/src/file_templates/app_imports.js.j2 +0 -7
- nautobot/ui/src/file_templates/jsconfig-base.json +0 -12
- nautobot/ui/src/index.js +0 -65
- nautobot/ui/src/reportWebVitals.js +0 -15
- nautobot/ui/src/router.js +0 -77
- nautobot/ui/src/utils/api.js +0 -160
- nautobot/ui/src/utils/app-import.js +0 -15
- nautobot/ui/src/utils/color.js +0 -15
- nautobot/ui/src/utils/date.js +0 -14
- nautobot/ui/src/utils/index.js +0 -15
- nautobot/ui/src/utils/navigation.js +0 -48
- nautobot/ui/src/utils/session.js +0 -64
- nautobot/ui/src/utils/store.js +0 -242
- nautobot/ui/src/utils/string.js +0 -6
- nautobot/ui/src/utils/url.js +0 -4
- nautobot/ui/src/views/Home.js +0 -142
- nautobot/ui/src/views/InstalledApps.js +0 -80
- nautobot/ui/src/views/Login.js +0 -48
- nautobot/ui/src/views/Logout.js +0 -20
- nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +0 -11
- nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +0 -107
- nautobot/ui/src/views/__tests__/Login.test.js +0 -15
- nautobot/ui/src/views/generic/GenericView.js +0 -191
- nautobot/ui/src/views/generic/ObjectCreate.js +0 -96
- nautobot/ui/src/views/generic/ObjectList.js +0 -137
- nautobot/ui/src/views/generic/ObjectRetrieve.js +0 -87
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
- {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
|
@@ -977,20 +977,6 @@
|
|
|
977
977
|
|
|
978
978
|
|
|
979
979
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
<li class="md-nav__item">
|
|
986
|
-
<a href="../../user-guide/administration/configuration/node-configuration.html" class="md-nav__link">
|
|
987
|
-
Node.js Configuration
|
|
988
|
-
</a>
|
|
989
|
-
</li>
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
980
|
</ul>
|
|
995
981
|
</nav>
|
|
996
982
|
</li>
|
|
@@ -1439,34 +1425,6 @@
|
|
|
1439
1425
|
|
|
1440
1426
|
|
|
1441
1427
|
|
|
1442
|
-
<li class="md-nav__item">
|
|
1443
|
-
<a href="../../user-guide/feature-guides/git-data-source.html" class="md-nav__link">
|
|
1444
|
-
Git as a Data Source
|
|
1445
|
-
</a>
|
|
1446
|
-
</li>
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
<li class="md-nav__item">
|
|
1457
|
-
<a href="../../user-guide/feature-guides/graphql.html" class="md-nav__link">
|
|
1458
|
-
GraphQL
|
|
1459
|
-
</a>
|
|
1460
|
-
</li>
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
1428
|
<li class="md-nav__item">
|
|
1471
1429
|
<a href="../../user-guide/feature-guides/relationships.html" class="md-nav__link">
|
|
1472
1430
|
Relationships
|
|
@@ -3556,23 +3514,9 @@
|
|
|
3556
3514
|
|
|
3557
3515
|
|
|
3558
3516
|
|
|
3559
|
-
<li class="md-nav__item">
|
|
3560
|
-
<a href="../apps/api/views/view-overrides.html" class="md-nav__link">
|
|
3561
|
-
View Overrides
|
|
3562
|
-
</a>
|
|
3563
|
-
</li>
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
3517
|
<li class="md-nav__item">
|
|
3574
3518
|
<a href="../apps/api/views/core-view-overrides.html" class="md-nav__link">
|
|
3575
|
-
|
|
3519
|
+
View Overrides
|
|
3576
3520
|
</a>
|
|
3577
3521
|
</li>
|
|
3578
3522
|
|
|
@@ -3661,7 +3605,7 @@
|
|
|
3661
3605
|
|
|
3662
3606
|
<li class="md-nav__item">
|
|
3663
3607
|
<a href="../apps/api/platform-features/filter-extensions.html" class="md-nav__link">
|
|
3664
|
-
Filter
|
|
3608
|
+
Filter Extensions
|
|
3665
3609
|
</a>
|
|
3666
3610
|
</li>
|
|
3667
3611
|
|
|
@@ -3869,21 +3813,7 @@
|
|
|
3869
3813
|
|
|
3870
3814
|
<li class="md-nav__item">
|
|
3871
3815
|
<a href="../apps/api/ui-extensions/object-detail-views.html" class="md-nav__link">
|
|
3872
|
-
Object Detail Views
|
|
3873
|
-
</a>
|
|
3874
|
-
</li>
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
<li class="md-nav__item">
|
|
3885
|
-
<a href="../apps/api/ui-extensions/tabs.html" class="md-nav__link">
|
|
3886
|
-
Tabs
|
|
3816
|
+
Object Detail Views and Tabs
|
|
3887
3817
|
</a>
|
|
3888
3818
|
</li>
|
|
3889
3819
|
|
|
@@ -4554,6 +4484,20 @@
|
|
|
4554
4484
|
|
|
4555
4485
|
|
|
4556
4486
|
|
|
4487
|
+
<li class="md-nav__item">
|
|
4488
|
+
<a href="../core/bootstrap-ui.html" class="md-nav__link">
|
|
4489
|
+
Bootstrap UI
|
|
4490
|
+
</a>
|
|
4491
|
+
</li>
|
|
4492
|
+
|
|
4493
|
+
|
|
4494
|
+
|
|
4495
|
+
|
|
4496
|
+
|
|
4497
|
+
|
|
4498
|
+
|
|
4499
|
+
|
|
4500
|
+
|
|
4557
4501
|
<li class="md-nav__item">
|
|
4558
4502
|
<a href="../core/best-practices.html" class="md-nav__link">
|
|
4559
4503
|
Best Practices
|
|
@@ -4666,20 +4610,6 @@
|
|
|
4666
4610
|
|
|
4667
4611
|
|
|
4668
4612
|
|
|
4669
|
-
<li class="md-nav__item">
|
|
4670
|
-
<a href="../core/react-ui.html" class="md-nav__link">
|
|
4671
|
-
React UI
|
|
4672
|
-
</a>
|
|
4673
|
-
</li>
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4678
|
-
|
|
4679
|
-
|
|
4680
|
-
|
|
4681
|
-
|
|
4682
|
-
|
|
4683
4613
|
<li class="md-nav__item">
|
|
4684
4614
|
<a href="../core/role-internals.html" class="md-nav__link">
|
|
4685
4615
|
Role Internals
|
|
@@ -5196,6 +5126,33 @@
|
|
|
5196
5126
|
<nav class="md-nav" aria-label="Writing Jobs">
|
|
5197
5127
|
<ul class="md-nav__list">
|
|
5198
5128
|
|
|
5129
|
+
<li class="md-nav__item">
|
|
5130
|
+
<a href="#job-registration" class="md-nav__link">
|
|
5131
|
+
Job Registration
|
|
5132
|
+
</a>
|
|
5133
|
+
|
|
5134
|
+
<nav class="md-nav" aria-label="Job Registration">
|
|
5135
|
+
<ul class="md-nav__list">
|
|
5136
|
+
|
|
5137
|
+
<li class="md-nav__item">
|
|
5138
|
+
<a href="#registering-jobs-in-jobs_root-or-git-repositories" class="md-nav__link">
|
|
5139
|
+
Registering Jobs in JOBS_ROOT or Git Repositories
|
|
5140
|
+
</a>
|
|
5141
|
+
|
|
5142
|
+
</li>
|
|
5143
|
+
|
|
5144
|
+
<li class="md-nav__item">
|
|
5145
|
+
<a href="#registering-jobs-in-a-plugin" class="md-nav__link">
|
|
5146
|
+
Registering Jobs in a Plugin
|
|
5147
|
+
</a>
|
|
5148
|
+
|
|
5149
|
+
</li>
|
|
5150
|
+
|
|
5151
|
+
</ul>
|
|
5152
|
+
</nav>
|
|
5153
|
+
|
|
5154
|
+
</li>
|
|
5155
|
+
|
|
5199
5156
|
<li class="md-nav__item">
|
|
5200
5157
|
<a href="#module-metadata-attributes" class="md-nav__link">
|
|
5201
5158
|
Module Metadata Attributes
|
|
@@ -5340,6 +5297,13 @@
|
|
|
5340
5297
|
TextVar
|
|
5341
5298
|
</a>
|
|
5342
5299
|
|
|
5300
|
+
</li>
|
|
5301
|
+
|
|
5302
|
+
<li class="md-nav__item">
|
|
5303
|
+
<a href="#jsonvar" class="md-nav__link">
|
|
5304
|
+
JSONVar
|
|
5305
|
+
</a>
|
|
5306
|
+
|
|
5343
5307
|
</li>
|
|
5344
5308
|
|
|
5345
5309
|
<li class="md-nav__item">
|
|
@@ -5615,13 +5579,14 @@
|
|
|
5615
5579
|
<p>Jobs may be installed in one of three ways:</p>
|
|
5616
5580
|
<ul>
|
|
5617
5581
|
<li>Manually installed as files in the <a href="../../user-guide/administration/configuration/optional-settings.html#jobs_root"><code>JOBS_ROOT</code></a> path (which defaults to <code>$NAUTOBOT_ROOT/jobs/</code>).<ul>
|
|
5618
|
-
<li>
|
|
5619
|
-
<li>
|
|
5582
|
+
<li>This directory is added to Python's <code>sys.path</code> at runtime, so any Python modules placed in this directory will be imported in the root module namespace. For example, a job class named <code>MyJobClass</code> in <code>$JOBS_ROOT/my_job.py</code> will be loaded into Python as <code>my_job.MyJobClass</code>.</li>
|
|
5583
|
+
<li>All Python modules in this directory are imported by Nautobot and all worker processes at startup. If you have a <code>custom_jobs.py</code> and a <code>custom_jobs_module/__init__.py</code> file in your <code>JOBS_ROOT</code>, both of these files will be imported at startup.</li>
|
|
5620
5584
|
</ul>
|
|
5621
5585
|
</li>
|
|
5622
5586
|
<li>Imported from an external <a href="../../user-guide/platform-functionality/gitrepository.html#jobs">Git repository</a>.<ul>
|
|
5623
|
-
<li>
|
|
5624
|
-
<li>
|
|
5587
|
+
<li>Git repositories are loaded into the module namespace of the <code>GitRepository.slug</code> value at startup. For example, if your <code>slug</code> value is <code>my_git_jobs</code> your jobs will be loaded into Python as <code>my_git_jobs.jobs</code>.</li>
|
|
5588
|
+
<li>All git repositories providing jobs must include a <code>__init__.py</code> file at the root of the repository.</li>
|
|
5589
|
+
<li>Nautobot and all worker processes will import the git repository's <code>jobs</code> module at startup so a <code>jobs.py</code> or <code>jobs/__init__.py</code> file must exist in the root of the repository.</li>
|
|
5625
5590
|
</ul>
|
|
5626
5591
|
</li>
|
|
5627
5592
|
<li>Packaged as part of a <a href="../apps/api/platform-features/jobs.html">plugin</a>.<ul>
|
|
@@ -5664,6 +5629,26 @@
|
|
|
5664
5629
|
<p>When actively developing a Job utilizing a development environment it's important to understand that the "automatically reload when code changes are detected" debugging functionality provided by <code>nautobot-server runserver</code> does <strong>not</strong> automatically restart the Celery <code>worker</code> process when code changes are made; therefore, it is required to restart the <code>worker</code> after each update to your Job source code or else it will continue to run the version of the Job code that was present when it first started.</p>
|
|
5665
5630
|
<p>Additionally, as of Nautobot 1.3, the Job database records corresponding to installed Jobs are <em>not</em> automatically refreshed when the development server auto-restarts. If you make changes to any of the class and module metadata attributes described in the following sections, the database will be refreshed to reflect these changes only after running <code>nautobot-server migrate</code> or <code>nautobot-server post_upgrade</code> (recommended) or if you manually edit a Job database record to force it to be refreshed.</p>
|
|
5666
5631
|
</div>
|
|
5632
|
+
<h3 id="job-registration">Job Registration<a class="headerlink" href="#job-registration" title="Permanent link">¶</a></h3>
|
|
5633
|
+
<div class="admonition version-changed">
|
|
5634
|
+
<p class="admonition-title">Changed in version 2.0.0</p>
|
|
5635
|
+
</div>
|
|
5636
|
+
<p>All Job classes, including <code>JobHookReceiver</code> and <code>JobButtonReceiver</code> classes must be registered at <strong>import time</strong> using the <code>nautobot.apps.jobs.register_jobs</code> method. This method accepts one or more job classes as arguments. You must account for how your jobs are imported when deciding where to call this method.</p>
|
|
5637
|
+
<h4 id="registering-jobs-in-jobs_root-or-git-repositories">Registering Jobs in JOBS_ROOT or Git Repositories<a class="headerlink" href="#registering-jobs-in-jobs_root-or-git-repositories" title="Permanent link">¶</a></h4>
|
|
5638
|
+
<p>Only top level module names within JOBS_ROOT are imported by Nautobot at runtime. This means that if you're using submodules, you need to ensure that your jobs are either registered in your top level <code>__init__.py</code> or that this file imports your submodules where the jobs are registered:</p>
|
|
5639
|
+
<div class="highlight"><span class="filename">$JOBS_ROOT/my_jobs/__init__.py</span><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">my_job_module</span>
|
|
5640
|
+
</code></pre></div>
|
|
5641
|
+
<div class="highlight"><span class="filename">$JOBS_ROOT/my_jobs/my_job_module.py</span><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">register_jobs</span>
|
|
5642
|
+
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>
|
|
5643
|
+
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5644
|
+
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a> <span class="o">...</span>
|
|
5645
|
+
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>
|
|
5646
|
+
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="n">register_jobs</span><span class="p">(</span><span class="n">MyJob</span><span class="p">)</span>
|
|
5647
|
+
</code></pre></div>
|
|
5648
|
+
<p>Similarly, only the <code>jobs</code> module is loaded from Git repositories. If you're using submodules, you need to ensure that your jobs are either registered in the repository's <code>jobs/__init__.py</code> or that this file imports your submodules where the jobs are registered.</p>
|
|
5649
|
+
<p>If not using submodules, you should register your job in the file where your job is defined.</p>
|
|
5650
|
+
<h4 id="registering-jobs-in-a-plugin">Registering Jobs in a Plugin<a class="headerlink" href="#registering-jobs-in-a-plugin" title="Permanent link">¶</a></h4>
|
|
5651
|
+
<p>Plugins should register jobs in the module defined in their <a href="../apps/api/nautobot-app-config.html#nautobotappconfig-code-location-attributes"><code>NautobotAppConfig.jobs</code></a> property. This defaults to the <code>jobs</code> module of the plugin.</p>
|
|
5667
5652
|
<h3 id="module-metadata-attributes">Module Metadata Attributes<a class="headerlink" href="#module-metadata-attributes" title="Permanent link">¶</a></h3>
|
|
5668
5653
|
<h4 id="name-grouping"><code>name</code> (Grouping)<a class="headerlink" href="#name-grouping" title="Permanent link">¶</a></h4>
|
|
5669
5654
|
<p>You can define a global constant called <code>name</code> within a job module (the Python file which contains one or more job classes) to set the default grouping under which jobs in this module will be displayed in the Nautobot UI. If this value is not defined, the module's file name will be used. This "grouping" value may also be defined or overridden when editing Job records in the database.</p>
|
|
@@ -5682,15 +5667,15 @@
|
|
|
5682
5667
|
<h4 id="description"><code>description</code><a class="headerlink" href="#description" title="Permanent link">¶</a></h4>
|
|
5683
5668
|
<p>An optional human-friendly description of what this job does.
|
|
5684
5669
|
This can accept either plain text or Markdown-formatted text. It can also be multiple lines:</p>
|
|
5685
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5686
|
-
<a id="__codelineno-
|
|
5687
|
-
<a id="__codelineno-
|
|
5688
|
-
<a id="__codelineno-
|
|
5689
|
-
<a id="__codelineno-
|
|
5690
|
-
<a id="__codelineno-
|
|
5691
|
-
<a id="__codelineno-
|
|
5692
|
-
<a id="__codelineno-
|
|
5693
|
-
<a id="__codelineno-
|
|
5670
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="k">class</span> <span class="nc">ExampleJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5671
|
+
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
5672
|
+
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"""</span>
|
|
5673
|
+
<a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="s2"> This job does a number of interesting things.</span>
|
|
5674
|
+
<a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>
|
|
5675
|
+
<a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="s2"> 1. It hacks the Gibson</span>
|
|
5676
|
+
<a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="s2"> 2. It immanentizes the eschaton</span>
|
|
5677
|
+
<a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="s2"> 3. It's a floor wax *and* a dessert topping</span>
|
|
5678
|
+
<a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="s2"> """</span>
|
|
5694
5679
|
</code></pre></div>
|
|
5695
5680
|
<p>If you code a multi-line description, the first line only will be used in the description column of the jobs list, while the full description will be rendered in the job detail view, submission, approval, and results pages.</p>
|
|
5696
5681
|
<h4 id="approval_required"><code>approval_required</code><a class="headerlink" href="#approval_required" title="Permanent link">¶</a></h4>
|
|
@@ -5703,9 +5688,9 @@ This can accept either plain text or Markdown-formatted text. It can also be mul
|
|
|
5703
5688
|
</div>
|
|
5704
5689
|
<p>Default: <code>False</code></p>
|
|
5705
5690
|
<p>The checkbox to enable dryrun when executing a job is unchecked by default in the Nautobot UI. You can set <code>dryrun_default</code> to <code>True</code> under the <code>Meta</code> class if you want this option to instead be checked by default.</p>
|
|
5706
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5707
|
-
<a id="__codelineno-
|
|
5708
|
-
<a id="__codelineno-
|
|
5691
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5692
|
+
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
5693
|
+
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a> <span class="n">dryrun_default</span> <span class="o">=</span> <span class="kc">True</span>
|
|
5709
5694
|
</code></pre></div>
|
|
5710
5695
|
<h4 id="field_order"><code>field_order</code><a class="headerlink" href="#field_order" title="Permanent link">¶</a></h4>
|
|
5711
5696
|
<p>Default: <code>[]</code></p>
|
|
@@ -5749,22 +5734,22 @@ This can accept either plain text or Markdown-formatted text. It can also be mul
|
|
|
5749
5734
|
</div>
|
|
5750
5735
|
<p>An int or float value, in seconds, which can be used to override the default <a href="../../user-guide/administration/configuration/optional-settings.html#celery_task_soft_time_limit">soft time limit</a> for a job task to complete.</p>
|
|
5751
5736
|
<p>The <code>celery.exceptions.SoftTimeLimitExceeded</code> exception will be raised when this soft time limit is exceeded. The job task can catch this to clean up before the <a href="../../user-guide/administration/configuration/optional-settings.html#celery_task_time_limit">hard time limit</a> (10 minutes by default) is reached:</p>
|
|
5752
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5753
|
-
<a id="__codelineno-
|
|
5754
|
-
<a id="__codelineno-
|
|
5755
|
-
<a id="__codelineno-
|
|
5756
|
-
<a id="__codelineno-
|
|
5757
|
-
<a id="__codelineno-
|
|
5758
|
-
<a id="__codelineno-
|
|
5759
|
-
<a id="__codelineno-
|
|
5760
|
-
<a id="__codelineno-
|
|
5761
|
-
<a id="__codelineno-
|
|
5762
|
-
<a id="__codelineno-
|
|
5763
|
-
<a id="__codelineno-
|
|
5764
|
-
<a id="__codelineno-
|
|
5765
|
-
<a id="__codelineno-
|
|
5766
|
-
<a id="__codelineno-
|
|
5767
|
-
<a id="__codelineno-
|
|
5737
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kn">from</span> <span class="nn">celery.exceptions</span> <span class="kn">import</span> <span class="n">SoftTimeLimitExceeded</span>
|
|
5738
|
+
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
5739
|
+
<a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>
|
|
5740
|
+
<a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="k">class</span> <span class="nc">ExampleJobWithSoftTimeLimit</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5741
|
+
<a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
5742
|
+
<a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Soft Time Limit"</span>
|
|
5743
|
+
<a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Set a soft time limit of 10 seconds`"</span>
|
|
5744
|
+
<a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a> <span class="n">soft_time_limit</span> <span class="o">=</span> <span class="mi">10</span>
|
|
5745
|
+
<a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a>
|
|
5746
|
+
<a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
5747
|
+
<a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a> <span class="k">try</span><span class="p">:</span>
|
|
5748
|
+
<a id="__codelineno-5-12" name="__codelineno-5-12" href="#__codelineno-5-12"></a> <span class="c1"># code which might take longer than 10 seconds to run</span>
|
|
5749
|
+
<a id="__codelineno-5-13" name="__codelineno-5-13" href="#__codelineno-5-13"></a> <span class="n">job_code</span><span class="p">()</span>
|
|
5750
|
+
<a id="__codelineno-5-14" name="__codelineno-5-14" href="#__codelineno-5-14"></a> <span class="k">except</span> <span class="n">SoftTimeLimitExceeded</span><span class="p">:</span>
|
|
5751
|
+
<a id="__codelineno-5-15" name="__codelineno-5-15" href="#__codelineno-5-15"></a> <span class="c1"># any clean up code</span>
|
|
5752
|
+
<a id="__codelineno-5-16" name="__codelineno-5-16" href="#__codelineno-5-16"></a> <span class="n">cleanup_in_a_hurry</span><span class="p">()</span>
|
|
5768
5753
|
</code></pre></div>
|
|
5769
5754
|
<h4 id="task_queues"><code>task_queues</code><a class="headerlink" href="#task_queues" title="Permanent link">¶</a></h4>
|
|
5770
5755
|
<div class="admonition version-added">
|
|
@@ -5782,20 +5767,20 @@ This can accept either plain text or Markdown-formatted text. It can also be mul
|
|
|
5782
5767
|
</div>
|
|
5783
5768
|
<p>A path relative to the job source code containing a Django template which provides additional code to customize the Job's submission form. This template should extend the existing job template, <code>extras/job.html</code>, otherwise the base form and functionality may not be available.</p>
|
|
5784
5769
|
<p>A template can provide additional JavaScript, CSS, or even display HTML. A good starting template would be:</p>
|
|
5785
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5786
|
-
<a id="__codelineno-
|
|
5787
|
-
<a id="__codelineno-
|
|
5788
|
-
<a id="__codelineno-
|
|
5789
|
-
<a id="__codelineno-
|
|
5790
|
-
<a id="__codelineno-
|
|
5791
|
-
<a id="__codelineno-
|
|
5792
|
-
<a id="__codelineno-
|
|
5793
|
-
<a id="__codelineno-
|
|
5794
|
-
<a id="__codelineno-
|
|
5795
|
-
<a id="__codelineno-
|
|
5796
|
-
<a id="__codelineno-
|
|
5797
|
-
<a id="__codelineno-
|
|
5798
|
-
<a id="__codelineno-
|
|
5770
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>{% extends 'extras/job.html' %}
|
|
5771
|
+
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>
|
|
5772
|
+
<a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>{% block extra_styles %}
|
|
5773
|
+
<a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a> {{ block.super }}
|
|
5774
|
+
<a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a> <span class="cm"><!-- Add additional CSS here. --></span>
|
|
5775
|
+
<a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>{% endblock %}
|
|
5776
|
+
<a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a>{% block content %}
|
|
5777
|
+
<a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a> {{ block.super }}
|
|
5778
|
+
<a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a> <span class="cm"><!-- Add additional HTML here. --></span>
|
|
5779
|
+
<a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>{% endblock content %}
|
|
5780
|
+
<a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a>{% block javascript %}
|
|
5781
|
+
<a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a> {{ block.super }}
|
|
5782
|
+
<a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a> <span class="cm"><!-- Add additional JavaScript here. --></span>
|
|
5783
|
+
<a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a>{% endblock javascript %}
|
|
5799
5784
|
</code></pre></div>
|
|
5800
5785
|
<p>For another example checkout <a href="https://github.com/nautobot/nautobot/blob/next/examples/example_plugin/example_plugin/templates/example_plugin/example_with_custom_template.html">the template used in example plugin</a> in the GitHub repo.</p>
|
|
5801
5786
|
<h4 id="time_limit"><code>time_limit</code><a class="headerlink" href="#time_limit" title="Permanent link">¶</a></h4>
|
|
@@ -5805,18 +5790,18 @@ This can accept either plain text or Markdown-formatted text. It can also be mul
|
|
|
5805
5790
|
<p>An int or float value, in seconds, which can be used to override the
|
|
5806
5791
|
default <a href="../../user-guide/administration/configuration/optional-settings.html#celery_task_time_limit">hard time limit</a> (10 minutes by default) for a job task to complete.</p>
|
|
5807
5792
|
<p>Unlike the <code>soft_time_limit</code> above, no exceptions are raised when a <code>time_limit</code> is exceeded. The task will just terminate silently:</p>
|
|
5808
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5809
|
-
<a id="__codelineno-
|
|
5810
|
-
<a id="__codelineno-
|
|
5811
|
-
<a id="__codelineno-
|
|
5812
|
-
<a id="__codelineno-
|
|
5813
|
-
<a id="__codelineno-
|
|
5814
|
-
<a id="__codelineno-
|
|
5815
|
-
<a id="__codelineno-
|
|
5816
|
-
<a id="__codelineno-
|
|
5817
|
-
<a id="__codelineno-
|
|
5818
|
-
<a id="__codelineno-
|
|
5819
|
-
<a id="__codelineno-
|
|
5793
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
5794
|
+
<a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a>
|
|
5795
|
+
<a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a><span class="k">class</span> <span class="nc">ExampleJobWithHardTimeLimit</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5796
|
+
<a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
5797
|
+
<a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Hard Time Limit"</span>
|
|
5798
|
+
<a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Set a hard time limit of 10 seconds`"</span>
|
|
5799
|
+
<a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> <span class="n">time_limit</span> <span class="o">=</span> <span class="mi">10</span>
|
|
5800
|
+
<a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a>
|
|
5801
|
+
<a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
5802
|
+
<a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a> <span class="c1"># code which might take longer than 10 seconds to run</span>
|
|
5803
|
+
<a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a> <span class="c1"># this code will fail silently if the time_limit is exceeded</span>
|
|
5804
|
+
<a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a> <span class="n">job_code</span><span class="p">()</span>
|
|
5820
5805
|
</code></pre></div>
|
|
5821
5806
|
<div class="admonition note">
|
|
5822
5807
|
<p class="admonition-title">Note</p>
|
|
@@ -5824,15 +5809,15 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
5824
5809
|
</div>
|
|
5825
5810
|
<h3 id="variables">Variables<a class="headerlink" href="#variables" title="Permanent link">¶</a></h3>
|
|
5826
5811
|
<p>Variables allow your job to accept user input via the Nautobot UI, but they are optional; if your job does not require any user input, there is no need to define any variables. Conversely, if you are making use of user input in your job, you <em>must</em> also implement the <code>run()</code> method, as it is the only entry point to your job that has visibility into the variable values provided by the user.</p>
|
|
5827
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5828
|
-
<a id="__codelineno-
|
|
5829
|
-
<a id="__codelineno-
|
|
5830
|
-
<a id="__codelineno-
|
|
5831
|
-
<a id="__codelineno-
|
|
5832
|
-
<a id="__codelineno-
|
|
5833
|
-
<a id="__codelineno-
|
|
5834
|
-
<a id="__codelineno-
|
|
5835
|
-
<a id="__codelineno-
|
|
5812
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span><span class="p">,</span> <span class="n">IntegerVar</span><span class="p">,</span> <span class="n">ObjectVar</span>
|
|
5813
|
+
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a>
|
|
5814
|
+
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a><span class="k">class</span> <span class="nc">CreateDevices</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5815
|
+
<a id="__codelineno-8-4" name="__codelineno-8-4" href="#__codelineno-8-4"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
5816
|
+
<a id="__codelineno-8-5" name="__codelineno-8-5" href="#__codelineno-8-5"></a> <span class="n">var2</span> <span class="o">=</span> <span class="n">IntegerVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
5817
|
+
<a id="__codelineno-8-6" name="__codelineno-8-6" href="#__codelineno-8-6"></a> <span class="n">var3</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
5818
|
+
<a id="__codelineno-8-7" name="__codelineno-8-7" href="#__codelineno-8-7"></a>
|
|
5819
|
+
<a id="__codelineno-8-8" name="__codelineno-8-8" href="#__codelineno-8-8"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">,</span> <span class="n">var2</span><span class="p">,</span> <span class="n">var3</span><span class="p">):</span>
|
|
5820
|
+
<a id="__codelineno-8-9" name="__codelineno-8-9" href="#__codelineno-8-9"></a> <span class="o">...</span>
|
|
5836
5821
|
</code></pre></div>
|
|
5837
5822
|
<p>The remainder of this section documents the various supported variable types and how to make use of them.</p>
|
|
5838
5823
|
<h4 id="default-variable-options">Default Variable Options<a class="headerlink" href="#default-variable-options" title="Permanent link">¶</a></h4>
|
|
@@ -5854,6 +5839,19 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
5854
5839
|
<p>Note that <code>min_length</code> and <code>max_length</code> can be set to the same number to effect a fixed-length field.</p>
|
|
5855
5840
|
<h4 id="textvar"><code>TextVar</code><a class="headerlink" href="#textvar" title="Permanent link">¶</a></h4>
|
|
5856
5841
|
<p>Arbitrary text of any length. Renders as a multi-line text input field.</p>
|
|
5842
|
+
<h4 id="jsonvar"><code>JSONVar</code><a class="headerlink" href="#jsonvar" title="Permanent link">¶</a></h4>
|
|
5843
|
+
<div class="admonition version-added">
|
|
5844
|
+
<p class="admonition-title">Added in version 2.1.0</p>
|
|
5845
|
+
</div>
|
|
5846
|
+
<p>Accepts JSON-formatted data of any length. Renders as a multi-line text input field. The variable passed to <code>run()</code> method on the job has been serialized to the appropriate Python objects.</p>
|
|
5847
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="k">class</span> <span class="nc">ExampleJSONVarJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5848
|
+
<a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">JSONVar</span><span class="p">()</span>
|
|
5849
|
+
<a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>
|
|
5850
|
+
<a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">):</span>
|
|
5851
|
+
<a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a> <span class="c1"># var1 form data equals '{"key1": "value1"}'</span>
|
|
5852
|
+
<a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"The value of key1 is: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">var1</span><span class="p">[</span><span class="s2">"key1"</span><span class="p">])</span>
|
|
5853
|
+
</code></pre></div>
|
|
5854
|
+
<p>In the above example <code>{"key1": "value1"}</code> is provided to the job form, on submission first the field is validated to be JSON-formatted data then is serialized and passed to the <code>run()</code> method as a dictionary without any need for the job developer to post-process the variable into a Python dictionary.</p>
|
|
5857
5855
|
<h4 id="integervar"><code>IntegerVar</code><a class="headerlink" href="#integervar" title="Permanent link">¶</a></h4>
|
|
5858
5856
|
<p>Stores a numeric integer. Options include:</p>
|
|
5859
5857
|
<ul>
|
|
@@ -5869,14 +5867,14 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
5869
5867
|
<ul>
|
|
5870
5868
|
<li><code>choices</code> - A list of <code>(value, label)</code> tuples representing the available choices. For example:</li>
|
|
5871
5869
|
</ul>
|
|
5872
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5873
|
-
<a id="__codelineno-
|
|
5874
|
-
<a id="__codelineno-
|
|
5875
|
-
<a id="__codelineno-
|
|
5876
|
-
<a id="__codelineno-
|
|
5877
|
-
<a id="__codelineno-
|
|
5878
|
-
<a id="__codelineno-
|
|
5879
|
-
<a id="__codelineno-
|
|
5870
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="n">CHOICES</span> <span class="o">=</span> <span class="p">(</span>
|
|
5871
|
+
<a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a> <span class="p">(</span><span class="s1">'n'</span><span class="p">,</span> <span class="s1">'North'</span><span class="p">),</span>
|
|
5872
|
+
<a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a> <span class="p">(</span><span class="s1">'s'</span><span class="p">,</span> <span class="s1">'South'</span><span class="p">),</span>
|
|
5873
|
+
<a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a> <span class="p">(</span><span class="s1">'e'</span><span class="p">,</span> <span class="s1">'East'</span><span class="p">),</span>
|
|
5874
|
+
<a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a> <span class="p">(</span><span class="s1">'w'</span><span class="p">,</span> <span class="s1">'West'</span><span class="p">)</span>
|
|
5875
|
+
<a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="p">)</span>
|
|
5876
|
+
<a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a>
|
|
5877
|
+
<a id="__codelineno-10-8" name="__codelineno-10-8" href="#__codelineno-10-8"></a><span class="n">direction</span> <span class="o">=</span> <span class="n">ChoiceVar</span><span class="p">(</span><span class="n">choices</span><span class="o">=</span><span class="n">CHOICES</span><span class="p">)</span>
|
|
5880
5878
|
</code></pre></div>
|
|
5881
5879
|
<p>In the example above, selecting the choice labeled "North" will submit the value <code>n</code>.</p>
|
|
5882
5880
|
<h4 id="multichoicevar"><code>MultiChoiceVar</code><a class="headerlink" href="#multichoicevar" title="Permanent link">¶</a></h4>
|
|
@@ -5890,33 +5888,33 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
5890
5888
|
<li><code>null_option</code> - A label representing a "null" or empty choice (optional)</li>
|
|
5891
5889
|
</ul>
|
|
5892
5890
|
<p>The <code>display_field</code> argument is useful in cases where using the <code>display</code> API field is not desired for referencing the object. For example, when displaying a list of IP Addresses, you might want to use the <code>dns_name</code> field:</p>
|
|
5893
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5894
|
-
<a id="__codelineno-
|
|
5895
|
-
<a id="__codelineno-
|
|
5896
|
-
<a id="__codelineno-
|
|
5891
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="n">device_type</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
5892
|
+
<a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">IPAddress</span><span class="p">,</span>
|
|
5893
|
+
<a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a> <span class="n">display_field</span><span class="o">=</span><span class="s2">"dns_name"</span><span class="p">,</span>
|
|
5894
|
+
<a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="p">)</span>
|
|
5897
5895
|
</code></pre></div>
|
|
5898
5896
|
<p>To limit the selections available within the list, additional query parameters can be passed as the <code>query_params</code> dictionary. For example, to show only devices with an "active" status:</p>
|
|
5899
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5900
|
-
<a id="__codelineno-
|
|
5901
|
-
<a id="__codelineno-
|
|
5902
|
-
<a id="__codelineno-
|
|
5903
|
-
<a id="__codelineno-
|
|
5904
|
-
<a id="__codelineno-
|
|
5897
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="n">device</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
5898
|
+
<a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">Device</span><span class="p">,</span>
|
|
5899
|
+
<a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span>
|
|
5900
|
+
<a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a> <span class="s1">'status'</span><span class="p">:</span> <span class="s1">'active'</span>
|
|
5901
|
+
<a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a> <span class="p">}</span>
|
|
5902
|
+
<a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="p">)</span>
|
|
5905
5903
|
</code></pre></div>
|
|
5906
5904
|
<p>Multiple values can be specified by assigning a list to the dictionary key. It is also possible to reference the value of other fields in the form by prepending a dollar sign (<code>$</code>) to the variable's name. The keys you can use in this dictionary are the same ones that are available in the REST API - as an example it is also possible to filter the <code>Location</code> <code>ObjectVar</code> for its <code>location_type</code> and <code>tenant_group</code>.</p>
|
|
5907
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5908
|
-
<a id="__codelineno-
|
|
5909
|
-
<a id="__codelineno-
|
|
5910
|
-
<a id="__codelineno-
|
|
5911
|
-
<a id="__codelineno-
|
|
5912
|
-
<a id="__codelineno-
|
|
5913
|
-
<a id="__codelineno-
|
|
5914
|
-
<a id="__codelineno-
|
|
5915
|
-
<a id="__codelineno-
|
|
5916
|
-
<a id="__codelineno-
|
|
5917
|
-
<a id="__codelineno-
|
|
5918
|
-
<a id="__codelineno-
|
|
5919
|
-
<a id="__codelineno-
|
|
5905
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="n">location_type</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
5906
|
+
<a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a> <span class="n">model</span><span class="o">=</span><span class="n">LocationType</span>
|
|
5907
|
+
<a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="p">)</span>
|
|
5908
|
+
<a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a><span class="n">tenant_group</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
5909
|
+
<a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a> <span class="n">model</span><span class="o">=</span><span class="n">TenantGroup</span>
|
|
5910
|
+
<a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a><span class="p">)</span>
|
|
5911
|
+
<a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="n">location</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
5912
|
+
<a id="__codelineno-13-8" name="__codelineno-13-8" href="#__codelineno-13-8"></a> <span class="n">model</span><span class="o">=</span><span class="n">Location</span><span class="p">,</span>
|
|
5913
|
+
<a id="__codelineno-13-9" name="__codelineno-13-9" href="#__codelineno-13-9"></a> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span>
|
|
5914
|
+
<a id="__codelineno-13-10" name="__codelineno-13-10" href="#__codelineno-13-10"></a> <span class="s2">"location_type"</span><span class="p">:</span> <span class="s2">"$location_type"</span><span class="p">,</span>
|
|
5915
|
+
<a id="__codelineno-13-11" name="__codelineno-13-11" href="#__codelineno-13-11"></a> <span class="s2">"tenant_group"</span><span class="p">:</span> <span class="s2">"$tenant_group"</span>
|
|
5916
|
+
<a id="__codelineno-13-12" name="__codelineno-13-12" href="#__codelineno-13-12"></a> <span class="p">}</span>
|
|
5917
|
+
<a id="__codelineno-13-13" name="__codelineno-13-13" href="#__codelineno-13-13"></a><span class="p">)</span>
|
|
5920
5918
|
</code></pre></div>
|
|
5921
5919
|
<h4 id="multiobjectvar"><code>MultiObjectVar</code><a class="headerlink" href="#multiobjectvar" title="Permanent link">¶</a></h4>
|
|
5922
5920
|
<p>Similar to <code>ObjectVar</code>, but allows for the selection of multiple objects.</p>
|
|
@@ -5934,15 +5932,15 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
5934
5932
|
</ul>
|
|
5935
5933
|
<h3 id="the-run-method">The <code>run()</code> Method<a class="headerlink" href="#the-run-method" title="Permanent link">¶</a></h3>
|
|
5936
5934
|
<p>The <code>run()</code> method must be implemented. After the <code>self</code> argument, it should accept keyword arguments for any variables defined on the job:</p>
|
|
5937
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5938
|
-
<a id="__codelineno-
|
|
5939
|
-
<a id="__codelineno-
|
|
5940
|
-
<a id="__codelineno-
|
|
5941
|
-
<a id="__codelineno-
|
|
5942
|
-
<a id="__codelineno-
|
|
5943
|
-
<a id="__codelineno-
|
|
5944
|
-
<a id="__codelineno-
|
|
5945
|
-
<a id="__codelineno-
|
|
5935
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span><span class="p">,</span> <span class="n">IntegerVar</span><span class="p">,</span> <span class="n">ObjectVar</span>
|
|
5936
|
+
<a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a>
|
|
5937
|
+
<a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a><span class="k">class</span> <span class="nc">CreateDevices</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5938
|
+
<a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
5939
|
+
<a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a> <span class="n">var2</span> <span class="o">=</span> <span class="n">IntegerVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
5940
|
+
<a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a> <span class="n">var3</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
5941
|
+
<a id="__codelineno-14-7" name="__codelineno-14-7" href="#__codelineno-14-7"></a>
|
|
5942
|
+
<a id="__codelineno-14-8" name="__codelineno-14-8" href="#__codelineno-14-8"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">,</span> <span class="n">var2</span><span class="p">,</span> <span class="n">var3</span><span class="p">):</span>
|
|
5943
|
+
<a id="__codelineno-14-9" name="__codelineno-14-9" href="#__codelineno-14-9"></a> <span class="o">...</span>
|
|
5946
5944
|
</code></pre></div>
|
|
5947
5945
|
<p>Again, defining user variables is totally optional; you may create a job with a <code>run()</code> method with only the <code>self</code> argument if no user input is needed.</p>
|
|
5948
5946
|
<div class="admonition warning">
|
|
@@ -5966,21 +5964,21 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
5966
5964
|
<p>An optional <code>grouping</code> and/or <code>object</code> may be provided in log messages by passing them in the log function call's <code>extra</code> kwarg. If a <code>grouping</code> is not provided it will default to the function name that logged the message. The <code>object</code> will default to <code>None</code>.</p>
|
|
5967
5965
|
<div class="admonition example">
|
|
5968
5966
|
<p class="admonition-title">Example</p>
|
|
5969
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5970
|
-
<a id="__codelineno-
|
|
5971
|
-
<a id="__codelineno-
|
|
5972
|
-
<a id="__codelineno-
|
|
5973
|
-
<a id="__codelineno-
|
|
5967
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
5968
|
+
<a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a>
|
|
5969
|
+
<a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5970
|
+
<a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
5971
|
+
<a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"This job is running!"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"grouping"</span><span class="p">:</span> <span class="s2">"myjobisrunning"</span><span class="p">,</span> <span class="s2">"object"</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">job_result</span><span class="p">})</span>
|
|
5974
5972
|
</code></pre></div>
|
|
5975
5973
|
</div>
|
|
5976
5974
|
<p>To skip writing a log entry to the database, set the <code>skip_db_logging</code> key in the "extra" kwarg to <code>True</code> when calling the log function. The output will still be written to the console.</p>
|
|
5977
5975
|
<div class="admonition example">
|
|
5978
5976
|
<p class="admonition-title">Example</p>
|
|
5979
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
5980
|
-
<a id="__codelineno-
|
|
5981
|
-
<a id="__codelineno-
|
|
5982
|
-
<a id="__codelineno-
|
|
5983
|
-
<a id="__codelineno-
|
|
5977
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
5978
|
+
<a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>
|
|
5979
|
+
<a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
5980
|
+
<a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
5981
|
+
<a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"This job is running!"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"skip_db_logging"</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
|
|
5984
5982
|
</code></pre></div>
|
|
5985
5983
|
</div>
|
|
5986
5984
|
<p>Markdown rendering is supported for log messages.</p>
|
|
@@ -6001,26 +5999,27 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
6001
5999
|
<p class="admonition-title">Added in version 2.1.0</p>
|
|
6002
6000
|
</div>
|
|
6003
6001
|
<p>A Job can create files that will be saved and can later be downloaded by a user. (The specifics of how and where these files are stored will depend on your system's <a href="../../user-guide/administration/configuration/optional-settings.html#job_file_io_storage"><code>JOB_FILE_IO_STORAGE</code></a> configuration.) To do so, use the <code>Job.create_file(filename, content)</code> method:</p>
|
|
6004
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6005
|
-
<a id="__codelineno-
|
|
6006
|
-
<a id="__codelineno-
|
|
6007
|
-
<a id="__codelineno-
|
|
6008
|
-
<a id="__codelineno-
|
|
6009
|
-
<a id="__codelineno-
|
|
6002
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="kn">from</span> <span class="nn">nautobot.extras.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
6003
|
+
<a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>
|
|
6004
|
+
<a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
6005
|
+
<a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
6006
|
+
<a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a> <span class="bp">self</span><span class="o">.</span><span class="n">create_file</span><span class="p">(</span><span class="s2">"greeting.txt"</span><span class="p">,</span> <span class="s2">"Hello world!"</span><span class="p">)</span>
|
|
6007
|
+
<a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">create_file</span><span class="p">(</span><span class="s2">"farewell.txt"</span><span class="p">,</span> <span class="sa">b</span><span class="s2">"Goodbye for now!"</span><span class="p">)</span> <span class="c1"># content can be a str or bytes</span>
|
|
6010
6008
|
</code></pre></div>
|
|
6011
6009
|
<p>The above Job when run will create two files, "greeting.txt" and "farewell.txt", that will be made available for download from the JobResult detail view's "Additional Data" tab and via the REST API. These files will persist indefinitely, but can automatically be deleted if the JobResult itself is deleted; they can also be deleted manually by an administrator via the "File Proxies" link in the Admin UI.</p>
|
|
6010
|
+
<p>The maximum size of any single created file (or in other words, the maximum number of bytes that can be passed to <code>self.create_file()</code>) is controlled by the <a href="../../user-guide/administration/configuration/optional-settings.html#job_create_file_max_size"><code>JOB_CREATE_FILE_MAX_SIZE</code></a> system setting. A <code>ValueError</code> exception will be raised if <code>create_file()</code> is called with an overly large <code>content</code> value.</p>
|
|
6012
6011
|
<h3 id="marking-a-job-as-failed">Marking a Job as Failed<a class="headerlink" href="#marking-a-job-as-failed" title="Permanent link">¶</a></h3>
|
|
6013
6012
|
<p>To mark a job as failed, raise an exception from within the <code>run()</code> method. The exception message will be logged to the traceback of the job result. The job result status will be set to <code>failed</code>. To output a job log message you can use the <code>self.logger.error()</code> method.</p>
|
|
6014
6013
|
<p>As an example, the following job will fail if the user does not put the word "Taco" in <code>var1</code>:</p>
|
|
6015
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6016
|
-
<a id="__codelineno-
|
|
6017
|
-
<a id="__codelineno-
|
|
6018
|
-
<a id="__codelineno-
|
|
6019
|
-
<a id="__codelineno-
|
|
6020
|
-
<a id="__codelineno-
|
|
6021
|
-
<a id="__codelineno-
|
|
6022
|
-
<a id="__codelineno-
|
|
6023
|
-
<a id="__codelineno-
|
|
6014
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span>
|
|
6015
|
+
<a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>
|
|
6016
|
+
<a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="k">class</span> <span class="nc">MyJob</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
6017
|
+
<a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a> <span class="n">var1</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
|
|
6018
|
+
<a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a>
|
|
6019
|
+
<a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">var1</span><span class="p">):</span>
|
|
6020
|
+
<a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a> <span class="k">if</span> <span class="n">var1</span> <span class="o">!=</span> <span class="s2">"Taco"</span><span class="p">:</span>
|
|
6021
|
+
<a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"var1 must be 'Taco'"</span><span class="p">)</span>
|
|
6022
|
+
<a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Argument input validation failed."</span><span class="p">)</span>
|
|
6024
6023
|
</code></pre></div>
|
|
6025
6024
|
<h3 id="accessing-user-and-job-result">Accessing User and Job Result<a class="headerlink" href="#accessing-user-and-job-result" title="Permanent link">¶</a></h3>
|
|
6026
6025
|
<div class="admonition version-changed">
|
|
@@ -6028,9 +6027,9 @@ default <a href="../../user-guide/administration/configuration/optional-settings
|
|
|
6028
6027
|
<p>The <code>request</code> property has been changed to a Celery request instead of a Django web request and no longer includes the information from the web request that initiated the Job. The <code>user</code> object is now available as <code>self.user</code> instead of <code>self.request.user</code>.</p>
|
|
6029
6028
|
</div>
|
|
6030
6029
|
<p>The user that initiated the job and the job result associated to the job can be accessed through properties on the job class:</p>
|
|
6031
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6032
|
-
<a id="__codelineno-
|
|
6033
|
-
<a id="__codelineno-
|
|
6030
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="n">username</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
|
|
6031
|
+
<a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="n">job_result_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">job_result</span><span class="o">.</span><span class="n">id</span>
|
|
6032
|
+
<a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a><span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Job </span><span class="si">%s</span><span class="s2"> initiated by user </span><span class="si">%s</span><span class="s2"> is running."</span><span class="p">,</span> <span class="n">job_result_id</span><span class="p">,</span> <span class="n">username</span><span class="p">)</span>
|
|
6034
6033
|
</code></pre></div>
|
|
6035
6034
|
<h3 id="reading-data-from-files">Reading Data from Files<a class="headerlink" href="#reading-data-from-files" title="Permanent link">¶</a></h3>
|
|
6036
6035
|
<p>The <code>Job</code> class provides two convenience methods for reading data from files:</p>
|
|
@@ -6051,21 +6050,21 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
6051
6050
|
<p>Because of the way <code>run_job_for_testing</code> and more specifically Celery tasks work, which is somewhat complex behind the scenes, you need to inherit from <code>nautobot.apps.testing.TransactionTestCase</code> instead of <code>django.test.TestCase</code> (Refer to the <a href="https://docs.djangoproject.com/en/stable/topics/testing/tools/#provided-test-case-classes">Django documentation</a> if you're interested in the differences between these classes - <code>TransactionTestCase</code> from Nautobot is a small wrapper around Django's <code>TransactionTestCase</code>).</p>
|
|
6052
6051
|
<p>When using <code>TransactionTestCase</code> (whether from Django or from Nautobot) each tests runs on a completely empty database. Furthermore, Nautobot requires new jobs to be enabled before they can run. Therefore, we need to make sure the job is enabled before each run which <code>run_job_for_testing</code> handles for us.</p>
|
|
6053
6052
|
<p>A simple example of a Job test case might look like the following:</p>
|
|
6054
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6055
|
-
<a id="__codelineno-
|
|
6056
|
-
<a id="__codelineno-
|
|
6057
|
-
<a id="__codelineno-
|
|
6058
|
-
<a id="__codelineno-
|
|
6059
|
-
<a id="__codelineno-
|
|
6060
|
-
<a id="__codelineno-
|
|
6061
|
-
<a id="__codelineno-
|
|
6062
|
-
<a id="__codelineno-
|
|
6063
|
-
<a id="__codelineno-
|
|
6064
|
-
<a id="__codelineno-
|
|
6065
|
-
<a id="__codelineno-
|
|
6066
|
-
<a id="__codelineno-
|
|
6067
|
-
<a id="__codelineno-
|
|
6068
|
-
<a id="__codelineno-
|
|
6053
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.testing</span> <span class="kn">import</span> <span class="n">run_job_for_testing</span><span class="p">,</span> <span class="n">TransactionTestCase</span>
|
|
6054
|
+
<a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a><span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">JobLogEntry</span>
|
|
6055
|
+
<a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a>
|
|
6056
|
+
<a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a>
|
|
6057
|
+
<a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a><span class="k">class</span> <span class="nc">MyJobTestCase</span><span class="p">(</span><span class="n">TransactionTestCase</span><span class="p">):</span>
|
|
6058
|
+
<a id="__codelineno-20-6" name="__codelineno-20-6" href="#__codelineno-20-6"></a> <span class="k">def</span> <span class="nf">test_my_job</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
6059
|
+
<a id="__codelineno-20-7" name="__codelineno-20-7" href="#__codelineno-20-7"></a> <span class="c1"># Testing of Job "MyJob" in file "my_job_file.py" in $JOBS_ROOT</span>
|
|
6060
|
+
<a id="__codelineno-20-8" name="__codelineno-20-8" href="#__codelineno-20-8"></a> <span class="n">job</span> <span class="o">=</span> <span class="n">Job</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">job_class_name</span><span class="o">=</span><span class="s2">"MyJob"</span><span class="p">,</span> <span class="n">module_name</span><span class="o">=</span><span class="s2">"my_job_file"</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="s2">"local"</span><span class="p">)</span>
|
|
6061
|
+
<a id="__codelineno-20-9" name="__codelineno-20-9" href="#__codelineno-20-9"></a> <span class="c1"># or, job = Job.objects.get_for_class_path("local/my_job_file/MyJob")</span>
|
|
6062
|
+
<a id="__codelineno-20-10" name="__codelineno-20-10" href="#__codelineno-20-10"></a> <span class="n">job_result</span> <span class="o">=</span> <span class="n">run_job_for_testing</span><span class="p">(</span><span class="n">job</span><span class="p">,</span> <span class="n">var1</span><span class="o">=</span><span class="s2">"abc"</span><span class="p">,</span> <span class="n">var2</span><span class="o">=</span><span class="mi">123</span><span class="p">)</span>
|
|
6063
|
+
<a id="__codelineno-20-11" name="__codelineno-20-11" href="#__codelineno-20-11"></a>
|
|
6064
|
+
<a id="__codelineno-20-12" name="__codelineno-20-12" href="#__codelineno-20-12"></a> <span class="c1"># Inspect the logs created by running the job</span>
|
|
6065
|
+
<a id="__codelineno-20-13" name="__codelineno-20-13" href="#__codelineno-20-13"></a> <span class="n">log_entries</span> <span class="o">=</span> <span class="n">JobLogEntry</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">job_result</span><span class="o">=</span><span class="n">job_result</span><span class="p">)</span>
|
|
6066
|
+
<a id="__codelineno-20-14" name="__codelineno-20-14" href="#__codelineno-20-14"></a> <span class="k">for</span> <span class="n">log_entry</span> <span class="ow">in</span> <span class="n">log_entries</span><span class="p">:</span>
|
|
6067
|
+
<a id="__codelineno-20-15" name="__codelineno-20-15" href="#__codelineno-20-15"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">log_entry</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="s2">"..."</span><span class="p">)</span>
|
|
6069
6068
|
</code></pre></div>
|
|
6070
6069
|
<div class="admonition tip">
|
|
6071
6070
|
<p class="admonition-title">Tip</p>
|
|
@@ -6083,10 +6082,10 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
6083
6082
|
</div>
|
|
6084
6083
|
<h3 id="reading-profiling-reports">Reading profiling reports<a class="headerlink" href="#reading-profiling-reports" title="Permanent link">¶</a></h3>
|
|
6085
6084
|
<p>A full description on how to deal with the output of <code>cProfile</code> can be found in the <a href="https://docs.python.org/3/library/profile.html#instant-user-s-manual">Instant User's Manual</a>, but here is something to get you started:</p>
|
|
6086
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6087
|
-
<a id="__codelineno-
|
|
6088
|
-
<a id="__codelineno-
|
|
6089
|
-
<a id="__codelineno-
|
|
6085
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="kn">import</span> <span class="nn">pstats</span>
|
|
6086
|
+
<a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a><span class="n">job_result_uuid</span> <span class="o">=</span> <span class="s2">"66b70231-002f-412b-8cc4-1cc9609c2c9b"</span>
|
|
6087
|
+
<a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="n">stats</span> <span class="o">=</span> <span class="n">pstats</span><span class="o">.</span><span class="n">Stats</span><span class="p">(</span><span class="sa">f</span><span class="s2">"/tmp/job-result-</span><span class="si">{</span><span class="n">job_result_uuid</span><span class="si">}</span><span class="s2">.pstats"</span><span class="p">)</span>
|
|
6088
|
+
<a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a><span class="n">stats</span><span class="o">.</span><span class="n">sort_stats</span><span class="p">(</span><span class="n">pstats</span><span class="o">.</span><span class="n">SortKey</span><span class="o">.</span><span class="n">CUMULATIVE</span><span class="p">)</span><span class="o">.</span><span class="n">print_stats</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
|
|
6090
6089
|
</code></pre></div>
|
|
6091
6090
|
<p>This will print the 10 functions that the job execution spent the most time in - adapt this to your needs!</p>
|
|
6092
6091
|
<h2 id="example-jobs">Example Jobs<a class="headerlink" href="#example-jobs" title="Permanent link">¶</a></h2>
|
|
@@ -6098,119 +6097,119 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
6098
6097
|
<li>The number of access switches to create</li>
|
|
6099
6098
|
</ul>
|
|
6100
6099
|
<p>These variables are presented as a web form to be completed by the user. Once submitted, the job's <code>run()</code> method is called to create the appropriate objects, and it returns simple CSV output to the user summarizing the created objects.</p>
|
|
6101
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6102
|
-
<a id="__codelineno-
|
|
6103
|
-
<a id="__codelineno-
|
|
6104
|
-
<a id="__codelineno-
|
|
6105
|
-
<a id="__codelineno-
|
|
6106
|
-
<a id="__codelineno-
|
|
6107
|
-
<a id="__codelineno-
|
|
6108
|
-
<a id="__codelineno-
|
|
6109
|
-
<a id="__codelineno-
|
|
6110
|
-
<a id="__codelineno-
|
|
6111
|
-
<a id="__codelineno-
|
|
6112
|
-
<a id="__codelineno-
|
|
6113
|
-
<a id="__codelineno-
|
|
6114
|
-
<a id="__codelineno-
|
|
6115
|
-
<a id="__codelineno-
|
|
6116
|
-
<a id="__codelineno-
|
|
6117
|
-
<a id="__codelineno-
|
|
6118
|
-
<a id="__codelineno-
|
|
6119
|
-
<a id="__codelineno-
|
|
6120
|
-
<a id="__codelineno-
|
|
6121
|
-
<a id="__codelineno-
|
|
6122
|
-
<a id="__codelineno-
|
|
6123
|
-
<a id="__codelineno-
|
|
6124
|
-
<a id="__codelineno-
|
|
6125
|
-
<a id="__codelineno-
|
|
6126
|
-
<a id="__codelineno-
|
|
6127
|
-
<a id="__codelineno-
|
|
6128
|
-
<a id="__codelineno-
|
|
6129
|
-
<a id="__codelineno-
|
|
6130
|
-
<a id="__codelineno-
|
|
6131
|
-
<a id="__codelineno-
|
|
6132
|
-
<a id="__codelineno-
|
|
6133
|
-
<a id="__codelineno-
|
|
6134
|
-
<a id="__codelineno-
|
|
6135
|
-
<a id="__codelineno-
|
|
6136
|
-
<a id="__codelineno-
|
|
6137
|
-
<a id="__codelineno-
|
|
6138
|
-
<a id="__codelineno-
|
|
6139
|
-
<a id="__codelineno-
|
|
6140
|
-
<a id="__codelineno-
|
|
6141
|
-
<a id="__codelineno-
|
|
6142
|
-
<a id="__codelineno-
|
|
6143
|
-
<a id="__codelineno-
|
|
6144
|
-
<a id="__codelineno-
|
|
6145
|
-
<a id="__codelineno-
|
|
6146
|
-
<a id="__codelineno-
|
|
6147
|
-
<a id="__codelineno-
|
|
6148
|
-
<a id="__codelineno-
|
|
6149
|
-
<a id="__codelineno-
|
|
6150
|
-
<a id="__codelineno-
|
|
6151
|
-
<a id="__codelineno-
|
|
6152
|
-
<a id="__codelineno-
|
|
6153
|
-
<a id="__codelineno-
|
|
6154
|
-
<a id="__codelineno-
|
|
6155
|
-
<a id="__codelineno-
|
|
6100
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="kn">from</span> <span class="nn">django.contrib.contenttypes.models</span> <span class="kn">import</span> <span class="n">ContentType</span>
|
|
6101
|
+
<a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a>
|
|
6102
|
+
<a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span><span class="p">,</span> <span class="n">StringVar</span><span class="p">,</span> <span class="n">IntegerVar</span><span class="p">,</span> <span class="n">ObjectVar</span>
|
|
6103
|
+
<a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">Location</span><span class="p">,</span> <span class="n">LocationType</span><span class="p">,</span> <span class="n">Device</span><span class="p">,</span> <span class="n">Manufacturer</span><span class="p">,</span> <span class="n">DeviceType</span>
|
|
6104
|
+
<a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a><span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">Status</span><span class="p">,</span> <span class="n">Role</span>
|
|
6105
|
+
<a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a>
|
|
6106
|
+
<a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a>
|
|
6107
|
+
<a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a><span class="k">class</span> <span class="nc">NewBranch</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
6108
|
+
<a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
6109
|
+
<a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"New Branch"</span>
|
|
6110
|
+
<a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Provision a new branch location"</span>
|
|
6111
|
+
<a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a> <span class="n">field_order</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"location_name"</span><span class="p">,</span> <span class="s2">"switch_count"</span><span class="p">,</span> <span class="s2">"switch_model"</span><span class="p">]</span>
|
|
6112
|
+
<a id="__codelineno-22-13" name="__codelineno-22-13" href="#__codelineno-22-13"></a>
|
|
6113
|
+
<a id="__codelineno-22-14" name="__codelineno-22-14" href="#__codelineno-22-14"></a> <span class="n">location_name</span> <span class="o">=</span> <span class="n">StringVar</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Name of the new location"</span><span class="p">)</span>
|
|
6114
|
+
<a id="__codelineno-22-15" name="__codelineno-22-15" href="#__codelineno-22-15"></a> <span class="n">switch_count</span> <span class="o">=</span> <span class="n">IntegerVar</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s2">"Number of access switches to create"</span><span class="p">)</span>
|
|
6115
|
+
<a id="__codelineno-22-16" name="__codelineno-22-16" href="#__codelineno-22-16"></a> <span class="n">manufacturer</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="n">Manufacturer</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
6116
|
+
<a id="__codelineno-22-17" name="__codelineno-22-17" href="#__codelineno-22-17"></a> <span class="n">switch_model</span> <span class="o">=</span> <span class="n">ObjectVar</span><span class="p">(</span>
|
|
6117
|
+
<a id="__codelineno-22-18" name="__codelineno-22-18" href="#__codelineno-22-18"></a> <span class="n">description</span><span class="o">=</span><span class="s2">"Access switch model"</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="n">DeviceType</span><span class="p">,</span> <span class="n">query_params</span><span class="o">=</span><span class="p">{</span><span class="s2">"manufacturer_id"</span><span class="p">:</span> <span class="s2">"$manufacturer"</span><span class="p">}</span>
|
|
6118
|
+
<a id="__codelineno-22-19" name="__codelineno-22-19" href="#__codelineno-22-19"></a> <span class="p">)</span>
|
|
6119
|
+
<a id="__codelineno-22-20" name="__codelineno-22-20" href="#__codelineno-22-20"></a>
|
|
6120
|
+
<a id="__codelineno-22-21" name="__codelineno-22-21" href="#__codelineno-22-21"></a> <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">location_name</span><span class="p">,</span> <span class="n">switch_count</span><span class="p">,</span> <span class="n">switch_model</span><span class="p">):</span>
|
|
6121
|
+
<a id="__codelineno-22-22" name="__codelineno-22-22" href="#__codelineno-22-22"></a> <span class="n">STATUS_PLANNED</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Planned"</span><span class="p">)</span>
|
|
6122
|
+
<a id="__codelineno-22-23" name="__codelineno-22-23" href="#__codelineno-22-23"></a>
|
|
6123
|
+
<a id="__codelineno-22-24" name="__codelineno-22-24" href="#__codelineno-22-24"></a> <span class="c1"># Create the new location</span>
|
|
6124
|
+
<a id="__codelineno-22-25" name="__codelineno-22-25" href="#__codelineno-22-25"></a> <span class="n">root_type</span> <span class="o">=</span> <span class="n">LocationType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Campus"</span><span class="p">)</span>
|
|
6125
|
+
<a id="__codelineno-22-26" name="__codelineno-22-26" href="#__codelineno-22-26"></a> <span class="n">location</span> <span class="o">=</span> <span class="n">Location</span><span class="p">(</span>
|
|
6126
|
+
<a id="__codelineno-22-27" name="__codelineno-22-27" href="#__codelineno-22-27"></a> <span class="n">name</span><span class="o">=</span><span class="n">location_name</span><span class="p">,</span>
|
|
6127
|
+
<a id="__codelineno-22-28" name="__codelineno-22-28" href="#__codelineno-22-28"></a> <span class="n">location_type</span><span class="o">=</span><span class="n">root_type</span><span class="p">,</span>
|
|
6128
|
+
<a id="__codelineno-22-29" name="__codelineno-22-29" href="#__codelineno-22-29"></a> <span class="n">status</span><span class="o">=</span><span class="n">STATUS_PLANNED</span><span class="p">,</span>
|
|
6129
|
+
<a id="__codelineno-22-30" name="__codelineno-22-30" href="#__codelineno-22-30"></a> <span class="p">)</span>
|
|
6130
|
+
<a id="__codelineno-22-31" name="__codelineno-22-31" href="#__codelineno-22-31"></a> <span class="n">location</span><span class="o">.</span><span class="n">validated_save</span><span class="p">()</span>
|
|
6131
|
+
<a id="__codelineno-22-32" name="__codelineno-22-32" href="#__codelineno-22-32"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Created new location"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">location</span><span class="p">})</span>
|
|
6132
|
+
<a id="__codelineno-22-33" name="__codelineno-22-33" href="#__codelineno-22-33"></a>
|
|
6133
|
+
<a id="__codelineno-22-34" name="__codelineno-22-34" href="#__codelineno-22-34"></a> <span class="c1"># Create access switches</span>
|
|
6134
|
+
<a id="__codelineno-22-35" name="__codelineno-22-35" href="#__codelineno-22-35"></a> <span class="n">device_ct</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="n">Device</span><span class="p">)</span>
|
|
6135
|
+
<a id="__codelineno-22-36" name="__codelineno-22-36" href="#__codelineno-22-36"></a> <span class="n">switch_role</span> <span class="o">=</span> <span class="n">Role</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s2">"Access Switch"</span><span class="p">)</span>
|
|
6136
|
+
<a id="__codelineno-22-37" name="__codelineno-22-37" href="#__codelineno-22-37"></a> <span class="n">switch_role</span><span class="o">.</span><span class="n">content_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">device_ct</span><span class="p">)</span>
|
|
6137
|
+
<a id="__codelineno-22-38" name="__codelineno-22-38" href="#__codelineno-22-38"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">switch_count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
|
|
6138
|
+
<a id="__codelineno-22-39" name="__codelineno-22-39" href="#__codelineno-22-39"></a> <span class="n">switch</span> <span class="o">=</span> <span class="n">Device</span><span class="p">(</span>
|
|
6139
|
+
<a id="__codelineno-22-40" name="__codelineno-22-40" href="#__codelineno-22-40"></a> <span class="n">device_type</span><span class="o">=</span><span class="n">switch_model</span><span class="p">,</span>
|
|
6140
|
+
<a id="__codelineno-22-41" name="__codelineno-22-41" href="#__codelineno-22-41"></a> <span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">location</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">-switch</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span>
|
|
6141
|
+
<a id="__codelineno-22-42" name="__codelineno-22-42" href="#__codelineno-22-42"></a> <span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">,</span>
|
|
6142
|
+
<a id="__codelineno-22-43" name="__codelineno-22-43" href="#__codelineno-22-43"></a> <span class="n">status</span><span class="o">=</span><span class="n">STATUS_PLANNED</span><span class="p">,</span>
|
|
6143
|
+
<a id="__codelineno-22-44" name="__codelineno-22-44" href="#__codelineno-22-44"></a> <span class="n">role</span><span class="o">=</span><span class="n">switch_role</span><span class="p">,</span>
|
|
6144
|
+
<a id="__codelineno-22-45" name="__codelineno-22-45" href="#__codelineno-22-45"></a> <span class="p">)</span>
|
|
6145
|
+
<a id="__codelineno-22-46" name="__codelineno-22-46" href="#__codelineno-22-46"></a> <span class="n">switch</span><span class="o">.</span><span class="n">validated_save</span><span class="p">()</span>
|
|
6146
|
+
<a id="__codelineno-22-47" name="__codelineno-22-47" href="#__codelineno-22-47"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Created new switch"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">switch</span><span class="p">})</span>
|
|
6147
|
+
<a id="__codelineno-22-48" name="__codelineno-22-48" href="#__codelineno-22-48"></a>
|
|
6148
|
+
<a id="__codelineno-22-49" name="__codelineno-22-49" href="#__codelineno-22-49"></a> <span class="c1"># Generate a CSV table of new devices</span>
|
|
6149
|
+
<a id="__codelineno-22-50" name="__codelineno-22-50" href="#__codelineno-22-50"></a> <span class="n">output</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"name,make,model"</span><span class="p">]</span>
|
|
6150
|
+
<a id="__codelineno-22-51" name="__codelineno-22-51" href="#__codelineno-22-51"></a> <span class="k">for</span> <span class="n">switch</span> <span class="ow">in</span> <span class="n">Device</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">location</span><span class="o">=</span><span class="n">location</span><span class="p">):</span>
|
|
6151
|
+
<a id="__codelineno-22-52" name="__codelineno-22-52" href="#__codelineno-22-52"></a> <span class="n">attrs</span> <span class="o">=</span> <span class="p">[</span><span class="n">switch</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">switch</span><span class="o">.</span><span class="n">device_type</span><span class="o">.</span><span class="n">manufacturer</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">switch</span><span class="o">.</span><span class="n">device_type</span><span class="o">.</span><span class="n">model</span><span class="p">]</span>
|
|
6152
|
+
<a id="__codelineno-22-53" name="__codelineno-22-53" href="#__codelineno-22-53"></a> <span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">attrs</span><span class="p">))</span>
|
|
6153
|
+
<a id="__codelineno-22-54" name="__codelineno-22-54" href="#__codelineno-22-54"></a>
|
|
6154
|
+
<a id="__codelineno-22-55" name="__codelineno-22-55" href="#__codelineno-22-55"></a> <span class="k">return</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
|
|
6156
6155
|
</code></pre></div>
|
|
6157
6156
|
<h3 id="device-validation">Device validation<a class="headerlink" href="#device-validation" title="Permanent link">¶</a></h3>
|
|
6158
6157
|
<p>A job to perform various validation of Device data in Nautobot. As this job does not require any user input, it does not define any variables, nor does it implement a <code>run()</code> method.</p>
|
|
6159
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6160
|
-
<a id="__codelineno-
|
|
6161
|
-
<a id="__codelineno-
|
|
6162
|
-
<a id="__codelineno-
|
|
6163
|
-
<a id="__codelineno-
|
|
6164
|
-
<a id="__codelineno-
|
|
6165
|
-
<a id="__codelineno-
|
|
6166
|
-
<a id="__codelineno-
|
|
6167
|
-
<a id="__codelineno-
|
|
6168
|
-
<a id="__codelineno-
|
|
6169
|
-
<a id="__codelineno-
|
|
6170
|
-
<a id="__codelineno-
|
|
6171
|
-
<a id="__codelineno-
|
|
6172
|
-
<a id="__codelineno-
|
|
6173
|
-
<a id="__codelineno-
|
|
6174
|
-
<a id="__codelineno-
|
|
6175
|
-
<a id="__codelineno-
|
|
6176
|
-
<a id="__codelineno-
|
|
6177
|
-
<a id="__codelineno-
|
|
6178
|
-
<a id="__codelineno-
|
|
6179
|
-
<a id="__codelineno-
|
|
6180
|
-
<a id="__codelineno-
|
|
6181
|
-
<a id="__codelineno-
|
|
6182
|
-
<a id="__codelineno-
|
|
6183
|
-
<a id="__codelineno-
|
|
6184
|
-
<a id="__codelineno-
|
|
6185
|
-
<a id="__codelineno-
|
|
6186
|
-
<a id="__codelineno-
|
|
6187
|
-
<a id="__codelineno-
|
|
6188
|
-
<a id="__codelineno-
|
|
6189
|
-
<a id="__codelineno-
|
|
6190
|
-
<a id="__codelineno-
|
|
6191
|
-
<a id="__codelineno-
|
|
6192
|
-
<a id="__codelineno-
|
|
6193
|
-
<a id="__codelineno-
|
|
6194
|
-
<a id="__codelineno-
|
|
6195
|
-
<a id="__codelineno-
|
|
6196
|
-
<a id="__codelineno-
|
|
6197
|
-
<a id="__codelineno-
|
|
6198
|
-
<a id="__codelineno-
|
|
6199
|
-
<a id="__codelineno-
|
|
6200
|
-
<a id="__codelineno-
|
|
6201
|
-
<a id="__codelineno-
|
|
6202
|
-
<a id="__codelineno-
|
|
6203
|
-
<a id="__codelineno-
|
|
6204
|
-
<a id="__codelineno-
|
|
6205
|
-
<a id="__codelineno-
|
|
6206
|
-
<a id="__codelineno-
|
|
6207
|
-
<a id="__codelineno-
|
|
6208
|
-
<a id="__codelineno-
|
|
6209
|
-
<a id="__codelineno-
|
|
6210
|
-
<a id="__codelineno-
|
|
6211
|
-
<a id="__codelineno-
|
|
6212
|
-
<a id="__codelineno-
|
|
6213
|
-
<a id="__codelineno-
|
|
6158
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">Job</span>
|
|
6159
|
+
<a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">ConsolePort</span><span class="p">,</span> <span class="n">Device</span><span class="p">,</span> <span class="n">PowerPort</span>
|
|
6160
|
+
<a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a><span class="kn">from</span> <span class="nn">nautobot.extras.models</span> <span class="kn">import</span> <span class="n">Status</span>
|
|
6161
|
+
<a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-4"></a>
|
|
6162
|
+
<a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-5"></a>
|
|
6163
|
+
<a id="__codelineno-23-6" name="__codelineno-23-6" href="#__codelineno-23-6"></a><span class="k">class</span> <span class="nc">DeviceConnectionsReport</span><span class="p">(</span><span class="n">Job</span><span class="p">):</span>
|
|
6164
|
+
<a id="__codelineno-23-7" name="__codelineno-23-7" href="#__codelineno-23-7"></a> <span class="n">description</span> <span class="o">=</span> <span class="s2">"Validate the minimum physical connections for each device"</span>
|
|
6165
|
+
<a id="__codelineno-23-8" name="__codelineno-23-8" href="#__codelineno-23-8"></a>
|
|
6166
|
+
<a id="__codelineno-23-9" name="__codelineno-23-9" href="#__codelineno-23-9"></a> <span class="k">def</span> <span class="nf">test_console_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
6167
|
+
<a id="__codelineno-23-10" name="__codelineno-23-10" href="#__codelineno-23-10"></a> <span class="n">STATUS_ACTIVE</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">'Active'</span><span class="p">)</span>
|
|
6168
|
+
<a id="__codelineno-23-11" name="__codelineno-23-11" href="#__codelineno-23-11"></a>
|
|
6169
|
+
<a id="__codelineno-23-12" name="__codelineno-23-12" href="#__codelineno-23-12"></a> <span class="c1"># Check that every console port for every active device has a connection defined.</span>
|
|
6170
|
+
<a id="__codelineno-23-13" name="__codelineno-23-13" href="#__codelineno-23-13"></a> <span class="k">for</span> <span class="n">console_port</span> <span class="ow">in</span> <span class="n">ConsolePort</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">select_related</span><span class="p">(</span><span class="s1">'device'</span><span class="p">)</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">device__status</span><span class="o">=</span><span class="n">STATUS_ACTIVE</span><span class="p">):</span>
|
|
6171
|
+
<a id="__codelineno-23-14" name="__codelineno-23-14" href="#__codelineno-23-14"></a> <span class="k">if</span> <span class="n">console_port</span><span class="o">.</span><span class="n">connected_endpoint</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
6172
|
+
<a id="__codelineno-23-15" name="__codelineno-23-15" href="#__codelineno-23-15"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
|
|
6173
|
+
<a id="__codelineno-23-16" name="__codelineno-23-16" href="#__codelineno-23-16"></a> <span class="s2">"No console connection defined for </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span>
|
|
6174
|
+
<a id="__codelineno-23-17" name="__codelineno-23-17" href="#__codelineno-23-17"></a> <span class="n">console_port</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
6175
|
+
<a id="__codelineno-23-18" name="__codelineno-23-18" href="#__codelineno-23-18"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">console_port</span><span class="o">.</span><span class="n">device</span><span class="p">},</span>
|
|
6176
|
+
<a id="__codelineno-23-19" name="__codelineno-23-19" href="#__codelineno-23-19"></a> <span class="p">)</span>
|
|
6177
|
+
<a id="__codelineno-23-20" name="__codelineno-23-20" href="#__codelineno-23-20"></a> <span class="k">elif</span> <span class="ow">not</span> <span class="n">console_port</span><span class="o">.</span><span class="n">connection_status</span><span class="p">:</span>
|
|
6178
|
+
<a id="__codelineno-23-21" name="__codelineno-23-21" href="#__codelineno-23-21"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
|
|
6179
|
+
<a id="__codelineno-23-22" name="__codelineno-23-22" href="#__codelineno-23-22"></a> <span class="s2">"Console connection for </span><span class="si">%s</span><span class="s2"> marked as planned"</span><span class="p">,</span>
|
|
6180
|
+
<a id="__codelineno-23-23" name="__codelineno-23-23" href="#__codelineno-23-23"></a> <span class="n">console_port</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
6181
|
+
<a id="__codelineno-23-24" name="__codelineno-23-24" href="#__codelineno-23-24"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">console_port</span><span class="o">.</span><span class="n">device</span><span class="p">},</span>
|
|
6182
|
+
<a id="__codelineno-23-25" name="__codelineno-23-25" href="#__codelineno-23-25"></a> <span class="p">)</span>
|
|
6183
|
+
<a id="__codelineno-23-26" name="__codelineno-23-26" href="#__codelineno-23-26"></a> <span class="k">else</span><span class="p">:</span>
|
|
6184
|
+
<a id="__codelineno-23-27" name="__codelineno-23-27" href="#__codelineno-23-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
|
|
6185
|
+
<a id="__codelineno-23-28" name="__codelineno-23-28" href="#__codelineno-23-28"></a> <span class="s2">"Console port </span><span class="si">%s</span><span class="s2"> has a connection defined"</span><span class="p">,</span>
|
|
6186
|
+
<a id="__codelineno-23-29" name="__codelineno-23-29" href="#__codelineno-23-29"></a> <span class="n">console_port</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
6187
|
+
<a id="__codelineno-23-30" name="__codelineno-23-30" href="#__codelineno-23-30"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">console_port</span><span class="o">.</span><span class="n">device</span><span class="p">},</span>
|
|
6188
|
+
<a id="__codelineno-23-31" name="__codelineno-23-31" href="#__codelineno-23-31"></a> <span class="p">)</span>
|
|
6189
|
+
<a id="__codelineno-23-32" name="__codelineno-23-32" href="#__codelineno-23-32"></a>
|
|
6190
|
+
<a id="__codelineno-23-33" name="__codelineno-23-33" href="#__codelineno-23-33"></a> <span class="k">def</span> <span class="nf">test_power_connections</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
6191
|
+
<a id="__codelineno-23-34" name="__codelineno-23-34" href="#__codelineno-23-34"></a> <span class="n">STATUS_ACTIVE</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">'Active'</span><span class="p">)</span>
|
|
6192
|
+
<a id="__codelineno-23-35" name="__codelineno-23-35" href="#__codelineno-23-35"></a>
|
|
6193
|
+
<a id="__codelineno-23-36" name="__codelineno-23-36" href="#__codelineno-23-36"></a> <span class="c1"># Check that every active device has at least two connected power supplies.</span>
|
|
6194
|
+
<a id="__codelineno-23-37" name="__codelineno-23-37" href="#__codelineno-23-37"></a> <span class="k">for</span> <span class="n">device</span> <span class="ow">in</span> <span class="n">Device</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="n">STATUS_ACTIVE</span><span class="p">):</span>
|
|
6195
|
+
<a id="__codelineno-23-38" name="__codelineno-23-38" href="#__codelineno-23-38"></a> <span class="n">connected_ports</span> <span class="o">=</span> <span class="mi">0</span>
|
|
6196
|
+
<a id="__codelineno-23-39" name="__codelineno-23-39" href="#__codelineno-23-39"></a> <span class="k">for</span> <span class="n">power_port</span> <span class="ow">in</span> <span class="n">PowerPort</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">):</span>
|
|
6197
|
+
<a id="__codelineno-23-40" name="__codelineno-23-40" href="#__codelineno-23-40"></a> <span class="k">if</span> <span class="n">power_port</span><span class="o">.</span><span class="n">connected_endpoint</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
6198
|
+
<a id="__codelineno-23-41" name="__codelineno-23-41" href="#__codelineno-23-41"></a> <span class="n">connected_ports</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
6199
|
+
<a id="__codelineno-23-42" name="__codelineno-23-42" href="#__codelineno-23-42"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">power_port</span><span class="o">.</span><span class="n">connection_status</span><span class="p">:</span>
|
|
6200
|
+
<a id="__codelineno-23-43" name="__codelineno-23-43" href="#__codelineno-23-43"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
|
|
6201
|
+
<a id="__codelineno-23-44" name="__codelineno-23-44" href="#__codelineno-23-44"></a> <span class="s2">"Power connection for </span><span class="si">%s</span><span class="s2"> marked as planned"</span><span class="p">,</span>
|
|
6202
|
+
<a id="__codelineno-23-45" name="__codelineno-23-45" href="#__codelineno-23-45"></a> <span class="n">power_port</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
6203
|
+
<a id="__codelineno-23-46" name="__codelineno-23-46" href="#__codelineno-23-46"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">device</span><span class="p">},</span>
|
|
6204
|
+
<a id="__codelineno-23-47" name="__codelineno-23-47" href="#__codelineno-23-47"></a> <span class="p">)</span>
|
|
6205
|
+
<a id="__codelineno-23-48" name="__codelineno-23-48" href="#__codelineno-23-48"></a> <span class="k">if</span> <span class="n">connected_ports</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
|
|
6206
|
+
<a id="__codelineno-23-49" name="__codelineno-23-49" href="#__codelineno-23-49"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
|
|
6207
|
+
<a id="__codelineno-23-50" name="__codelineno-23-50" href="#__codelineno-23-50"></a> <span class="s2">"</span><span class="si">%s</span><span class="s2"> connected power supplies found (2 needed)"</span><span class="p">,</span>
|
|
6208
|
+
<a id="__codelineno-23-51" name="__codelineno-23-51" href="#__codelineno-23-51"></a> <span class="n">connected_ports</span><span class="p">,</span>
|
|
6209
|
+
<a id="__codelineno-23-52" name="__codelineno-23-52" href="#__codelineno-23-52"></a> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">device</span><span class="p">},</span>
|
|
6210
|
+
<a id="__codelineno-23-53" name="__codelineno-23-53" href="#__codelineno-23-53"></a> <span class="p">)</span>
|
|
6211
|
+
<a id="__codelineno-23-54" name="__codelineno-23-54" href="#__codelineno-23-54"></a> <span class="k">else</span><span class="p">:</span>
|
|
6212
|
+
<a id="__codelineno-23-55" name="__codelineno-23-55" href="#__codelineno-23-55"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"At least two connected power supplies found"</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">device</span><span class="p">})</span>
|
|
6214
6213
|
</code></pre></div>
|
|
6215
6214
|
<h2 id="job-button-receivers">Job Button Receivers<a class="headerlink" href="#job-button-receivers" title="Permanent link">¶</a></h2>
|
|
6216
6215
|
<p>Job Buttons are only able to initiate a specific type of job called a <strong>Job Button Receiver</strong>. These are jobs that subclass the <code>nautobot.apps.jobs.JobButtonReceiver</code> class. Job Button Receivers are similar to normal jobs except they are hard coded to accept only <code>object_pk</code> and <code>object_model_name</code> <a href="#variables">variables</a>. Job Button Receivers are hidden from the jobs listing UI by default but otherwise function similarly to other jobs. The <code>JobButtonReceiver</code> class only implements one method called <code>receive_job_button</code>.</p>
|
|
@@ -6224,52 +6223,52 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
6224
6223
|
<li><code>obj</code> - An instance of the object where the button was pressed</li>
|
|
6225
6224
|
</ol>
|
|
6226
6225
|
<h3 id="example-job-button-receiver">Example Job Button Receiver<a class="headerlink" href="#example-job-button-receiver" title="Permanent link">¶</a></h3>
|
|
6227
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6228
|
-
<a id="__codelineno-
|
|
6229
|
-
<a id="__codelineno-
|
|
6230
|
-
<a id="__codelineno-
|
|
6231
|
-
<a id="__codelineno-
|
|
6232
|
-
<a id="__codelineno-
|
|
6233
|
-
<a id="__codelineno-
|
|
6234
|
-
<a id="__codelineno-
|
|
6235
|
-
<a id="__codelineno-
|
|
6236
|
-
<a id="__codelineno-
|
|
6226
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">JobButtonReceiver</span>
|
|
6227
|
+
<a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>
|
|
6228
|
+
<a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a>
|
|
6229
|
+
<a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="k">class</span> <span class="nc">ExampleSimpleJobButtonReceiver</span><span class="p">(</span><span class="n">JobButtonReceiver</span><span class="p">):</span>
|
|
6230
|
+
<a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
6231
|
+
<a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Example Simple Job Button Receiver"</span>
|
|
6232
|
+
<a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a>
|
|
6233
|
+
<a id="__codelineno-24-8" name="__codelineno-24-8" href="#__codelineno-24-8"></a> <span class="k">def</span> <span class="nf">receive_job_button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
6234
|
+
<a id="__codelineno-24-9" name="__codelineno-24-9" href="#__codelineno-24-9"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running Job Button Receiver."</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
6235
|
+
<a id="__codelineno-24-10" name="__codelineno-24-10" href="#__codelineno-24-10"></a> <span class="c1"># Add job logic here</span>
|
|
6237
6236
|
</code></pre></div>
|
|
6238
6237
|
<h3 id="job-buttons-for-multiple-types">Job Buttons for Multiple Types<a class="headerlink" href="#job-buttons-for-multiple-types" title="Permanent link">¶</a></h3>
|
|
6239
6238
|
<p>Since Job Buttons can be associated to multiple object types, it would be trivial to create a Job that can change what it runs based on the object type.</p>
|
|
6240
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6241
|
-
<a id="__codelineno-
|
|
6242
|
-
<a id="__codelineno-
|
|
6243
|
-
<a id="__codelineno-
|
|
6244
|
-
<a id="__codelineno-
|
|
6245
|
-
<a id="__codelineno-
|
|
6246
|
-
<a id="__codelineno-
|
|
6247
|
-
<a id="__codelineno-
|
|
6248
|
-
<a id="__codelineno-
|
|
6249
|
-
<a id="__codelineno-
|
|
6250
|
-
<a id="__codelineno-
|
|
6251
|
-
<a id="__codelineno-
|
|
6252
|
-
<a id="__codelineno-
|
|
6253
|
-
<a id="__codelineno-
|
|
6254
|
-
<a id="__codelineno-
|
|
6255
|
-
<a id="__codelineno-
|
|
6256
|
-
<a id="__codelineno-
|
|
6257
|
-
<a id="__codelineno-
|
|
6258
|
-
<a id="__codelineno-
|
|
6259
|
-
<a id="__codelineno-
|
|
6260
|
-
<a id="__codelineno-
|
|
6261
|
-
<a id="__codelineno-
|
|
6262
|
-
<a id="__codelineno-
|
|
6263
|
-
<a id="__codelineno-
|
|
6264
|
-
<a id="__codelineno-
|
|
6265
|
-
<a id="__codelineno-
|
|
6266
|
-
<a id="__codelineno-
|
|
6267
|
-
<a id="__codelineno-
|
|
6268
|
-
<a id="__codelineno-
|
|
6269
|
-
<a id="__codelineno-
|
|
6270
|
-
<a id="__codelineno-
|
|
6271
|
-
<a id="__codelineno-
|
|
6272
|
-
<a id="__codelineno-
|
|
6239
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">JobButtonReceiver</span>
|
|
6240
|
+
<a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">Device</span><span class="p">,</span> <span class="n">Location</span>
|
|
6241
|
+
<a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a>
|
|
6242
|
+
<a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a>
|
|
6243
|
+
<a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a><span class="k">class</span> <span class="nc">ExampleComplexJobButtonReceiver</span><span class="p">(</span><span class="n">JobButtonReceiver</span><span class="p">):</span>
|
|
6244
|
+
<a id="__codelineno-25-6" name="__codelineno-25-6" href="#__codelineno-25-6"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
6245
|
+
<a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a> <span class="n">name</span> <span class="o">=</span> <span class="s2">"Example Complex Job Button Receiver"</span>
|
|
6246
|
+
<a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a>
|
|
6247
|
+
<a id="__codelineno-25-9" name="__codelineno-25-9" href="#__codelineno-25-9"></a> <span class="k">def</span> <span class="nf">_run_location_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
6248
|
+
<a id="__codelineno-25-10" name="__codelineno-25-10" href="#__codelineno-25-10"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running Location Job Button Receiver."</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
6249
|
+
<a id="__codelineno-25-11" name="__codelineno-25-11" href="#__codelineno-25-11"></a> <span class="c1"># Run Location Job function</span>
|
|
6250
|
+
<a id="__codelineno-25-12" name="__codelineno-25-12" href="#__codelineno-25-12"></a>
|
|
6251
|
+
<a id="__codelineno-25-13" name="__codelineno-25-13" href="#__codelineno-25-13"></a> <span class="k">def</span> <span class="nf">_run_device_job</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
6252
|
+
<a id="__codelineno-25-14" name="__codelineno-25-14" href="#__codelineno-25-14"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Running Device Job Button Receiver."</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
6253
|
+
<a id="__codelineno-25-15" name="__codelineno-25-15" href="#__codelineno-25-15"></a> <span class="c1"># Run Device Job function</span>
|
|
6254
|
+
<a id="__codelineno-25-16" name="__codelineno-25-16" href="#__codelineno-25-16"></a>
|
|
6255
|
+
<a id="__codelineno-25-17" name="__codelineno-25-17" href="#__codelineno-25-17"></a> <span class="k">def</span> <span class="nf">receive_job_button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
6256
|
+
<a id="__codelineno-25-18" name="__codelineno-25-18" href="#__codelineno-25-18"></a> <span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span>
|
|
6257
|
+
<a id="__codelineno-25-19" name="__codelineno-25-19" href="#__codelineno-25-19"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Location</span><span class="p">):</span>
|
|
6258
|
+
<a id="__codelineno-25-20" name="__codelineno-25-20" href="#__codelineno-25-20"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="s2">"dcim.add_location"</span><span class="p">):</span>
|
|
6259
|
+
<a id="__codelineno-25-21" name="__codelineno-25-21" href="#__codelineno-25-21"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"User '</span><span class="si">%s</span><span class="s2">' does not have permission to add a Location."</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
6260
|
+
<a id="__codelineno-25-22" name="__codelineno-25-22" href="#__codelineno-25-22"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"User does not have permission to add a Location."</span><span class="p">)</span>
|
|
6261
|
+
<a id="__codelineno-25-23" name="__codelineno-25-23" href="#__codelineno-25-23"></a> <span class="k">else</span><span class="p">:</span>
|
|
6262
|
+
<a id="__codelineno-25-24" name="__codelineno-25-24" href="#__codelineno-25-24"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_run_location_job</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
6263
|
+
<a id="__codelineno-25-25" name="__codelineno-25-25" href="#__codelineno-25-25"></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Device</span><span class="p">):</span>
|
|
6264
|
+
<a id="__codelineno-25-26" name="__codelineno-25-26" href="#__codelineno-25-26"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">user</span><span class="o">.</span><span class="n">has_perm</span><span class="p">(</span><span class="s2">"dcim.add_device"</span><span class="p">):</span>
|
|
6265
|
+
<a id="__codelineno-25-27" name="__codelineno-25-27" href="#__codelineno-25-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"User '</span><span class="si">%s</span><span class="s2">' does not have permission to add a Device."</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
6266
|
+
<a id="__codelineno-25-28" name="__codelineno-25-28" href="#__codelineno-25-28"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"User does not have permission to add a Device."</span><span class="p">)</span>
|
|
6267
|
+
<a id="__codelineno-25-29" name="__codelineno-25-29" href="#__codelineno-25-29"></a> <span class="k">else</span><span class="p">:</span>
|
|
6268
|
+
<a id="__codelineno-25-30" name="__codelineno-25-30" href="#__codelineno-25-30"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_run_device_job</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
6269
|
+
<a id="__codelineno-25-31" name="__codelineno-25-31" href="#__codelineno-25-31"></a> <span class="k">else</span><span class="p">:</span>
|
|
6270
|
+
<a id="__codelineno-25-32" name="__codelineno-25-32" href="#__codelineno-25-32"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Unable to run Job Button for type </span><span class="si">%s</span><span class="s2">."</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="p">{</span><span class="s2">"object"</span><span class="p">:</span> <span class="n">obj</span><span class="p">})</span>
|
|
6271
|
+
<a id="__codelineno-25-33" name="__codelineno-25-33" href="#__codelineno-25-33"></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">"Job button called on unsupported object type."</span><span class="p">)</span>
|
|
6273
6272
|
</code></pre></div>
|
|
6274
6273
|
<h2 id="job-hook-receivers">Job Hook Receivers<a class="headerlink" href="#job-hook-receivers" title="Permanent link">¶</a></h2>
|
|
6275
6274
|
<p>Job Hooks are only able to initiate a specific type of job called a <strong>Job Hook Receiver</strong>. These are jobs that subclass the <code>nautobot.apps.jobs.JobHookReceiver</code> class. Job hook receivers are similar to normal jobs except they are hard coded to accept only an <code>object_change</code> <a href="#variables">variable</a>. Job Hook Receivers are hidden from the jobs listing UI by default but otherwise function similarly to other jobs. The <code>JobHookReceiver</code> class only implements one method called <code>receive_job_hook</code>.</p>
|
|
@@ -6282,37 +6281,37 @@ However the import paths used in the examples requires 1.5.2 and newer.</p>
|
|
|
6282
6281
|
<p>To prevent negatively impacting system performance through an infinite loop, a change that was made by a <code>JobHookReceiver</code> job will not trigger another <code>JobHookReceiver</code> job to run.</p>
|
|
6283
6282
|
</div>
|
|
6284
6283
|
<h3 id="example-job-hook-receiver">Example Job Hook Receiver<a class="headerlink" href="#example-job-hook-receiver" title="Permanent link">¶</a></h3>
|
|
6285
|
-
<div class="highlight"><pre><span></span><code><a id="__codelineno-
|
|
6286
|
-
<a id="__codelineno-
|
|
6287
|
-
<a id="__codelineno-
|
|
6288
|
-
<a id="__codelineno-
|
|
6289
|
-
<a id="__codelineno-
|
|
6290
|
-
<a id="__codelineno-
|
|
6291
|
-
<a id="__codelineno-
|
|
6292
|
-
<a id="__codelineno-
|
|
6293
|
-
<a id="__codelineno-
|
|
6294
|
-
<a id="__codelineno-
|
|
6295
|
-
<a id="__codelineno-
|
|
6296
|
-
<a id="__codelineno-
|
|
6297
|
-
<a id="__codelineno-
|
|
6298
|
-
<a id="__codelineno-
|
|
6299
|
-
<a id="__codelineno-
|
|
6300
|
-
<a id="__codelineno-
|
|
6301
|
-
<a id="__codelineno-
|
|
6302
|
-
<a id="__codelineno-
|
|
6303
|
-
<a id="__codelineno-
|
|
6304
|
-
<a id="__codelineno-
|
|
6305
|
-
<a id="__codelineno-
|
|
6306
|
-
<a id="__codelineno-
|
|
6307
|
-
<a id="__codelineno-
|
|
6308
|
-
<a id="__codelineno-
|
|
6309
|
-
<a id="__codelineno-
|
|
6310
|
-
<a id="__codelineno-
|
|
6311
|
-
<a id="__codelineno-
|
|
6312
|
-
<a id="__codelineno-
|
|
6313
|
-
<a id="__codelineno-
|
|
6314
|
-
<a id="__codelineno-
|
|
6315
|
-
<a id="__codelineno-
|
|
6284
|
+
<div class="highlight"><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="kn">from</span> <span class="nn">nautobot.apps.jobs</span> <span class="kn">import</span> <span class="n">JobHookReceiver</span>
|
|
6285
|
+
<a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a><span class="kn">from</span> <span class="nn">nautobot.extras.choices</span> <span class="kn">import</span> <span class="n">ObjectChangeActionChoices</span>
|
|
6286
|
+
<a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a>
|
|
6287
|
+
<a id="__codelineno-26-4" name="__codelineno-26-4" href="#__codelineno-26-4"></a>
|
|
6288
|
+
<a id="__codelineno-26-5" name="__codelineno-26-5" href="#__codelineno-26-5"></a><span class="k">class</span> <span class="nc">ExampleJobHookReceiver</span><span class="p">(</span><span class="n">JobHookReceiver</span><span class="p">):</span>
|
|
6289
|
+
<a id="__codelineno-26-6" name="__codelineno-26-6" href="#__codelineno-26-6"></a> <span class="k">def</span> <span class="nf">receive_job_hook</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">change</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">):</span>
|
|
6290
|
+
<a id="__codelineno-26-7" name="__codelineno-26-7" href="#__codelineno-26-7"></a> <span class="c1"># return on delete action</span>
|
|
6291
|
+
<a id="__codelineno-26-8" name="__codelineno-26-8" href="#__codelineno-26-8"></a> <span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="n">ObjectChangeActionChoices</span><span class="o">.</span><span class="n">ACTION_DELETE</span><span class="p">:</span>
|
|
6292
|
+
<a id="__codelineno-26-9" name="__codelineno-26-9" href="#__codelineno-26-9"></a> <span class="k">return</span>
|
|
6293
|
+
<a id="__codelineno-26-10" name="__codelineno-26-10" href="#__codelineno-26-10"></a>
|
|
6294
|
+
<a id="__codelineno-26-11" name="__codelineno-26-11" href="#__codelineno-26-11"></a> <span class="c1"># log diff output</span>
|
|
6295
|
+
<a id="__codelineno-26-12" name="__codelineno-26-12" href="#__codelineno-26-12"></a> <span class="n">snapshots</span> <span class="o">=</span> <span class="n">change</span><span class="o">.</span><span class="n">get_snapshots</span><span class="p">()</span>
|
|
6296
|
+
<a id="__codelineno-26-13" name="__codelineno-26-13" href="#__codelineno-26-13"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"DIFF: </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">snapshots</span><span class="p">[</span><span class="s1">'differences'</span><span class="p">])</span>
|
|
6297
|
+
<a id="__codelineno-26-14" name="__codelineno-26-14" href="#__codelineno-26-14"></a>
|
|
6298
|
+
<a id="__codelineno-26-15" name="__codelineno-26-15" href="#__codelineno-26-15"></a> <span class="c1"># validate changes to serial field</span>
|
|
6299
|
+
<a id="__codelineno-26-16" name="__codelineno-26-16" href="#__codelineno-26-16"></a> <span class="k">if</span> <span class="s2">"serial"</span> <span class="ow">in</span> <span class="n">snapshots</span><span class="p">[</span><span class="s2">"differences"</span><span class="p">][</span><span class="s2">"added"</span><span class="p">]:</span>
|
|
6300
|
+
<a id="__codelineno-26-17" name="__codelineno-26-17" href="#__codelineno-26-17"></a> <span class="n">old_serial</span> <span class="o">=</span> <span class="n">snapshots</span><span class="p">[</span><span class="s2">"differences"</span><span class="p">][</span><span class="s2">"removed"</span><span class="p">][</span><span class="s2">"serial"</span><span class="p">]</span>
|
|
6301
|
+
<a id="__codelineno-26-18" name="__codelineno-26-18" href="#__codelineno-26-18"></a> <span class="n">new_serial</span> <span class="o">=</span> <span class="n">snapshots</span><span class="p">[</span><span class="s2">"differences"</span><span class="p">][</span><span class="s2">"added"</span><span class="p">][</span><span class="s2">"serial"</span><span class="p">]</span>
|
|
6302
|
+
<a id="__codelineno-26-19" name="__codelineno-26-19" href="#__codelineno-26-19"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> serial has been changed from </span><span class="si">%s</span><span class="s2"> to </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">,</span> <span class="n">old_serial</span><span class="p">,</span> <span class="n">new_serial</span><span class="p">)</span>
|
|
6303
|
+
<a id="__codelineno-26-20" name="__codelineno-26-20" href="#__codelineno-26-20"></a>
|
|
6304
|
+
<a id="__codelineno-26-21" name="__codelineno-26-21" href="#__codelineno-26-21"></a> <span class="c1"># Check the new serial is valid and revert if necessary</span>
|
|
6305
|
+
<a id="__codelineno-26-22" name="__codelineno-26-22" href="#__codelineno-26-22"></a> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">validate_serial</span><span class="p">(</span><span class="n">new_serial</span><span class="p">):</span>
|
|
6306
|
+
<a id="__codelineno-26-23" name="__codelineno-26-23" href="#__codelineno-26-23"></a> <span class="n">changed_object</span><span class="o">.</span><span class="n">serial</span> <span class="o">=</span> <span class="n">old_serial</span>
|
|
6307
|
+
<a id="__codelineno-26-24" name="__codelineno-26-24" href="#__codelineno-26-24"></a> <span class="n">changed_object</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
|
6308
|
+
<a id="__codelineno-26-25" name="__codelineno-26-25" href="#__codelineno-26-25"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"</span><span class="si">%s</span><span class="s2"> serial </span><span class="si">%s</span><span class="s2"> was not valid. Reverted to </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">,</span> <span class="n">new_serial</span><span class="p">,</span> <span class="n">old_serial</span><span class="p">)</span>
|
|
6309
|
+
<a id="__codelineno-26-26" name="__codelineno-26-26" href="#__codelineno-26-26"></a>
|
|
6310
|
+
<a id="__codelineno-26-27" name="__codelineno-26-27" href="#__codelineno-26-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Serial validation completed for </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">changed_object</span><span class="p">)</span>
|
|
6311
|
+
<a id="__codelineno-26-28" name="__codelineno-26-28" href="#__codelineno-26-28"></a>
|
|
6312
|
+
<a id="__codelineno-26-29" name="__codelineno-26-29" href="#__codelineno-26-29"></a> <span class="k">def</span> <span class="nf">validate_serial</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">serial</span><span class="p">):</span>
|
|
6313
|
+
<a id="__codelineno-26-30" name="__codelineno-26-30" href="#__codelineno-26-30"></a> <span class="c1"># add business logic to validate serial</span>
|
|
6314
|
+
<a id="__codelineno-26-31" name="__codelineno-26-31" href="#__codelineno-26-31"></a> <span class="k">return</span> <span class="kc">False</span>
|
|
6316
6315
|
</code></pre></div>
|
|
6317
6316
|
<h3 id="the-receive_job_hook-method">The <code>receive_job_hook()</code> Method<a class="headerlink" href="#the-receive_job_hook-method" title="Permanent link">¶</a></h3>
|
|
6318
6317
|
<p>All <code>JobHookReceiver</code> subclasses must implement a <code>receive_job_hook()</code> method. This method accepts three arguments:</p>
|