nautobot 2.1.0__py3-none-any.whl → 2.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nautobot/__init__.py +1 -3
- nautobot/apps/__init__.py +1 -2
- nautobot/apps/admin.py +0 -1
- nautobot/apps/api.py +0 -1
- nautobot/apps/change_logging.py +0 -1
- nautobot/apps/choices.py +0 -1
- nautobot/apps/datasources.py +0 -1
- nautobot/apps/exceptions.py +0 -1
- nautobot/apps/factory.py +0 -1
- nautobot/apps/filters.py +6 -9
- nautobot/apps/forms.py +1 -2
- nautobot/apps/graphql.py +0 -1
- nautobot/apps/jobs.py +0 -1
- nautobot/apps/models.py +1 -2
- nautobot/apps/querysets.py +0 -1
- nautobot/apps/secrets.py +0 -1
- nautobot/apps/tables.py +0 -1
- nautobot/apps/testing.py +0 -1
- nautobot/apps/ui.py +1 -3
- nautobot/apps/urls.py +0 -1
- nautobot/apps/utils.py +0 -1
- nautobot/apps/views.py +0 -1
- nautobot/circuits/api/serializers.py +1 -1
- nautobot/circuits/api/urls.py +1 -1
- nautobot/circuits/api/views.py +2 -1
- nautobot/circuits/apps.py +1 -1
- nautobot/circuits/choices.py +0 -1
- nautobot/circuits/factory.py +1 -1
- nautobot/circuits/filters.py +2 -1
- nautobot/circuits/forms.py +2 -2
- nautobot/circuits/homepage.py +0 -1
- nautobot/circuits/migrations/0001_initial_part_1.py +3 -1
- nautobot/circuits/migrations/0002_initial_part_2.py +2 -1
- nautobot/circuits/migrations/0003_auto_slug.py +1 -0
- nautobot/circuits/migrations/0005_providernetwork.py +4 -2
- nautobot/circuits/migrations/0013_alter_circuittermination__path.py +1 -0
- nautobot/circuits/migrations/0014_related_name_changes.py +1 -0
- nautobot/circuits/migrations/0016_tagsfield.py +1 -0
- nautobot/circuits/migrations/0018_status_nonnullable.py +1 -0
- nautobot/circuits/models.py +2 -2
- nautobot/circuits/navigation.py +0 -1
- nautobot/circuits/signals.py +3 -2
- nautobot/circuits/tables.py +1 -0
- nautobot/circuits/tests/integration/test_relationships.py +1 -1
- nautobot/circuits/tests/test_api.py +1 -1
- nautobot/circuits/tests/test_urls.py +1 -1
- nautobot/circuits/tests/test_views.py +1 -0
- nautobot/circuits/urls.py +1 -1
- nautobot/circuits/views.py +0 -2
- nautobot/core/__init__.py +0 -1
- nautobot/core/admin.py +3 -5
- nautobot/core/api/__init__.py +0 -1
- nautobot/core/api/metadata.py +4 -6
- nautobot/core/api/pagination.py +2 -2
- nautobot/core/api/parsers.py +1 -3
- nautobot/core/api/renderers.py +0 -1
- nautobot/core/api/schema.py +2 -3
- nautobot/core/api/serializers.py +9 -7
- nautobot/core/api/urls.py +1 -5
- nautobot/core/api/utils.py +4 -6
- nautobot/core/api/versioning.py +1 -1
- nautobot/core/api/views.py +22 -91
- nautobot/core/apps/__init__.py +5 -7
- nautobot/core/authentication.py +1 -1
- nautobot/core/celery/__init__.py +1 -2
- nautobot/core/celery/control.py +0 -2
- nautobot/core/celery/encoders.py +0 -1
- nautobot/core/celery/schedulers.py +1 -2
- nautobot/core/celery/task.py +1 -1
- nautobot/core/checks.py +1 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/cli/__init__.py +2 -3
- nautobot/core/context_processors.py +1 -5
- nautobot/core/factory.py +2 -2
- nautobot/core/filters.py +1 -1
- nautobot/core/forms/fields.py +2 -4
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/search.py +1 -1
- nautobot/core/forms/utils.py +1 -1
- nautobot/core/graphql/__init__.py +2 -3
- nautobot/core/graphql/generators.py +1 -1
- nautobot/core/graphql/schema.py +6 -7
- nautobot/core/graphql/schema_init.py +0 -1
- nautobot/core/graphql/utils.py +1 -2
- nautobot/core/management/commands/generate_test_data.py +4 -6
- nautobot/core/management/commands/makemigrations.py +1 -1
- nautobot/core/management/commands/migrate.py +1 -1
- nautobot/core/management/commands/post_upgrade.py +0 -15
- nautobot/core/management/commands/refresh_content_type_cache.py +1 -2
- nautobot/core/management/commands/send_installation_metrics.py +2 -3
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/middleware.py +2 -2
- nautobot/core/models/__init__.py +12 -12
- nautobot/core/models/fields.py +1 -1
- nautobot/core/models/generics.py +2 -3
- nautobot/core/models/managers.py +0 -1
- nautobot/core/models/name_color_content_types.py +2 -2
- nautobot/core/models/tree_queries.py +2 -4
- nautobot/core/models/validators.py +1 -1
- nautobot/core/releases.py +1 -1
- nautobot/core/runner/importer.py +2 -25
- nautobot/core/runner/runner.py +2 -2
- nautobot/core/runner/settings.py +1 -1
- nautobot/core/settings.py +9 -22
- nautobot/core/settings_funcs.py +1 -2
- nautobot/core/signals.py +0 -1
- nautobot/core/tables.py +1 -1
- nautobot/core/templates/graphene/graphiql.html +7 -1
- nautobot/core/templates/inc/footer.html +0 -7
- nautobot/core/templates/nautobot_config.py.j2 +0 -4
- nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
- nautobot/core/templatetags/buttons.py +1 -1
- nautobot/core/templatetags/helpers.py +5 -16
- nautobot/core/testing/__init__.py +1 -2
- nautobot/core/testing/api.py +2 -4
- nautobot/core/testing/filters.py +1 -1
- nautobot/core/testing/integration.py +2 -2
- nautobot/core/testing/migrations.py +1 -0
- nautobot/core/testing/mixins.py +1 -2
- nautobot/core/testing/schema.py +1 -1
- nautobot/core/testing/utils.py +3 -3
- nautobot/core/testing/views.py +4 -7
- nautobot/core/tests/integration/test_plugin_home.py +2 -1
- nautobot/core/tests/integration/test_plugin_navbar.py +1 -1
- nautobot/core/tests/nautobot_config.py +3 -3
- nautobot/core/tests/runner.py +3 -4
- nautobot/core/tests/test_api.py +6 -51
- nautobot/core/tests/test_authentication.py +2 -3
- nautobot/core/tests/test_checks.py +1 -2
- nautobot/core/tests/test_config.py +1 -1
- nautobot/core/tests/test_csv.py +3 -3
- nautobot/core/tests/test_factory.py +1 -3
- nautobot/core/tests/test_filters.py +3 -7
- nautobot/core/tests/test_forms.py +3 -6
- nautobot/core/tests/test_graphql.py +13 -14
- nautobot/core/tests/test_jinja_filters.py +4 -4
- nautobot/core/tests/test_jobs.py +1 -1
- nautobot/core/tests/test_models.py +1 -2
- nautobot/core/tests/test_navigations.py +2 -1
- nautobot/core/tests/test_openapi.py +0 -1
- nautobot/core/tests/test_paginator.py +2 -2
- nautobot/core/tests/test_releases.py +2 -2
- nautobot/core/tests/test_tables.py +1 -1
- nautobot/core/tests/test_templatetags_helpers.py +3 -2
- nautobot/core/tests/test_templatetags_netutils.py +1 -2
- nautobot/core/tests/test_utils.py +4 -8
- nautobot/core/tests/test_views.py +5 -2
- nautobot/core/tests/test_views_utils.py +0 -1
- nautobot/core/urls.py +4 -4
- nautobot/core/utils/color.py +1 -1
- nautobot/core/utils/data.py +1 -2
- nautobot/core/utils/filtering.py +4 -5
- nautobot/core/utils/git.py +3 -2
- nautobot/core/utils/logging.py +2 -1
- nautobot/core/utils/migrations.py +1 -0
- nautobot/core/utils/permissions.py +2 -4
- nautobot/core/views/__init__.py +5 -5
- nautobot/core/views/generic.py +4 -4
- nautobot/core/views/mixins.py +11 -12
- nautobot/core/views/renderers.py +1 -1
- nautobot/core/views/utils.py +2 -1
- nautobot/dcim/api/urls.py +1 -1
- nautobot/dcim/api/views.py +6 -5
- nautobot/dcim/apps.py +1 -1
- nautobot/dcim/choices.py +0 -1
- nautobot/dcim/constants.py +0 -1
- nautobot/dcim/elevations.py +1 -2
- nautobot/dcim/factory.py +10 -13
- nautobot/dcim/fields.py +1 -0
- nautobot/dcim/filters/__init__.py +2 -3
- nautobot/dcim/filters/mixins.py +1 -1
- nautobot/dcim/forms.py +10 -12
- nautobot/dcim/graphql/types.py +16 -17
- nautobot/dcim/migrations/0001_initial_part_1.py +4 -2
- nautobot/dcim/migrations/0002_initial_part_2.py +2 -1
- nautobot/dcim/migrations/0003_initial_part_3.py +2 -1
- nautobot/dcim/migrations/0004_initial_part_4.py +2 -1
- nautobot/dcim/migrations/0006_auto_slug.py +1 -0
- nautobot/dcim/migrations/0009_add_natural_indexing.py +1 -0
- nautobot/dcim/migrations/0010_interface_status.py +1 -0
- nautobot/dcim/migrations/0011_interface_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0013_location_location_type.py +4 -2
- nautobot/dcim/migrations/0014_location_status_data_migration.py +1 -0
- nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
- nautobot/dcim/migrations/0018_device_redundancy_group.py +4 -2
- nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0022_interface_redundancy_group.py +3 -1
- nautobot/dcim/migrations/0023_interface_redundancy_group_data_migration.py +1 -0
- nautobot/dcim/migrations/0024_move_site_fields_to_location_model.py +2 -1
- nautobot/dcim/migrations/0027_alter_interface_mac_address.py +1 -0
- nautobot/dcim/migrations/0028_alter_device_and_rack_role_add_new_role.py +1 -0
- nautobot/dcim/migrations/0029_device_and_rack_roles_data_migrations.py +1 -0
- nautobot/dcim/migrations/0033_add_tree_managers_and_foreign_keys_pre_data_migration.py +1 -0
- nautobot/dcim/migrations/0034_migrate_region_and_site_data_to_locations.py +1 -2
- nautobot/dcim/migrations/0038_fixup_fks_and_related_names.py +1 -0
- nautobot/dcim/migrations/0039_related_name_changes.py +1 -0
- nautobot/dcim/migrations/0042_alter_location_managers.py +1 -0
- nautobot/dcim/migrations/0044_tagsfield.py +1 -0
- nautobot/dcim/migrations/0047_status_nonnullable.py +1 -0
- nautobot/dcim/migrations/0051_interface_redundancy_group_nullable_status.py +1 -0
- nautobot/dcim/models/cables.py +3 -3
- nautobot/dcim/models/device_component_templates.py +6 -6
- nautobot/dcim/models/devices.py +9 -4
- nautobot/dcim/models/locations.py +6 -1
- nautobot/dcim/models/power.py +1 -1
- nautobot/dcim/models/racks.py +5 -4
- nautobot/dcim/navigation.py +0 -1
- nautobot/dcim/signals.py +3 -2
- nautobot/dcim/tables/__init__.py +5 -4
- nautobot/dcim/tables/cables.py +1 -0
- nautobot/dcim/tables/devices.py +1 -0
- nautobot/dcim/tables/power.py +1 -0
- nautobot/dcim/tables/racks.py +2 -1
- nautobot/dcim/tests/test_api.py +5 -7
- nautobot/dcim/tests/test_cablepaths.py +0 -1
- nautobot/dcim/tests/test_filters.py +14 -12
- nautobot/dcim/tests/test_forms.py +2 -3
- nautobot/dcim/tests/test_migrations.py +2 -2
- nautobot/dcim/tests/test_models.py +2 -2
- nautobot/dcim/tests/test_views.py +7 -8
- nautobot/dcim/urls.py +3 -2
- nautobot/dcim/utils.py +1 -1
- nautobot/dcim/views.py +4 -3
- nautobot/extras/admin.py +2 -1
- nautobot/extras/api/customfields.py +0 -2
- nautobot/extras/api/mixins.py +0 -1
- nautobot/extras/api/serializers.py +4 -4
- nautobot/extras/api/urls.py +1 -1
- nautobot/extras/api/views.py +1 -1
- nautobot/extras/apps.py +3 -4
- nautobot/extras/choices.py +3 -4
- nautobot/extras/context_managers.py +1 -1
- nautobot/extras/datasources/__init__.py +1 -1
- nautobot/extras/datasources/git.py +6 -6
- nautobot/extras/datasources/utils.py +0 -1
- nautobot/extras/factory.py +1 -1
- nautobot/extras/filters/__init__.py +2 -3
- nautobot/extras/filters/customfields.py +0 -1
- nautobot/extras/filters/mixins.py +1 -1
- nautobot/extras/forms/__init__.py +3 -4
- nautobot/extras/forms/base.py +1 -1
- nautobot/extras/forms/forms.py +3 -3
- nautobot/extras/forms/mixins.py +1 -1
- nautobot/extras/graphql/types.py +2 -2
- nautobot/extras/health_checks.py +1 -1
- nautobot/extras/jobs.py +1 -2
- nautobot/extras/management/__init__.py +0 -1
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -1
- nautobot/extras/management/commands/runjob.py +3 -3
- nautobot/extras/management/commands/webhook_receiver.py +1 -2
- nautobot/extras/migrations/0001_initial_part_1.py +2 -1
- nautobot/extras/migrations/0002_initial_part_2.py +2 -1
- nautobot/extras/migrations/0003_initial_part_3.py +1 -0
- nautobot/extras/migrations/0006_graphqlquery.py +2 -1
- nautobot/extras/migrations/0007_configcontextschema.py +3 -1
- nautobot/extras/migrations/0009_computedfield.py +3 -1
- nautobot/extras/migrations/0011_fileattachment_fileproxy.py +3 -1
- nautobot/extras/migrations/0012_healthchecktestmodel.py +2 -1
- nautobot/extras/migrations/0014_auto_slug.py +1 -0
- nautobot/extras/migrations/0015_scheduled_job.py +3 -1
- nautobot/extras/migrations/0016_secret.py +4 -2
- nautobot/extras/migrations/0017_joblogentry.py +2 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +2 -1
- nautobot/extras/migrations/0021_customfield_changelog_data.py +3 -2
- nautobot/extras/migrations/0022_objectchange_object_datav2.py +1 -0
- nautobot/extras/migrations/0023_job_model.py +4 -2
- nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +1 -0
- nautobot/extras/migrations/0029_dynamicgroup.py +3 -1
- nautobot/extras/migrations/0031_tag_content_types.py +1 -0
- nautobot/extras/migrations/0032_tag_content_types_data_migration.py +1 -0
- nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +2 -1
- nautobot/extras/migrations/0041_jobresult_job_kwargs.py +1 -0
- nautobot/extras/migrations/0043_note.py +3 -1
- nautobot/extras/migrations/0044_add_job_hook.py +3 -1
- nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +1 -0
- nautobot/extras/migrations/0047_enforce_custom_field_slug.py +1 -0
- nautobot/extras/migrations/0051_add_job_task_queues.py +1 -0
- nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +1 -0
- nautobot/extras/migrations/0057_jobbutton.py +3 -1
- nautobot/extras/migrations/0065_configcontext_data_migrations.py +1 -0
- nautobot/extras/migrations/0067_migrate_job_result_status.py +0 -1
- nautobot/extras/migrations/0068_jobresult__add_celery_fields.py +1 -0
- nautobot/extras/migrations/0071_replace_related_names.py +1 -0
- nautobot/extras/migrations/0077_migrate_custom_field_data.py +1 -0
- nautobot/extras/migrations/0078_remove_name_field_and_make_label_field_non_nullable.py +1 -0
- nautobot/extras/migrations/0080_tagsfield.py +1 -0
- nautobot/extras/migrations/0082_rename_relationship_name_to_label.py +1 -0
- nautobot/extras/migrations/0083_ensure_relationship_keys_are_unique.py +1 -0
- nautobot/extras/migrations/0090_joblogentry__log_level_data_migration.py +0 -1
- nautobot/extras/migrations/0095_ensure_note_timestamps_are_unique.py +4 -5
- nautobot/extras/migrations/0097_alter_job_result_remove_result.py +1 -0
- nautobot/extras/migrations/0100_fileproxy_job_result.py +1 -0
- nautobot/extras/migrations/0101_externalintegration.py +3 -1
- nautobot/extras/models/__init__.py +2 -3
- nautobot/extras/models/change_logging.py +0 -1
- nautobot/extras/models/customfields.py +4 -4
- nautobot/extras/models/datasources.py +2 -2
- nautobot/extras/models/groups.py +3 -4
- nautobot/extras/models/jobs.py +12 -6
- nautobot/extras/models/models.py +2 -2
- nautobot/extras/models/relationships.py +3 -4
- nautobot/extras/models/roles.py +1 -1
- nautobot/extras/models/secrets.py +1 -3
- nautobot/extras/models/tags.py +0 -1
- nautobot/extras/navigation.py +0 -1
- nautobot/extras/plugins/__init__.py +6 -7
- nautobot/extras/plugins/tables.py +0 -1
- nautobot/extras/plugins/utils.py +1 -1
- nautobot/extras/plugins/views.py +1 -2
- nautobot/extras/querysets.py +3 -3
- nautobot/extras/signals.py +6 -7
- nautobot/extras/tables.py +4 -4
- nautobot/extras/tasks.py +1 -2
- nautobot/extras/templates/extras/configcontext_edit.html +1 -1
- nautobot/extras/templates/extras/graphqlquery.html +4 -2
- nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
- nautobot/extras/templatetags/custom_links.py +2 -3
- nautobot/extras/templatetags/job_buttons.py +2 -3
- nautobot/extras/templatetags/log_levels.py +0 -1
- nautobot/extras/templatetags/plugins.py +1 -1
- nautobot/extras/test_jobs/api_test_job.py +1 -2
- nautobot/extras/test_jobs/atomic_transaction.py +1 -2
- nautobot/extras/test_jobs/dry_run.py +1 -2
- nautobot/extras/test_jobs/fail.py +1 -2
- nautobot/extras/test_jobs/field_order.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -2
- nautobot/extras/test_jobs/file_upload_pass.py +1 -2
- nautobot/extras/test_jobs/has_sensitive_variables.py +1 -2
- nautobot/extras/test_jobs/ipaddress_vars.py +1 -4
- nautobot/extras/test_jobs/job_button_receiver.py +1 -2
- nautobot/extras/test_jobs/job_hook_receiver.py +1 -2
- nautobot/extras/test_jobs/job_variables.py +1 -2
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -2
- nautobot/extras/test_jobs/log_redaction.py +1 -2
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -2
- nautobot/extras/test_jobs/modify_db.py +1 -2
- nautobot/extras/test_jobs/object_var_optional.py +1 -2
- nautobot/extras/test_jobs/object_var_required.py +1 -2
- nautobot/extras/test_jobs/object_vars.py +1 -2
- nautobot/extras/test_jobs/pass.py +1 -2
- nautobot/extras/test_jobs/profiling.py +1 -2
- nautobot/extras/tests/integration/__init__.py +1 -1
- nautobot/extras/tests/integration/test_plugins.py +5 -4
- nautobot/extras/tests/integration/test_tagfilter.py +1 -1
- nautobot/extras/tests/test_api.py +7 -9
- nautobot/extras/tests/test_changelog.py +3 -2
- nautobot/extras/tests/test_context_managers.py +6 -3
- nautobot/extras/tests/test_customfields.py +2 -2
- nautobot/extras/tests/test_datasources.py +1 -1
- nautobot/extras/tests/test_dynamicgroups.py +2 -3
- nautobot/extras/tests/test_filters.py +2 -2
- nautobot/extras/tests/test_forms.py +5 -6
- nautobot/extras/tests/test_git.py +1 -1
- nautobot/extras/tests/test_job_variables.py +0 -1
- nautobot/extras/tests/test_jobs.py +5 -5
- nautobot/extras/tests/test_models.py +2 -2
- nautobot/extras/tests/test_notes.py +0 -1
- nautobot/extras/tests/test_plugins.py +8 -9
- nautobot/extras/tests/test_relationships.py +3 -3
- nautobot/extras/tests/test_tags.py +1 -1
- nautobot/extras/tests/test_views.py +8 -9
- nautobot/extras/tests/test_webhooks.py +4 -5
- nautobot/extras/utils.py +11 -9
- nautobot/extras/views.py +3 -3
- nautobot/generate_secret_key.py +1 -1
- nautobot/ipam/api/serializers.py +1 -2
- nautobot/ipam/api/urls.py +1 -1
- nautobot/ipam/api/views.py +1 -0
- nautobot/ipam/apps.py +2 -1
- nautobot/ipam/factory.py +6 -9
- nautobot/ipam/fields.py +1 -1
- nautobot/ipam/filters.py +4 -3
- nautobot/ipam/formfields.py +1 -2
- nautobot/ipam/forms.py +4 -3
- nautobot/ipam/graphql/types.py +1 -1
- nautobot/ipam/homepage.py +0 -1
- nautobot/ipam/lookups.py +2 -3
- nautobot/ipam/migrations/0002_initial_part_2.py +2 -1
- nautobot/ipam/migrations/0003_remove_max_length.py +1 -0
- nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
- nautobot/ipam/migrations/0005_auto_slug.py +1 -0
- nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -0
- nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +1 -0
- nautobot/ipam/migrations/0020_related_name_changes.py +1 -0
- nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +1 -2
- nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +2 -1
- nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +1 -0
- nautobot/ipam/migrations/0028_tagsfield.py +1 -0
- nautobot/ipam/migrations/0030_ipam__namespaces.py +3 -1
- nautobot/ipam/migrations/0034_status_nonnullable.py +1 -0
- nautobot/ipam/migrations/0037_data_migration_vlan_group_name_uniqueness.py +0 -1
- nautobot/ipam/models.py +7 -7
- nautobot/ipam/navigation.py +0 -1
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +4 -3
- nautobot/ipam/tests/test_api.py +2 -2
- nautobot/ipam/tests/test_filters.py +7 -7
- nautobot/ipam/tests/test_migrations.py +1 -2
- nautobot/ipam/tests/test_models.py +2 -2
- nautobot/ipam/tests/test_ordering.py +1 -1
- nautobot/ipam/tests/test_querysets.py +2 -2
- nautobot/ipam/tests/test_views.py +6 -6
- nautobot/ipam/urls.py +1 -0
- nautobot/ipam/utils/migrations.py +0 -1
- nautobot/ipam/views.py +6 -6
- nautobot/project-static/docs/404.html +1 -43
- nautobot/project-static/docs/apps/index.html +1 -43
- nautobot/project-static/docs/apps/nautobot-apps.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +389 -431
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +12 -54
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2452 -2486
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +90 -132
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +26 -68
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +993 -1035
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +170 -212
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1789 -1831
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +961 -1003
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +2 -44
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +6904 -6946
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +974 -1016
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1 -43
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1159 -1197
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1796 -1832
- nautobot/project-static/docs/development/apps/api/configuration-view.html +1 -43
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/global-search.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/graphql.html +1 -43
- nautobot/project-static/docs/development/apps/api/models/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -45
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +5 -43
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +1 -43
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +1 -43
- nautobot/project-static/docs/development/apps/api/prometheus.html +1 -43
- nautobot/project-static/docs/development/apps/api/setup.html +1 -43
- nautobot/project-static/docs/development/apps/api/testing.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +1 -43
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/base-template.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +6 -48
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/index.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/notes.html +3 -45
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/urls.html +1 -43
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5357
- nautobot/project-static/docs/development/apps/index.html +1 -43
- nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -43
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -43
- nautobot/project-static/docs/development/apps/migration/from-v1.html +1 -44
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +1 -43
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +1 -43
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +1 -43
- nautobot/project-static/docs/development/core/application-registry.html +1 -43
- nautobot/project-static/docs/development/core/best-practices.html +1 -43
- nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -43
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +1 -43
- nautobot/project-static/docs/development/core/extending-models.html +1 -43
- nautobot/project-static/docs/development/core/generic-views.html +1 -43
- nautobot/project-static/docs/development/core/getting-started.html +108 -257
- nautobot/project-static/docs/development/core/homepage.html +1 -43
- nautobot/project-static/docs/development/core/index.html +1 -43
- nautobot/project-static/docs/development/core/model-features.html +1 -43
- nautobot/project-static/docs/development/core/natural-keys.html +1 -43
- nautobot/project-static/docs/development/core/navigation-menu.html +1 -43
- nautobot/project-static/docs/development/core/react-ui.html +13 -5640
- nautobot/project-static/docs/development/core/release-checklist.html +4 -52
- nautobot/project-static/docs/development/core/role-internals.html +4 -46
- nautobot/project-static/docs/development/core/style-guide.html +61 -102
- nautobot/project-static/docs/development/core/templates.html +4 -46
- nautobot/project-static/docs/development/core/testing.html +1 -43
- nautobot/project-static/docs/development/core/user-preferences.html +1 -43
- nautobot/project-static/docs/development/index.html +1 -43
- nautobot/project-static/docs/development/jobs/index.html +1 -43
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +1 -43
- nautobot/project-static/docs/development/react-ui.html +3 -3
- nautobot/project-static/docs/index.html +2 -47
- nautobot/project-static/docs/release-notes/index.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.0.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.1.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.2.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.3.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.4.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.5.html +1 -43
- nautobot/project-static/docs/release-notes/version-1.6.html +1 -43
- nautobot/project-static/docs/release-notes/version-2.0.html +1 -43
- nautobot/project-static/docs/release-notes/version-2.1.html +189 -77
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +236 -251
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +1 -43
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5389
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1 -65
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +1 -43
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/index.html +1 -64
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +2 -57
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +5 -94
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +1 -43
- nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -43
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +1 -43
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +1 -43
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +76 -137
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -43
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +2 -44
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +1 -43
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +23 -79
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +1 -43
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +1 -43
- nautobot/project-static/docs/user-guide/index.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +5 -43
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +1 -43
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +1 -43
- nautobot/project-static/js/theme.js +0 -5
- nautobot/tenancy/api/urls.py +1 -1
- nautobot/tenancy/api/views.py +1 -0
- nautobot/tenancy/factory.py +2 -2
- nautobot/tenancy/filters/__init__.py +1 -2
- nautobot/tenancy/forms.py +2 -2
- nautobot/tenancy/homepage.py +0 -1
- nautobot/tenancy/migrations/0001_initial.py +2 -1
- nautobot/tenancy/migrations/0002_auto_slug.py +1 -0
- nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +1 -0
- nautobot/tenancy/migrations/0008_tagsfield.py +1 -0
- nautobot/tenancy/models.py +0 -1
- nautobot/tenancy/navigation.py +0 -1
- nautobot/tenancy/tables.py +1 -0
- nautobot/tenancy/tests/test_filters.py +5 -5
- nautobot/tenancy/urls.py +1 -0
- nautobot/tenancy/views.py +2 -2
- nautobot/users/admin.py +1 -2
- nautobot/users/api/urls.py +1 -1
- nautobot/users/api/views.py +6 -4
- nautobot/users/factory.py +1 -3
- nautobot/users/filters.py +4 -4
- nautobot/users/forms.py +1 -0
- nautobot/users/migrations/0004_alter_user_managers.py +1 -0
- nautobot/users/migrations/0008_make_object_permission_a_changelogged_model.py +22 -0
- nautobot/users/models.py +2 -2
- nautobot/users/tests/test_api.py +7 -6
- nautobot/users/tests/test_filters.py +0 -1
- nautobot/users/tests/test_models.py +0 -1
- nautobot/users/tests/test_password_ui.py +1 -1
- nautobot/users/views.py +2 -2
- nautobot/virtualization/api/urls.py +1 -1
- nautobot/virtualization/api/views.py +2 -1
- nautobot/virtualization/apps.py +1 -1
- nautobot/virtualization/choices.py +0 -1
- nautobot/virtualization/factory.py +1 -1
- nautobot/virtualization/filters.py +1 -1
- nautobot/virtualization/forms.py +6 -6
- nautobot/virtualization/homepage.py +0 -1
- nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +1 -0
- nautobot/virtualization/migrations/0004_auto_slug.py +1 -0
- nautobot/virtualization/migrations/0005_add_natural_indexing.py +1 -0
- nautobot/virtualization/migrations/0006_vminterface_status.py +1 -0
- nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +1 -0
- nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +1 -0
- nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -0
- nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +1 -0
- nautobot/virtualization/migrations/0018_related_name_changes.py +1 -0
- nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +1 -0
- nautobot/virtualization/migrations/0025_status_nonnullable.py +1 -0
- nautobot/virtualization/models.py +1 -2
- nautobot/virtualization/navigation.py +0 -1
- nautobot/virtualization/signals.py +0 -1
- nautobot/virtualization/tables.py +1 -0
- nautobot/virtualization/tests/test_filters.py +3 -3
- nautobot/virtualization/tests/test_models.py +1 -1
- nautobot/virtualization/tests/test_views.py +2 -2
- nautobot/virtualization/urls.py +1 -0
- nautobot/virtualization/views.py +1 -1
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/METADATA +1 -1
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/RECORD +713 -814
- nautobot/core/management/commands/build_ui.py +0 -281
- nautobot/core/templates/base_react.html +0 -55
- nautobot/core/tests/test_cli.py +0 -25
- nautobot/ui/.eslintignore +0 -3
- nautobot/ui/.gitignore +0 -7
- nautobot/ui/.prettierignore +0 -6
- nautobot/ui/.prettierrc +0 -4
- nautobot/ui/README.md +0 -27
- nautobot/ui/config/env.js +0 -102
- nautobot/ui/config/getHttpsConfig.js +0 -68
- nautobot/ui/config/jest/babelTransform.js +0 -14
- nautobot/ui/config/jest/cssTransform.js +0 -12
- nautobot/ui/config/jest/fileTransform.js +0 -38
- nautobot/ui/config/modules.js +0 -151
- nautobot/ui/config/paths.js +0 -67
- nautobot/ui/config/webpack/persistentCache/createEnvironmentHash.js +0 -8
- nautobot/ui/config/webpack.config.js +0 -674
- nautobot/ui/config/webpackDevServer.config.js +0 -127
- nautobot/ui/jest.config.js +0 -35
- nautobot/ui/jsconfig.json +0 -4
- nautobot/ui/package-lock.json +0 -22947
- nautobot/ui/package.json +0 -119
- nautobot/ui/public/index.html +0 -47
- nautobot/ui/public/logo192.png +0 -0
- nautobot/ui/public/logo512.png +0 -0
- nautobot/ui/public/manifest.json +0 -25
- nautobot/ui/public/nautobot_logo.svg +0 -131
- nautobot/ui/public/robots.txt +0 -3
- nautobot/ui/scripts/build.js +0 -224
- nautobot/ui/scripts/start.js +0 -140
- nautobot/ui/scripts/test.js +0 -40
- nautobot/ui/src/App.js +0 -79
- nautobot/ui/src/components/AppFullWidthComponents.js +0 -8
- nautobot/ui/src/components/AppTab.js +0 -40
- nautobot/ui/src/components/Apps.js +0 -60
- nautobot/ui/src/components/FeedbackModal.js +0 -123
- nautobot/ui/src/components/FiltersPanel.js +0 -693
- nautobot/ui/src/components/HomeChangelogPanel.js +0 -98
- nautobot/ui/src/components/HomePanel.js +0 -58
- nautobot/ui/src/components/JobHistoryTable.js +0 -78
- nautobot/ui/src/components/Layout.js +0 -76
- nautobot/ui/src/components/LoadingWidget.js +0 -14
- nautobot/ui/src/components/Navbar.js +0 -204
- nautobot/ui/src/components/NotificationPopover.js +0 -27
- nautobot/ui/src/components/ObjectTable/ObjectListTable.js +0 -300
- nautobot/ui/src/components/ObjectTable/ObjectTable.js +0 -96
- nautobot/ui/src/components/ObjectTable/ObjectTableItem.js +0 -70
- nautobot/ui/src/components/ObjectTable/index.js +0 -3
- nautobot/ui/src/components/Pagination/PageNumberForm.js +0 -228
- nautobot/ui/src/components/Pagination/PageSizeForm.js +0 -65
- nautobot/ui/src/components/Pagination/Pagination.js +0 -67
- nautobot/ui/src/components/Pagination/index.js +0 -3
- nautobot/ui/src/components/ReferenceDataTag.js +0 -35
- nautobot/ui/src/components/Retrieve/RenderChangeLogsTab.js +0 -58
- nautobot/ui/src/components/Retrieve/RenderColumn.js +0 -30
- nautobot/ui/src/components/Retrieve/RenderGroup.js +0 -24
- nautobot/ui/src/components/Retrieve/RenderHeader.js +0 -125
- nautobot/ui/src/components/Retrieve/RenderNotesTab.js +0 -60
- nautobot/ui/src/components/Retrieve/RenderTable.js +0 -33
- nautobot/ui/src/components/Retrieve/RenderTabs.js +0 -56
- nautobot/ui/src/components/Retrieve/index.js +0 -7
- nautobot/ui/src/components/RouterButton.js +0 -10
- nautobot/ui/src/components/RouterLink.js +0 -10
- nautobot/ui/src/components/SidebarNav.js +0 -156
- nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +0 -16
- nautobot/ui/src/components/__tests__/AppTab.test.js +0 -21
- nautobot/ui/src/components/__tests__/Apps.test.js +0 -14
- nautobot/ui/src/components/__tests__/Layout.test.js +0 -33
- nautobot/ui/src/components/__tests__/PageSizeForm.test.js +0 -13
- nautobot/ui/src/components/__tests__/Pagination.test.js +0 -43
- nautobot/ui/src/components/__tests__/Table.test.js +0 -39
- nautobot/ui/src/components/__tests__/TableItem.test.js +0 -39
- nautobot/ui/src/components/index.js +0 -4
- nautobot/ui/src/constants/apiPath.js +0 -13
- nautobot/ui/src/constants/icons.js +0 -15
- nautobot/ui/src/constants/size.js +0 -15
- nautobot/ui/src/file_templates/app_imports.js.j2 +0 -7
- nautobot/ui/src/file_templates/jsconfig-base.json +0 -12
- nautobot/ui/src/index.js +0 -65
- nautobot/ui/src/reportWebVitals.js +0 -15
- nautobot/ui/src/router.js +0 -77
- nautobot/ui/src/utils/api.js +0 -160
- nautobot/ui/src/utils/app-import.js +0 -15
- nautobot/ui/src/utils/color.js +0 -15
- nautobot/ui/src/utils/date.js +0 -14
- nautobot/ui/src/utils/index.js +0 -15
- nautobot/ui/src/utils/navigation.js +0 -48
- nautobot/ui/src/utils/session.js +0 -64
- nautobot/ui/src/utils/store.js +0 -242
- nautobot/ui/src/utils/string.js +0 -6
- nautobot/ui/src/utils/url.js +0 -4
- nautobot/ui/src/views/Home.js +0 -142
- nautobot/ui/src/views/InstalledApps.js +0 -80
- nautobot/ui/src/views/Login.js +0 -48
- nautobot/ui/src/views/Logout.js +0 -20
- nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +0 -11
- nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +0 -107
- nautobot/ui/src/views/__tests__/Login.test.js +0 -15
- nautobot/ui/src/views/generic/GenericView.js +0 -191
- nautobot/ui/src/views/generic/ObjectCreate.js +0 -96
- nautobot/ui/src/views/generic/ObjectList.js +0 -137
- nautobot/ui/src/views/generic/ObjectRetrieve.js +0 -87
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
- {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
|
@@ -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>
|
|
@@ -3528,23 +3514,9 @@
|
|
|
3528
3514
|
|
|
3529
3515
|
|
|
3530
3516
|
|
|
3531
|
-
<li class="md-nav__item">
|
|
3532
|
-
<a href="../../../development/apps/api/views/view-overrides.html" class="md-nav__link">
|
|
3533
|
-
View Overrides
|
|
3534
|
-
</a>
|
|
3535
|
-
</li>
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
3517
|
<li class="md-nav__item">
|
|
3546
3518
|
<a href="../../../development/apps/api/views/core-view-overrides.html" class="md-nav__link">
|
|
3547
|
-
|
|
3519
|
+
View Overrides
|
|
3548
3520
|
</a>
|
|
3549
3521
|
</li>
|
|
3550
3522
|
|
|
@@ -5620,20 +5592,6 @@
|
|
|
5620
5592
|
|
|
5621
5593
|
|
|
5622
5594
|
|
|
5623
|
-
<li class="md-nav__item">
|
|
5624
|
-
<a href="../../../development/core/react-ui.html" class="md-nav__link">
|
|
5625
|
-
React UI
|
|
5626
|
-
</a>
|
|
5627
|
-
</li>
|
|
5628
|
-
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5637
5595
|
<li class="md-nav__item">
|
|
5638
5596
|
<a href="../../../development/core/role-internals.html" class="md-nav__link">
|
|
5639
5597
|
Role Internals
|
|
@@ -7388,7 +7346,8 @@ class MyModel(models.Model):
|
|
|
7388
7346
|
|
|
7389
7347
|
<details class="quote">
|
|
7390
7348
|
<summary>Source code in <code>nautobot/core/models/managers.py</code></summary>
|
|
7391
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
7349
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
|
|
7350
|
+
<span class="normal"><a href="#__codelineno-0-10">10</a></span>
|
|
7392
7351
|
<span class="normal"><a href="#__codelineno-0-11">11</a></span>
|
|
7393
7352
|
<span class="normal"><a href="#__codelineno-0-12">12</a></span>
|
|
7394
7353
|
<span class="normal"><a href="#__codelineno-0-13">13</a></span>
|
|
@@ -7418,39 +7377,38 @@ class MyModel(models.Model):
|
|
|
7418
7377
|
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
|
|
7419
7378
|
<span class="normal"><a href="#__codelineno-0-38">38</a></span>
|
|
7420
7379
|
<span class="normal"><a href="#__codelineno-0-39">39</a></span>
|
|
7421
|
-
<span class="normal"><a href="#__codelineno-0-40">40</a></span>
|
|
7422
|
-
<
|
|
7423
|
-
<a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="
|
|
7424
|
-
<a id="__codelineno-0-12" name="__codelineno-0-12"></a
|
|
7425
|
-
<a id="__codelineno-0-13" name="__codelineno-0-13"></a>
|
|
7426
|
-
<a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="sd">
|
|
7427
|
-
<a id="__codelineno-0-15" name="__codelineno-0-15"></a
|
|
7428
|
-
<a id="__codelineno-0-16" name="__codelineno-0-16"></a>
|
|
7429
|
-
<a id="__codelineno-0-17" name="__codelineno-0-17"></a
|
|
7430
|
-
<a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="
|
|
7431
|
-
<a id="__codelineno-0-19" name="__codelineno-0-19"></a
|
|
7432
|
-
<a id="__codelineno-0-20" name="__codelineno-0-20"></a>
|
|
7433
|
-
<a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd">
|
|
7434
|
-
<a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd">
|
|
7435
|
-
<a id="__codelineno-0-23" name="__codelineno-0-23"></a><span class="
|
|
7436
|
-
<a id="__codelineno-0-24" name="__codelineno-0-24"></a>
|
|
7437
|
-
<a id="__codelineno-0-25" name="__codelineno-0-25"></a>
|
|
7438
|
-
<a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="s2">"
|
|
7439
|
-
<a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="
|
|
7440
|
-
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="
|
|
7441
|
-
<a id="__codelineno-0-29" name="__codelineno-0-29"></a>
|
|
7442
|
-
<a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="p">
|
|
7443
|
-
<a id="__codelineno-0-31" name="__codelineno-0-31"></a>
|
|
7444
|
-
<a id="__codelineno-0-32" name="__codelineno-0-32"></a>
|
|
7445
|
-
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
7446
|
-
<a id="__codelineno-0-34" name="__codelineno-0-34"></a>
|
|
7447
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1">#
|
|
7448
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="c1"># (
|
|
7449
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1">#
|
|
7450
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1">#
|
|
7451
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="c1">#
|
|
7452
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="
|
|
7453
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">base_kwargs</span><span class="p">)</span>
|
|
7380
|
+
<span class="normal"><a href="#__codelineno-0-40">40</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-9" name="__codelineno-0-9"></a><span class="k">class</span> <span class="nc">BaseManager</span><span class="p">(</span><span class="n">Manager</span><span class="p">):</span>
|
|
7381
|
+
<a id="__codelineno-0-10" name="__codelineno-0-10"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7382
|
+
<a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="sd"> Base manager class corresponding to BaseModel and RestrictedQuerySet.</span>
|
|
7383
|
+
<a id="__codelineno-0-12" name="__codelineno-0-12"></a>
|
|
7384
|
+
<a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="sd"> Adds built-in natural key support, loosely based on `django-natural-keys`.</span>
|
|
7385
|
+
<a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="sd"> """</span>
|
|
7386
|
+
<a id="__codelineno-0-15" name="__codelineno-0-15"></a>
|
|
7387
|
+
<a id="__codelineno-0-16" name="__codelineno-0-16"></a> <span class="k">def</span> <span class="nf">get_by_natural_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
|
7388
|
+
<a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7389
|
+
<a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="sd"> Return the object corresponding to the provided natural key.</span>
|
|
7390
|
+
<a id="__codelineno-0-19" name="__codelineno-0-19"></a>
|
|
7391
|
+
<a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="sd"> Generic implementation that depends on the model being a BaseModel subclass or otherwise implementing our</span>
|
|
7392
|
+
<a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> `natural_key_field_lookups` property API. Loosely based on implementation from `django-natural-keys`.</span>
|
|
7393
|
+
<a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> """</span>
|
|
7394
|
+
<a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
|
|
7395
|
+
<a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
|
|
7396
|
+
<a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="s2">"</span><span class="si">%s</span><span class="s2">.objects.get_by_natural_key() was called with a single </span><span class="si">%s</span><span class="s2"> as its args, "</span>
|
|
7397
|
+
<a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="s2">"instead of a list of individual args. Did you forget a '*' in your call?"</span><span class="p">,</span>
|
|
7398
|
+
<a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
|
7399
|
+
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
|
7400
|
+
<a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="p">)</span>
|
|
7401
|
+
<a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
7402
|
+
<a id="__codelineno-0-31" name="__codelineno-0-31"></a>
|
|
7403
|
+
<a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="n">base_kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">natural_key_args_to_kwargs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
7404
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
7405
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="c1"># django-natural-keys had a pattern where it would replace nested related field lookups</span>
|
|
7406
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1"># (parent__namespace__name="Global", parent__prefix="10.0.0.0/8") with calls to get_by_natural_key()</span>
|
|
7407
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="c1"># (parent=Prefix.objects.get_by_natural_key("Global", "10.0.0.0/8")).</span>
|
|
7408
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1"># We initially followed this pattern, but it had the downside that an object's natural key could therefore</span>
|
|
7409
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1"># **only** reference related objects by their own natural keys, which is unnecessarily rigid.</span>
|
|
7410
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="c1"># We instead just do the simple thing and let Django follow the nested lookups as appropriate:</span>
|
|
7411
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">base_kwargs</span><span class="p">)</span>
|
|
7454
7412
|
</code></pre></div></td></tr></table></div>
|
|
7455
7413
|
</details>
|
|
7456
7414
|
|
|
@@ -7485,7 +7443,8 @@ class MyModel(models.Model):
|
|
|
7485
7443
|
|
|
7486
7444
|
<details class="quote">
|
|
7487
7445
|
<summary>Source code in <code>nautobot/core/models/managers.py</code></summary>
|
|
7488
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
7446
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-16">16</a></span>
|
|
7447
|
+
<span class="normal"><a href="#__codelineno-0-17">17</a></span>
|
|
7489
7448
|
<span class="normal"><a href="#__codelineno-0-18">18</a></span>
|
|
7490
7449
|
<span class="normal"><a href="#__codelineno-0-19">19</a></span>
|
|
7491
7450
|
<span class="normal"><a href="#__codelineno-0-20">20</a></span>
|
|
@@ -7508,32 +7467,31 @@ class MyModel(models.Model):
|
|
|
7508
7467
|
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
|
|
7509
7468
|
<span class="normal"><a href="#__codelineno-0-38">38</a></span>
|
|
7510
7469
|
<span class="normal"><a href="#__codelineno-0-39">39</a></span>
|
|
7511
|
-
<span class="normal"><a href="#__codelineno-0-40">40</a></span>
|
|
7512
|
-
<
|
|
7513
|
-
<a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="
|
|
7514
|
-
<a id="__codelineno-0-19" name="__codelineno-0-19"></a
|
|
7515
|
-
<a id="__codelineno-0-20" name="__codelineno-0-20"></a>
|
|
7516
|
-
<a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd">
|
|
7517
|
-
<a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd">
|
|
7518
|
-
<a id="__codelineno-0-23" name="__codelineno-0-23"></a><span class="
|
|
7519
|
-
<a id="__codelineno-0-24" name="__codelineno-0-24"></a>
|
|
7520
|
-
<a id="__codelineno-0-25" name="__codelineno-0-25"></a>
|
|
7521
|
-
<a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="s2">"
|
|
7522
|
-
<a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="
|
|
7523
|
-
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="
|
|
7524
|
-
<a id="__codelineno-0-29" name="__codelineno-0-29"></a>
|
|
7525
|
-
<a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="p">
|
|
7526
|
-
<a id="__codelineno-0-31" name="__codelineno-0-31"></a>
|
|
7527
|
-
<a id="__codelineno-0-32" name="__codelineno-0-32"></a>
|
|
7528
|
-
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
7529
|
-
<a id="__codelineno-0-34" name="__codelineno-0-34"></a>
|
|
7530
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1">#
|
|
7531
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="c1"># (
|
|
7532
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1">#
|
|
7533
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1">#
|
|
7534
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="c1">#
|
|
7535
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="
|
|
7536
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">base_kwargs</span><span class="p">)</span>
|
|
7470
|
+
<span class="normal"><a href="#__codelineno-0-40">40</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="k">def</span> <span class="nf">get_by_natural_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
|
7471
|
+
<a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7472
|
+
<a id="__codelineno-0-18" name="__codelineno-0-18"></a><span class="sd"> Return the object corresponding to the provided natural key.</span>
|
|
7473
|
+
<a id="__codelineno-0-19" name="__codelineno-0-19"></a>
|
|
7474
|
+
<a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="sd"> Generic implementation that depends on the model being a BaseModel subclass or otherwise implementing our</span>
|
|
7475
|
+
<a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> `natural_key_field_lookups` property API. Loosely based on implementation from `django-natural-keys`.</span>
|
|
7476
|
+
<a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> """</span>
|
|
7477
|
+
<a id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">)):</span>
|
|
7478
|
+
<a id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
|
|
7479
|
+
<a id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="s2">"</span><span class="si">%s</span><span class="s2">.objects.get_by_natural_key() was called with a single </span><span class="si">%s</span><span class="s2"> as its args, "</span>
|
|
7480
|
+
<a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="s2">"instead of a list of individual args. Did you forget a '*' in your call?"</span><span class="p">,</span>
|
|
7481
|
+
<a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
|
7482
|
+
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="nb">type</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span>
|
|
7483
|
+
<a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="p">)</span>
|
|
7484
|
+
<a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="n">args</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
7485
|
+
<a id="__codelineno-0-31" name="__codelineno-0-31"></a>
|
|
7486
|
+
<a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="n">base_kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">natural_key_args_to_kwargs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
|
7487
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
7488
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="c1"># django-natural-keys had a pattern where it would replace nested related field lookups</span>
|
|
7489
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="c1"># (parent__namespace__name="Global", parent__prefix="10.0.0.0/8") with calls to get_by_natural_key()</span>
|
|
7490
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="c1"># (parent=Prefix.objects.get_by_natural_key("Global", "10.0.0.0/8")).</span>
|
|
7491
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="c1"># We initially followed this pattern, but it had the downside that an object's natural key could therefore</span>
|
|
7492
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1"># **only** reference related objects by their own natural keys, which is unnecessarily rigid.</span>
|
|
7493
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="c1"># We instead just do the simple thing and let Django follow the nested lookups as appropriate:</span>
|
|
7494
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="o">**</span><span class="n">base_kwargs</span><span class="p">)</span>
|
|
7537
7495
|
</code></pre></div></td></tr></table></div>
|
|
7538
7496
|
</details>
|
|
7539
7497
|
</div>
|
|
@@ -7860,62 +7818,62 @@ can be used for the same purpose in most cases.</p>
|
|
|
7860
7818
|
<a id="__codelineno-0-47" name="__codelineno-0-47"></a>
|
|
7861
7819
|
<a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="n">objects</span> <span class="o">=</span> <span class="n">BaseManager</span><span class="o">.</span><span class="n">from_queryset</span><span class="p">(</span><span class="n">RestrictedQuerySet</span><span class="p">)()</span>
|
|
7862
7820
|
<a id="__codelineno-0-49" name="__codelineno-0-49"></a>
|
|
7863
|
-
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="
|
|
7864
|
-
<a id="__codelineno-0-51" name="__codelineno-0-51"></a>
|
|
7865
|
-
<a id="__codelineno-0-52" name="__codelineno-0-52"></a
|
|
7866
|
-
<a id="__codelineno-0-53" name="__codelineno-0-53"></a
|
|
7867
|
-
<a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="
|
|
7868
|
-
<a id="__codelineno-0-55" name="__codelineno-0-55"></a
|
|
7869
|
-
<a id="__codelineno-0-56" name="__codelineno-0-56"></a>
|
|
7870
|
-
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
7871
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a
|
|
7872
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a
|
|
7873
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="
|
|
7821
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
7822
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
7823
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
7824
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
7825
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7826
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> Return the canonical URL for this object in either the UI or the REST API.</span>
|
|
7827
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> """</span>
|
|
7828
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
7829
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="c1"># Iterate the pk-like fields and try to get a URL, or return None.</span>
|
|
7830
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"pk"</span><span class="p">]</span>
|
|
7831
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"retrieve"</span><span class="p">,</span> <span class="s2">"detail"</span><span class="p">,</span> <span class="s2">""</span><span class="p">]</span> <span class="c1"># TODO: Eventually all retrieve</span>
|
|
7874
7832
|
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
7875
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="
|
|
7876
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
7877
|
-
<a id="__codelineno-0-64" name="__codelineno-0-64"></a>
|
|
7833
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
|
|
7834
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
|
|
7835
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">continue</span>
|
|
7878
7836
|
<a id="__codelineno-0-65" name="__codelineno-0-65"></a>
|
|
7879
|
-
<a id="__codelineno-0-66" name="__codelineno-0-66"></a>
|
|
7880
|
-
<a id="__codelineno-0-67" name="__codelineno-0-67"></a>
|
|
7881
|
-
<a id="__codelineno-0-68" name="__codelineno-0-68"></a>
|
|
7882
|
-
<a id="__codelineno-0-69" name="__codelineno-0-69"></a>
|
|
7883
|
-
<a id="__codelineno-0-70" name="__codelineno-0-70"></a>
|
|
7884
|
-
<a id="__codelineno-0-71" name="__codelineno-0-71"></a> <span class="
|
|
7885
|
-
<a id="__codelineno-0-72" name="__codelineno-0-72"></a>
|
|
7886
|
-
<a id="__codelineno-0-73" name="__codelineno-0-73"></a>
|
|
7887
|
-
<a id="__codelineno-0-74" name="__codelineno-0-74"></a>
|
|
7888
|
-
<a id="__codelineno-0-75" name="__codelineno-0-75"></a>
|
|
7889
|
-
<a id="__codelineno-0-76" name="__codelineno-0-76"></a>
|
|
7890
|
-
<a id="__codelineno-0-77" name="__codelineno-0-77"></a>
|
|
7891
|
-
<a id="__codelineno-0-78" name="__codelineno-0-78"></a
|
|
7892
|
-
<a id="__codelineno-0-79" name="__codelineno-0-79"></a>
|
|
7893
|
-
<a id="__codelineno-0-80" name="__codelineno-0-80"></a
|
|
7894
|
-
<a id="__codelineno-0-81" name="__codelineno-0-81"></a>
|
|
7895
|
-
<a id="__codelineno-0-82" name="__codelineno-0-82"></a
|
|
7896
|
-
<a id="__codelineno-0-83" name="__codelineno-0-83"></a
|
|
7897
|
-
<a id="__codelineno-0-84" name="__codelineno-0-84"></a><span class="
|
|
7898
|
-
<a id="__codelineno-0-85" name="__codelineno-0-85"></a
|
|
7899
|
-
<a id="__codelineno-0-86" name="__codelineno-0-86"></a>
|
|
7900
|
-
<a id="__codelineno-0-87" name="__codelineno-0-87"></a
|
|
7901
|
-
<a id="__codelineno-0-88" name="__codelineno-0-88"></a>
|
|
7902
|
-
<a id="__codelineno-0-89" name="__codelineno-0-89"></a
|
|
7903
|
-
<a id="__codelineno-0-90" name="__codelineno-0-90"></a
|
|
7904
|
-
<a id="__codelineno-0-91" name="__codelineno-0-91"></a>
|
|
7905
|
-
<a id="__codelineno-0-92" name="__codelineno-0-92"></a><span class="
|
|
7906
|
-
<a id="__codelineno-0-93" name="__codelineno-0-93"></a><span class="sd">
|
|
7907
|
-
<a id="__codelineno-0-94" name="__codelineno-0-94"></a>
|
|
7908
|
-
<a id="__codelineno-0-95" name="__codelineno-0-95"></a>
|
|
7909
|
-
<a id="__codelineno-0-96" name="__codelineno-0-96"></a
|
|
7910
|
-
<a id="__codelineno-0-97" name="__codelineno-0-97"></a>
|
|
7911
|
-
<a id="__codelineno-0-98" name="__codelineno-0-98"></a
|
|
7912
|
-
<a id="__codelineno-0-99" name="__codelineno-0-99"></a
|
|
7913
|
-
<a id="__codelineno-0-100" name="__codelineno-0-100"></a><span class="
|
|
7914
|
-
<a id="__codelineno-0-101" name="__codelineno-0-101"></a>
|
|
7915
|
-
<a id="__codelineno-0-102" name="__codelineno-0-102"></a
|
|
7916
|
-
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
7917
|
-
<a id="__codelineno-0-104" name="__codelineno-0-104"></a>
|
|
7918
|
-
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="n">
|
|
7837
|
+
<a id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
|
|
7838
|
+
<a id="__codelineno-0-67" name="__codelineno-0-67"></a> <span class="n">route</span> <span class="o">=</span> <span class="n">get_route_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="n">api</span><span class="p">)</span>
|
|
7839
|
+
<a id="__codelineno-0-68" name="__codelineno-0-68"></a>
|
|
7840
|
+
<a id="__codelineno-0-69" name="__codelineno-0-69"></a> <span class="k">try</span><span class="p">:</span>
|
|
7841
|
+
<a id="__codelineno-0-70" name="__codelineno-0-70"></a> <span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="n">field</span><span class="p">:</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)})</span>
|
|
7842
|
+
<a id="__codelineno-0-71" name="__codelineno-0-71"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
7843
|
+
<a id="__codelineno-0-72" name="__codelineno-0-72"></a> <span class="k">continue</span>
|
|
7844
|
+
<a id="__codelineno-0-73" name="__codelineno-0-73"></a>
|
|
7845
|
+
<a id="__codelineno-0-74" name="__codelineno-0-74"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Cannot find a URL for </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
|
7846
|
+
<a id="__codelineno-0-75" name="__codelineno-0-75"></a>
|
|
7847
|
+
<a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="nd">@property</span>
|
|
7848
|
+
<a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="k">def</span> <span class="nf">present_in_database</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
7849
|
+
<a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7850
|
+
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> True if the record exists in the database, False if it does not.</span>
|
|
7851
|
+
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> """</span>
|
|
7852
|
+
<a id="__codelineno-0-81" name="__codelineno-0-81"></a> <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_state</span><span class="o">.</span><span class="n">adding</span>
|
|
7853
|
+
<a id="__codelineno-0-82" name="__codelineno-0-82"></a>
|
|
7854
|
+
<a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="nd">@classproperty</span> <span class="c1"># https://github.com/PyCQA/pylint-django/issues/240</span>
|
|
7855
|
+
<a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="k">def</span> <span class="nf">_content_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="c1"># pylint: disable=no-self-argument</span>
|
|
7856
|
+
<a id="__codelineno-0-85" name="__codelineno-0-85"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7857
|
+
<a id="__codelineno-0-86" name="__codelineno-0-86"></a><span class="sd"> Return the ContentType of the object, never cached.</span>
|
|
7858
|
+
<a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="sd"> """</span>
|
|
7859
|
+
<a id="__codelineno-0-88" name="__codelineno-0-88"></a> <span class="k">return</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="bp">cls</span><span class="p">)</span>
|
|
7860
|
+
<a id="__codelineno-0-89" name="__codelineno-0-89"></a>
|
|
7861
|
+
<a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="nd">@classproperty</span> <span class="c1"># https://github.com/PyCQA/pylint-django/issues/240</span>
|
|
7862
|
+
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="k">def</span> <span class="nf">_content_type_cache_key</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="c1"># pylint: disable=no-self-argument</span>
|
|
7863
|
+
<a id="__codelineno-0-92" name="__codelineno-0-92"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7864
|
+
<a id="__codelineno-0-93" name="__codelineno-0-93"></a><span class="sd"> Return the cache key for the ContentType of the object.</span>
|
|
7865
|
+
<a id="__codelineno-0-94" name="__codelineno-0-94"></a>
|
|
7866
|
+
<a id="__codelineno-0-95" name="__codelineno-0-95"></a><span class="sd"> Necessary for use with _content_type_cached and management commands.</span>
|
|
7867
|
+
<a id="__codelineno-0-96" name="__codelineno-0-96"></a><span class="sd"> """</span>
|
|
7868
|
+
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="si">}</span><span class="s2">._content_type"</span>
|
|
7869
|
+
<a id="__codelineno-0-98" name="__codelineno-0-98"></a>
|
|
7870
|
+
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="nd">@classproperty</span> <span class="c1"># https://github.com/PyCQA/pylint-django/issues/240</span>
|
|
7871
|
+
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">def</span> <span class="nf">_content_type_cached</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="c1"># pylint: disable=no-self-argument</span>
|
|
7872
|
+
<a id="__codelineno-0-101" name="__codelineno-0-101"></a><span class="w"> </span><span class="sd">"""</span>
|
|
7873
|
+
<a id="__codelineno-0-102" name="__codelineno-0-102"></a><span class="sd"> Return the ContentType of the object, cached.</span>
|
|
7874
|
+
<a id="__codelineno-0-103" name="__codelineno-0-103"></a><span class="sd"> """</span>
|
|
7875
|
+
<a id="__codelineno-0-104" name="__codelineno-0-104"></a>
|
|
7876
|
+
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="k">return</span> <span class="n">cache</span><span class="o">.</span><span class="n">get_or_set</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_content_type_cache_key</span><span class="p">,</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_content_type</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">CONTENT_TYPE_CACHE_TIMEOUT</span><span class="p">)</span>
|
|
7919
7877
|
<a id="__codelineno-0-106" name="__codelineno-0-106"></a>
|
|
7920
7878
|
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="k">def</span> <span class="nf">validated_save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
7921
7879
|
<a id="__codelineno-0-108" name="__codelineno-0-108"></a><span class="w"> </span><span class="sd">"""</span>
|
|
@@ -8242,7 +8200,11 @@ to provide custom handling for models with property-based natural keys.</p>
|
|
|
8242
8200
|
|
|
8243
8201
|
<details class="quote">
|
|
8244
8202
|
<summary>Source code in <code>nautobot/core/models/__init__.py</code></summary>
|
|
8245
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
8203
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-53">53</a></span>
|
|
8204
|
+
<span class="normal"><a href="#__codelineno-0-54">54</a></span>
|
|
8205
|
+
<span class="normal"><a href="#__codelineno-0-55">55</a></span>
|
|
8206
|
+
<span class="normal"><a href="#__codelineno-0-56">56</a></span>
|
|
8207
|
+
<span class="normal"><a href="#__codelineno-0-57">57</a></span>
|
|
8246
8208
|
<span class="normal"><a href="#__codelineno-0-58">58</a></span>
|
|
8247
8209
|
<span class="normal"><a href="#__codelineno-0-59">59</a></span>
|
|
8248
8210
|
<span class="normal"><a href="#__codelineno-0-60">60</a></span>
|
|
@@ -8259,32 +8221,28 @@ to provide custom handling for models with property-based natural keys.</p>
|
|
|
8259
8221
|
<span class="normal"><a href="#__codelineno-0-71">71</a></span>
|
|
8260
8222
|
<span class="normal"><a href="#__codelineno-0-72">72</a></span>
|
|
8261
8223
|
<span class="normal"><a href="#__codelineno-0-73">73</a></span>
|
|
8262
|
-
<span class="normal"><a href="#__codelineno-0-74">74</a></span>
|
|
8263
|
-
<
|
|
8264
|
-
<
|
|
8265
|
-
<
|
|
8266
|
-
<
|
|
8267
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a
|
|
8268
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a
|
|
8269
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="
|
|
8224
|
+
<span class="normal"><a href="#__codelineno-0-74">74</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-53" name="__codelineno-0-53"></a><span class="k">def</span> <span class="nf">get_absolute_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
8225
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a><span class="w"> </span><span class="sd">"""</span>
|
|
8226
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a><span class="sd"> Return the canonical URL for this object in either the UI or the REST API.</span>
|
|
8227
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a><span class="sd"> """</span>
|
|
8228
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
8229
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="c1"># Iterate the pk-like fields and try to get a URL, or return None.</span>
|
|
8230
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"pk"</span><span class="p">]</span>
|
|
8231
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="n">actions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"retrieve"</span><span class="p">,</span> <span class="s2">"detail"</span><span class="p">,</span> <span class="s2">""</span><span class="p">]</span> <span class="c1"># TODO: Eventually all retrieve</span>
|
|
8270
8232
|
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
8271
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="
|
|
8272
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
8273
|
-
<a id="__codelineno-0-64" name="__codelineno-0-64"></a>
|
|
8233
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
|
|
8234
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
|
|
8235
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">continue</span>
|
|
8274
8236
|
<a id="__codelineno-0-65" name="__codelineno-0-65"></a>
|
|
8275
|
-
<a id="__codelineno-0-66" name="__codelineno-0-66"></a>
|
|
8276
|
-
<a id="__codelineno-0-67" name="__codelineno-0-67"></a>
|
|
8277
|
-
<a id="__codelineno-0-68" name="__codelineno-0-68"></a>
|
|
8278
|
-
<a id="__codelineno-0-69" name="__codelineno-0-69"></a>
|
|
8279
|
-
<a id="__codelineno-0-70" name="__codelineno-0-70"></a>
|
|
8280
|
-
<a id="__codelineno-0-71" name="__codelineno-0-71"></a> <span class="
|
|
8281
|
-
<a id="__codelineno-0-72" name="__codelineno-0-72"></a>
|
|
8282
|
-
<a id="__codelineno-0-73" name="__codelineno-0-73"></a>
|
|
8283
|
-
<a id="__codelineno-0-74" name="__codelineno-0-74"></a>
|
|
8284
|
-
<a id="__codelineno-0-75" name="__codelineno-0-75"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
8285
|
-
<a id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="k">continue</span>
|
|
8286
|
-
<a id="__codelineno-0-77" name="__codelineno-0-77"></a>
|
|
8287
|
-
<a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Cannot find a URL for </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
|
8237
|
+
<a id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
|
|
8238
|
+
<a id="__codelineno-0-67" name="__codelineno-0-67"></a> <span class="n">route</span> <span class="o">=</span> <span class="n">get_route_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="n">api</span><span class="p">)</span>
|
|
8239
|
+
<a id="__codelineno-0-68" name="__codelineno-0-68"></a>
|
|
8240
|
+
<a id="__codelineno-0-69" name="__codelineno-0-69"></a> <span class="k">try</span><span class="p">:</span>
|
|
8241
|
+
<a id="__codelineno-0-70" name="__codelineno-0-70"></a> <span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="n">field</span><span class="p">:</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)})</span>
|
|
8242
|
+
<a id="__codelineno-0-71" name="__codelineno-0-71"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
8243
|
+
<a id="__codelineno-0-72" name="__codelineno-0-72"></a> <span class="k">continue</span>
|
|
8244
|
+
<a id="__codelineno-0-73" name="__codelineno-0-73"></a>
|
|
8245
|
+
<a id="__codelineno-0-74" name="__codelineno-0-74"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Cannot find a URL for </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="si">}</span><span class="s2">)"</span><span class="p">)</span>
|
|
8288
8246
|
</code></pre></div></td></tr></table></div>
|
|
8289
8247
|
</details>
|
|
8290
8248
|
</div>
|
|
@@ -8625,7 +8583,8 @@ null to facilitate adding these fields to existing instances via a database migr
|
|
|
8625
8583
|
|
|
8626
8584
|
<details class="quote">
|
|
8627
8585
|
<summary>Source code in <code>nautobot/extras/models/change_logging.py</code></summary>
|
|
8628
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
8586
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-22">22</a></span>
|
|
8587
|
+
<span class="normal"><a href="#__codelineno-0-23">23</a></span>
|
|
8629
8588
|
<span class="normal"><a href="#__codelineno-0-24">24</a></span>
|
|
8630
8589
|
<span class="normal"><a href="#__codelineno-0-25">25</a></span>
|
|
8631
8590
|
<span class="normal"><a href="#__codelineno-0-26">26</a></span>
|
|
@@ -8666,50 +8625,49 @@ null to facilitate adding these fields to existing instances via a database migr
|
|
|
8666
8625
|
<span class="normal"><a href="#__codelineno-0-61">61</a></span>
|
|
8667
8626
|
<span class="normal"><a href="#__codelineno-0-62">62</a></span>
|
|
8668
8627
|
<span class="normal"><a href="#__codelineno-0-63">63</a></span>
|
|
8669
|
-
<span class="normal"><a href="#__codelineno-0-64">64</a></span>
|
|
8670
|
-
<
|
|
8671
|
-
<a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="
|
|
8672
|
-
<a id="__codelineno-0-25" name="__codelineno-0-25"></a><span class="sd">
|
|
8673
|
-
<a id="__codelineno-0-26" name="__codelineno-0-26"></a><span class="sd">
|
|
8674
|
-
<a id="__codelineno-0-27" name="__codelineno-0-27"></a
|
|
8675
|
-
<a id="__codelineno-0-28" name="__codelineno-0-28"></a>
|
|
8676
|
-
<a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="n">
|
|
8677
|
-
<a id="__codelineno-0-30" name="__codelineno-0-30"></a>
|
|
8678
|
-
<a id="__codelineno-0-31" name="__codelineno-0-31"></a>
|
|
8679
|
-
<a id="__codelineno-0-32" name="__codelineno-0-32"></a>
|
|
8680
|
-
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
8681
|
-
<a id="__codelineno-0-34" name="__codelineno-0-34"></a>
|
|
8682
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a
|
|
8683
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="
|
|
8684
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd">
|
|
8685
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd">
|
|
8686
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a
|
|
8687
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a>
|
|
8688
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
8689
|
-
<a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="n">
|
|
8690
|
-
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="n">
|
|
8691
|
-
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="n">
|
|
8692
|
-
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">
|
|
8693
|
-
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="n">
|
|
8694
|
-
<a id="__codelineno-0-47" name="__codelineno-0-47"></a>
|
|
8695
|
-
<a id="__codelineno-0-48" name="__codelineno-0-48"></a>
|
|
8696
|
-
<a id="__codelineno-0-49" name="__codelineno-0-49"></a>
|
|
8697
|
-
<a id="__codelineno-0-50" name="__codelineno-0-50"></a
|
|
8698
|
-
<a id="__codelineno-0-51" name="__codelineno-0-51"></a
|
|
8699
|
-
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
8700
|
-
<a id="__codelineno-0-53" name="__codelineno-0-53"></a>
|
|
8701
|
-
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="
|
|
8702
|
-
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="
|
|
8703
|
-
<a id="__codelineno-0-56" name="__codelineno-0-56"></a>
|
|
8704
|
-
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
8705
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
8706
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a>
|
|
8707
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a>
|
|
8708
|
-
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
8709
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
8710
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
8711
|
-
<a id="__codelineno-0-64" name="__codelineno-0-64"></a>
|
|
8712
|
-
<a id="__codelineno-0-65" name="__codelineno-0-65"></a> <span class="k">return</span> <span class="kc">None</span>
|
|
8628
|
+
<span class="normal"><a href="#__codelineno-0-64">64</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="k">class</span> <span class="nc">ChangeLoggedModel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
|
|
8629
|
+
<a id="__codelineno-0-23" name="__codelineno-0-23"></a><span class="w"> </span><span class="sd">"""</span>
|
|
8630
|
+
<a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="sd"> An abstract model which adds fields to store the creation and last-updated times for an object. Both fields can be</span>
|
|
8631
|
+
<a id="__codelineno-0-25" name="__codelineno-0-25"></a><span class="sd"> null to facilitate adding these fields to existing instances via a database migration.</span>
|
|
8632
|
+
<a id="__codelineno-0-26" name="__codelineno-0-26"></a><span class="sd"> """</span>
|
|
8633
|
+
<a id="__codelineno-0-27" name="__codelineno-0-27"></a>
|
|
8634
|
+
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="n">created</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
8635
|
+
<a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="n">last_updated</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">blank</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
8636
|
+
<a id="__codelineno-0-30" name="__codelineno-0-30"></a>
|
|
8637
|
+
<a id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
8638
|
+
<a id="__codelineno-0-32" name="__codelineno-0-32"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
8639
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
8640
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="k">def</span> <span class="nf">to_objectchange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">related_object</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">object_data_extra</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">object_data_exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
8641
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="w"> </span><span class="sd">"""</span>
|
|
8642
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> Return a new ObjectChange representing a change made to this object. This will typically be called automatically</span>
|
|
8643
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> by ChangeLoggingMiddleware.</span>
|
|
8644
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> """</span>
|
|
8645
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a>
|
|
8646
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">return</span> <span class="n">ObjectChange</span><span class="p">(</span>
|
|
8647
|
+
<a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="n">changed_object</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
|
|
8648
|
+
<a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="n">object_repr</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)[:</span><span class="n">CHANGELOG_MAX_OBJECT_REPR</span><span class="p">],</span>
|
|
8649
|
+
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">,</span>
|
|
8650
|
+
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="n">object_data</span><span class="o">=</span><span class="n">serialize_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="n">object_data_extra</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="n">object_data_exclude</span><span class="p">),</span>
|
|
8651
|
+
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">object_data_v2</span><span class="o">=</span><span class="n">serialize_object_v2</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
|
|
8652
|
+
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="n">related_object</span><span class="o">=</span><span class="n">related_object</span><span class="p">,</span>
|
|
8653
|
+
<a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="p">)</span>
|
|
8654
|
+
<a id="__codelineno-0-48" name="__codelineno-0-48"></a>
|
|
8655
|
+
<a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="k">def</span> <span class="nf">get_changelog_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
8656
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="w"> </span><span class="sd">"""Return the changelog URL for this object."""</span>
|
|
8657
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">route</span> <span class="o">=</span> <span class="n">get_route_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"changelog"</span><span class="p">)</span>
|
|
8658
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
8659
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="c1"># Iterate the pk-like fields and try to get a URL, or return None.</span>
|
|
8660
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"pk"</span><span class="p">,</span> <span class="s2">"slug"</span><span class="p">]</span>
|
|
8661
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
|
|
8662
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
|
|
8663
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">continue</span>
|
|
8664
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
8665
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">try</span><span class="p">:</span>
|
|
8666
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="n">field</span><span class="p">:</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)})</span>
|
|
8667
|
+
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
8668
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="k">continue</span>
|
|
8669
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
8670
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">return</span> <span class="kc">None</span>
|
|
8713
8671
|
</code></pre></div></td></tr></table></div>
|
|
8714
8672
|
</details>
|
|
8715
8673
|
|
|
@@ -8742,7 +8700,8 @@ null to facilitate adding these fields to existing instances via a database migr
|
|
|
8742
8700
|
|
|
8743
8701
|
<details class="quote">
|
|
8744
8702
|
<summary>Source code in <code>nautobot/extras/models/change_logging.py</code></summary>
|
|
8745
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
8703
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-49">49</a></span>
|
|
8704
|
+
<span class="normal"><a href="#__codelineno-0-50">50</a></span>
|
|
8746
8705
|
<span class="normal"><a href="#__codelineno-0-51">51</a></span>
|
|
8747
8706
|
<span class="normal"><a href="#__codelineno-0-52">52</a></span>
|
|
8748
8707
|
<span class="normal"><a href="#__codelineno-0-53">53</a></span>
|
|
@@ -8756,23 +8715,22 @@ null to facilitate adding these fields to existing instances via a database migr
|
|
|
8756
8715
|
<span class="normal"><a href="#__codelineno-0-61">61</a></span>
|
|
8757
8716
|
<span class="normal"><a href="#__codelineno-0-62">62</a></span>
|
|
8758
8717
|
<span class="normal"><a href="#__codelineno-0-63">63</a></span>
|
|
8759
|
-
<span class="normal"><a href="#__codelineno-0-64">64</a></span>
|
|
8760
|
-
<
|
|
8761
|
-
<a id="__codelineno-0-51" name="__codelineno-0-51"></a
|
|
8762
|
-
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
8763
|
-
<a id="__codelineno-0-53" name="__codelineno-0-53"></a>
|
|
8764
|
-
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="
|
|
8765
|
-
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="
|
|
8766
|
-
<a id="__codelineno-0-56" name="__codelineno-0-56"></a>
|
|
8767
|
-
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
8768
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
8769
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a>
|
|
8770
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a>
|
|
8771
|
-
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
8772
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
8773
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
8774
|
-
<a id="__codelineno-0-64" name="__codelineno-0-64"></a>
|
|
8775
|
-
<a id="__codelineno-0-65" name="__codelineno-0-65"></a> <span class="k">return</span> <span class="kc">None</span>
|
|
8718
|
+
<span class="normal"><a href="#__codelineno-0-64">64</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="k">def</span> <span class="nf">get_changelog_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
8719
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="w"> </span><span class="sd">"""Return the changelog URL for this object."""</span>
|
|
8720
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">route</span> <span class="o">=</span> <span class="n">get_route_for_model</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"changelog"</span><span class="p">)</span>
|
|
8721
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
8722
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="c1"># Iterate the pk-like fields and try to get a URL, or return None.</span>
|
|
8723
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"pk"</span><span class="p">,</span> <span class="s2">"slug"</span><span class="p">]</span>
|
|
8724
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
|
|
8725
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">):</span>
|
|
8726
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">continue</span>
|
|
8727
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
8728
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">try</span><span class="p">:</span>
|
|
8729
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">return</span> <span class="n">reverse</span><span class="p">(</span><span class="n">route</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="n">field</span><span class="p">:</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">)})</span>
|
|
8730
|
+
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
8731
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="k">continue</span>
|
|
8732
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
8733
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">return</span> <span class="kc">None</span>
|
|
8776
8734
|
</code></pre></div></td></tr></table></div>
|
|
8777
8735
|
</details>
|
|
8778
8736
|
</div>
|
|
@@ -8797,7 +8755,8 @@ by ChangeLoggingMiddleware.</p>
|
|
|
8797
8755
|
|
|
8798
8756
|
<details class="quote">
|
|
8799
8757
|
<summary>Source code in <code>nautobot/extras/models/change_logging.py</code></summary>
|
|
8800
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
8758
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-34">34</a></span>
|
|
8759
|
+
<span class="normal"><a href="#__codelineno-0-35">35</a></span>
|
|
8801
8760
|
<span class="normal"><a href="#__codelineno-0-36">36</a></span>
|
|
8802
8761
|
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
|
|
8803
8762
|
<span class="normal"><a href="#__codelineno-0-38">38</a></span>
|
|
@@ -8809,21 +8768,20 @@ by ChangeLoggingMiddleware.</p>
|
|
|
8809
8768
|
<span class="normal"><a href="#__codelineno-0-44">44</a></span>
|
|
8810
8769
|
<span class="normal"><a href="#__codelineno-0-45">45</a></span>
|
|
8811
8770
|
<span class="normal"><a href="#__codelineno-0-46">46</a></span>
|
|
8812
|
-
<span class="normal"><a href="#__codelineno-0-47">47</a></span>
|
|
8813
|
-
<
|
|
8814
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="
|
|
8815
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd">
|
|
8816
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd">
|
|
8817
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a
|
|
8818
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a>
|
|
8819
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
8820
|
-
<a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="n">
|
|
8821
|
-
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="n">
|
|
8822
|
-
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="n">
|
|
8823
|
-
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">
|
|
8824
|
-
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="n">
|
|
8825
|
-
<a id="__codelineno-0-47" name="__codelineno-0-47"></a>
|
|
8826
|
-
<a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="p">)</span>
|
|
8771
|
+
<span class="normal"><a href="#__codelineno-0-47">47</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-34" name="__codelineno-0-34"></a><span class="k">def</span> <span class="nf">to_objectchange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">related_object</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">object_data_extra</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">object_data_exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
8772
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="w"> </span><span class="sd">"""</span>
|
|
8773
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> Return a new ObjectChange representing a change made to this object. This will typically be called automatically</span>
|
|
8774
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> by ChangeLoggingMiddleware.</span>
|
|
8775
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> """</span>
|
|
8776
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a>
|
|
8777
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">return</span> <span class="n">ObjectChange</span><span class="p">(</span>
|
|
8778
|
+
<a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="n">changed_object</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span>
|
|
8779
|
+
<a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="n">object_repr</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)[:</span><span class="n">CHANGELOG_MAX_OBJECT_REPR</span><span class="p">],</span>
|
|
8780
|
+
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">,</span>
|
|
8781
|
+
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="n">object_data</span><span class="o">=</span><span class="n">serialize_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">extra</span><span class="o">=</span><span class="n">object_data_extra</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="n">object_data_exclude</span><span class="p">),</span>
|
|
8782
|
+
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">object_data_v2</span><span class="o">=</span><span class="n">serialize_object_v2</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
|
|
8783
|
+
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="n">related_object</span><span class="o">=</span><span class="n">related_object</span><span class="p">,</span>
|
|
8784
|
+
<a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="p">)</span>
|
|
8827
8785
|
</code></pre></div></td></tr></table></div>
|
|
8828
8786
|
</details>
|
|
8829
8787
|
</div>
|
|
@@ -10649,7 +10607,8 @@ should be set as a string in the form <code><app_label>.<model_name>
|
|
|
10649
10607
|
|
|
10650
10608
|
<details class="quote">
|
|
10651
10609
|
<summary>Source code in <code>nautobot/extras/plugins/__init__.py</code></summary>
|
|
10652
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
10610
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-527">527</a></span>
|
|
10611
|
+
<span class="normal"><a href="#__codelineno-0-528">528</a></span>
|
|
10653
10612
|
<span class="normal"><a href="#__codelineno-0-529">529</a></span>
|
|
10654
10613
|
<span class="normal"><a href="#__codelineno-0-530">530</a></span>
|
|
10655
10614
|
<span class="normal"><a href="#__codelineno-0-531">531</a></span>
|
|
@@ -10678,38 +10637,37 @@ should be set as a string in the form <code><app_label>.<model_name>
|
|
|
10678
10637
|
<span class="normal"><a href="#__codelineno-0-554">554</a></span>
|
|
10679
10638
|
<span class="normal"><a href="#__codelineno-0-555">555</a></span>
|
|
10680
10639
|
<span class="normal"><a href="#__codelineno-0-556">556</a></span>
|
|
10681
|
-
<span class="normal"><a href="#__codelineno-0-557">557</a></span>
|
|
10682
|
-
<
|
|
10683
|
-
<a id="__codelineno-0-529" name="__codelineno-0-529"></a><span class="
|
|
10684
|
-
<a id="__codelineno-0-530" name="__codelineno-0-530"></a><span class="sd">
|
|
10685
|
-
<a id="__codelineno-0-531" name="__codelineno-0-531"></a><span class="sd">
|
|
10686
|
-
<a id="__codelineno-0-532" name="__codelineno-0-532"></a><span class="sd">
|
|
10687
|
-
<a id="__codelineno-0-533" name="__codelineno-0-533"></a
|
|
10688
|
-
<a id="__codelineno-0-534" name="__codelineno-0-534"></a>
|
|
10689
|
-
<a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="sd">
|
|
10690
|
-
<a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="sd">
|
|
10691
|
-
<a id="__codelineno-0-537" name="__codelineno-0-537"></a
|
|
10692
|
-
<a id="__codelineno-0-538" name="__codelineno-0-538"></a>
|
|
10693
|
-
<a id="__codelineno-0-539" name="__codelineno-0-539"></a>
|
|
10694
|
-
<a id="__codelineno-0-540" name="__codelineno-0-540"></a>
|
|
10695
|
-
<a id="__codelineno-0-541" name="__codelineno-0-541"></a>
|
|
10696
|
-
<a id="__codelineno-0-542" name="__codelineno-0-542"></a>
|
|
10697
|
-
<a id="__codelineno-0-543" name="__codelineno-0-543"></a>
|
|
10698
|
-
<a id="__codelineno-0-544" name="__codelineno-0-544"></a
|
|
10699
|
-
<a id="__codelineno-0-545" name="__codelineno-0-545"></a><span class="
|
|
10700
|
-
<a id="__codelineno-0-546" name="__codelineno-0-546"></a><span class="sd">
|
|
10701
|
-
<a id="__codelineno-0-547" name="__codelineno-0-547"></a><span class="sd">
|
|
10702
|
-
<a id="__codelineno-0-548" name="__codelineno-0-548"></a><span class="
|
|
10703
|
-
<a id="__codelineno-0-549" name="__codelineno-0-549"></a>
|
|
10704
|
-
<a id="__codelineno-0-550" name="__codelineno-0-550"></a>
|
|
10705
|
-
<a id="__codelineno-0-551" name="__codelineno-0-551"></a
|
|
10706
|
-
<a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="
|
|
10707
|
-
<a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd">
|
|
10708
|
-
<a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd">
|
|
10709
|
-
<a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd">
|
|
10710
|
-
<a id="__codelineno-0-556" name="__codelineno-0-556"></a><span class="sd">
|
|
10711
|
-
<a id="__codelineno-0-557" name="__codelineno-0-557"></a
|
|
10712
|
-
<a id="__codelineno-0-558" name="__codelineno-0-558"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
|
|
10640
|
+
<span class="normal"><a href="#__codelineno-0-557">557</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-527" name="__codelineno-0-527"></a><span class="k">class</span> <span class="nc">CustomValidator</span><span class="p">:</span>
|
|
10641
|
+
<a id="__codelineno-0-528" name="__codelineno-0-528"></a><span class="w"> </span><span class="sd">"""</span>
|
|
10642
|
+
<a id="__codelineno-0-529" name="__codelineno-0-529"></a><span class="sd"> This class is used to register plugin custom model validators which act on specified models. It contains the clean</span>
|
|
10643
|
+
<a id="__codelineno-0-530" name="__codelineno-0-530"></a><span class="sd"> method which is overridden by plugin authors to execute custom validation logic. Plugin authors must raise</span>
|
|
10644
|
+
<a id="__codelineno-0-531" name="__codelineno-0-531"></a><span class="sd"> ValidationError within this method to trigger validation error messages which are propagated to the user.</span>
|
|
10645
|
+
<a id="__codelineno-0-532" name="__codelineno-0-532"></a><span class="sd"> A convenience method `validation_error(<message>)` may be used for this purpose.</span>
|
|
10646
|
+
<a id="__codelineno-0-533" name="__codelineno-0-533"></a>
|
|
10647
|
+
<a id="__codelineno-0-534" name="__codelineno-0-534"></a><span class="sd"> The `model` attribute on the class defines the model to which this validator is registered. It</span>
|
|
10648
|
+
<a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="sd"> should be set as a string in the form `<app_label>.<model_name>`.</span>
|
|
10649
|
+
<a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="sd"> """</span>
|
|
10650
|
+
<a id="__codelineno-0-537" name="__codelineno-0-537"></a>
|
|
10651
|
+
<a id="__codelineno-0-538" name="__codelineno-0-538"></a> <span class="n">model</span> <span class="o">=</span> <span class="kc">None</span>
|
|
10652
|
+
<a id="__codelineno-0-539" name="__codelineno-0-539"></a>
|
|
10653
|
+
<a id="__codelineno-0-540" name="__codelineno-0-540"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
10654
|
+
<a id="__codelineno-0-541" name="__codelineno-0-541"></a> <span class="bp">self</span><span class="o">.</span><span class="n">context</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>
|
|
10655
|
+
<a id="__codelineno-0-542" name="__codelineno-0-542"></a>
|
|
10656
|
+
<a id="__codelineno-0-543" name="__codelineno-0-543"></a> <span class="k">def</span> <span class="nf">validation_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
|
|
10657
|
+
<a id="__codelineno-0-544" name="__codelineno-0-544"></a><span class="w"> </span><span class="sd">"""</span>
|
|
10658
|
+
<a id="__codelineno-0-545" name="__codelineno-0-545"></a><span class="sd"> Convenience method for raising `django.core.exceptions.ValidationError` which is required in order to</span>
|
|
10659
|
+
<a id="__codelineno-0-546" name="__codelineno-0-546"></a><span class="sd"> trigger validation error messages which are propagated to the user.</span>
|
|
10660
|
+
<a id="__codelineno-0-547" name="__codelineno-0-547"></a><span class="sd"> """</span>
|
|
10661
|
+
<a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
|
|
10662
|
+
<a id="__codelineno-0-549" name="__codelineno-0-549"></a>
|
|
10663
|
+
<a id="__codelineno-0-550" name="__codelineno-0-550"></a> <span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
10664
|
+
<a id="__codelineno-0-551" name="__codelineno-0-551"></a><span class="w"> </span><span class="sd">"""</span>
|
|
10665
|
+
<a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="sd"> Implement custom model validation in the standard Django clean method pattern. The model instance is accessed</span>
|
|
10666
|
+
<a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd"> with the `object` key within `self.context`, e.g. `self.context['object']`. ValidationError must be raised to</span>
|
|
10667
|
+
<a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd"> prevent saving model instance changes, and propagate messages to the user. For convenience,</span>
|
|
10668
|
+
<a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd"> `self.validation_error(<message>)` may be called to raise a ValidationError.</span>
|
|
10669
|
+
<a id="__codelineno-0-556" name="__codelineno-0-556"></a><span class="sd"> """</span>
|
|
10670
|
+
<a id="__codelineno-0-557" name="__codelineno-0-557"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
|
|
10713
10671
|
</code></pre></div></td></tr></table></div>
|
|
10714
10672
|
</details>
|
|
10715
10673
|
|
|
@@ -10745,21 +10703,21 @@ prevent saving model instance changes, and propagate messages to the user. For c
|
|
|
10745
10703
|
|
|
10746
10704
|
<details class="quote">
|
|
10747
10705
|
<summary>Source code in <code>nautobot/extras/plugins/__init__.py</code></summary>
|
|
10748
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
10706
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-550">550</a></span>
|
|
10707
|
+
<span class="normal"><a href="#__codelineno-0-551">551</a></span>
|
|
10749
10708
|
<span class="normal"><a href="#__codelineno-0-552">552</a></span>
|
|
10750
10709
|
<span class="normal"><a href="#__codelineno-0-553">553</a></span>
|
|
10751
10710
|
<span class="normal"><a href="#__codelineno-0-554">554</a></span>
|
|
10752
10711
|
<span class="normal"><a href="#__codelineno-0-555">555</a></span>
|
|
10753
10712
|
<span class="normal"><a href="#__codelineno-0-556">556</a></span>
|
|
10754
|
-
<span class="normal"><a href="#__codelineno-0-557">557</a></span>
|
|
10755
|
-
<
|
|
10756
|
-
<a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="
|
|
10757
|
-
<a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd">
|
|
10758
|
-
<a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd">
|
|
10759
|
-
<a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd">
|
|
10760
|
-
<a id="__codelineno-0-556" name="__codelineno-0-556"></a><span class="sd">
|
|
10761
|
-
<a id="__codelineno-0-557" name="__codelineno-0-557"></a
|
|
10762
|
-
<a id="__codelineno-0-558" name="__codelineno-0-558"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
|
|
10713
|
+
<span class="normal"><a href="#__codelineno-0-557">557</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-550" name="__codelineno-0-550"></a><span class="k">def</span> <span class="nf">clean</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
10714
|
+
<a id="__codelineno-0-551" name="__codelineno-0-551"></a><span class="w"> </span><span class="sd">"""</span>
|
|
10715
|
+
<a id="__codelineno-0-552" name="__codelineno-0-552"></a><span class="sd"> Implement custom model validation in the standard Django clean method pattern. The model instance is accessed</span>
|
|
10716
|
+
<a id="__codelineno-0-553" name="__codelineno-0-553"></a><span class="sd"> with the `object` key within `self.context`, e.g. `self.context['object']`. ValidationError must be raised to</span>
|
|
10717
|
+
<a id="__codelineno-0-554" name="__codelineno-0-554"></a><span class="sd"> prevent saving model instance changes, and propagate messages to the user. For convenience,</span>
|
|
10718
|
+
<a id="__codelineno-0-555" name="__codelineno-0-555"></a><span class="sd"> `self.validation_error(<message>)` may be called to raise a ValidationError.</span>
|
|
10719
|
+
<a id="__codelineno-0-556" name="__codelineno-0-556"></a><span class="sd"> """</span>
|
|
10720
|
+
<a id="__codelineno-0-557" name="__codelineno-0-557"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span>
|
|
10763
10721
|
</code></pre></div></td></tr></table></div>
|
|
10764
10722
|
</details>
|
|
10765
10723
|
</div>
|
|
@@ -10784,17 +10742,17 @@ trigger validation error messages which are propagated to the user.</p>
|
|
|
10784
10742
|
|
|
10785
10743
|
<details class="quote">
|
|
10786
10744
|
<summary>Source code in <code>nautobot/extras/plugins/__init__.py</code></summary>
|
|
10787
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
10745
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-543">543</a></span>
|
|
10746
|
+
<span class="normal"><a href="#__codelineno-0-544">544</a></span>
|
|
10788
10747
|
<span class="normal"><a href="#__codelineno-0-545">545</a></span>
|
|
10789
10748
|
<span class="normal"><a href="#__codelineno-0-546">546</a></span>
|
|
10790
10749
|
<span class="normal"><a href="#__codelineno-0-547">547</a></span>
|
|
10791
|
-
<span class="normal"><a href="#__codelineno-0-548">548</a></span>
|
|
10792
|
-
<
|
|
10793
|
-
<a id="__codelineno-0-545" name="__codelineno-0-545"></a><span class="
|
|
10794
|
-
<a id="__codelineno-0-546" name="__codelineno-0-546"></a><span class="sd">
|
|
10795
|
-
<a id="__codelineno-0-547" name="__codelineno-0-547"></a><span class="sd">
|
|
10796
|
-
<a id="__codelineno-0-548" name="__codelineno-0-548"></a><span class="
|
|
10797
|
-
<a id="__codelineno-0-549" name="__codelineno-0-549"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
|
|
10750
|
+
<span class="normal"><a href="#__codelineno-0-548">548</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-543" name="__codelineno-0-543"></a><span class="k">def</span> <span class="nf">validation_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
|
|
10751
|
+
<a id="__codelineno-0-544" name="__codelineno-0-544"></a><span class="w"> </span><span class="sd">"""</span>
|
|
10752
|
+
<a id="__codelineno-0-545" name="__codelineno-0-545"></a><span class="sd"> Convenience method for raising `django.core.exceptions.ValidationError` which is required in order to</span>
|
|
10753
|
+
<a id="__codelineno-0-546" name="__codelineno-0-546"></a><span class="sd"> trigger validation error messages which are propagated to the user.</span>
|
|
10754
|
+
<a id="__codelineno-0-547" name="__codelineno-0-547"></a><span class="sd"> """</span>
|
|
10755
|
+
<a id="__codelineno-0-548" name="__codelineno-0-548"></a> <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
|
|
10798
10756
|
</code></pre></div></td></tr></table></div>
|
|
10799
10757
|
</details>
|
|
10800
10758
|
</div>
|
|
@@ -12887,7 +12845,8 @@ Device Role, Rack Group, Status, Manufacturer, and Platform.</p>
|
|
|
12887
12845
|
|
|
12888
12846
|
<details class="quote">
|
|
12889
12847
|
<summary>Source code in <code>nautobot/core/models/generics.py</code></summary>
|
|
12890
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
12848
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-13">13</a></span>
|
|
12849
|
+
<span class="normal"><a href="#__codelineno-0-14">14</a></span>
|
|
12891
12850
|
<span class="normal"><a href="#__codelineno-0-15">15</a></span>
|
|
12892
12851
|
<span class="normal"><a href="#__codelineno-0-16">16</a></span>
|
|
12893
12852
|
<span class="normal"><a href="#__codelineno-0-17">17</a></span>
|
|
@@ -12900,22 +12859,21 @@ Device Role, Rack Group, Status, Manufacturer, and Platform.</p>
|
|
|
12900
12859
|
<span class="normal"><a href="#__codelineno-0-24">24</a></span>
|
|
12901
12860
|
<span class="normal"><a href="#__codelineno-0-25">25</a></span>
|
|
12902
12861
|
<span class="normal"><a href="#__codelineno-0-26">26</a></span>
|
|
12903
|
-
<span class="normal"><a href="#__codelineno-0-27">27</a></span>
|
|
12904
|
-
<
|
|
12905
|
-
<a id="__codelineno-0-15" name="__codelineno-0-15"></a
|
|
12906
|
-
<a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="
|
|
12907
|
-
<a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="
|
|
12908
|
-
<a id="__codelineno-0-18" name="__codelineno-0-18"></a
|
|
12909
|
-
<a id="__codelineno-0-19" name="__codelineno-0-19"></a>
|
|
12910
|
-
<a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="sd">
|
|
12911
|
-
<a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd">
|
|
12912
|
-
<a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd">
|
|
12913
|
-
<a id="__codelineno-0-23" name="__codelineno-0-23"></a><span class="sd">
|
|
12914
|
-
<a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="sd">
|
|
12915
|
-
<a id="__codelineno-0-25" name="__codelineno-0-25"></a
|
|
12916
|
-
<a id="__codelineno-0-26" name="__codelineno-0-26"></a>
|
|
12917
|
-
<a id="__codelineno-0-27" name="__codelineno-0-27"></a>
|
|
12918
|
-
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
12862
|
+
<span class="normal"><a href="#__codelineno-0-27">27</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="k">class</span> <span class="nc">OrganizationalModel</span><span class="p">(</span>
|
|
12863
|
+
<a id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="n">BaseModel</span><span class="p">,</span> <span class="n">ChangeLoggedModel</span><span class="p">,</span> <span class="n">CustomFieldModel</span><span class="p">,</span> <span class="n">RelationshipModel</span><span class="p">,</span> <span class="n">DynamicGroupMixin</span><span class="p">,</span> <span class="n">NotesMixin</span>
|
|
12864
|
+
<a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="p">):</span>
|
|
12865
|
+
<a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="w"> </span><span class="sd">"""</span>
|
|
12866
|
+
<a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="sd"> Base abstract model for all organizational models.</span>
|
|
12867
|
+
<a id="__codelineno-0-18" name="__codelineno-0-18"></a>
|
|
12868
|
+
<a id="__codelineno-0-19" name="__codelineno-0-19"></a><span class="sd"> Organizational models aid the primary models by building structured relationships</span>
|
|
12869
|
+
<a id="__codelineno-0-20" name="__codelineno-0-20"></a><span class="sd"> and logical groups, or categorizations. Organizational models do not typically</span>
|
|
12870
|
+
<a id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="sd"> represent concrete networking resources or assets, but rather they enable user</span>
|
|
12871
|
+
<a id="__codelineno-0-22" name="__codelineno-0-22"></a><span class="sd"> specific use cases and metadata about network resources. Examples include</span>
|
|
12872
|
+
<a id="__codelineno-0-23" name="__codelineno-0-23"></a><span class="sd"> Device Role, Rack Group, Status, Manufacturer, and Platform.</span>
|
|
12873
|
+
<a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="sd"> """</span>
|
|
12874
|
+
<a id="__codelineno-0-25" name="__codelineno-0-25"></a>
|
|
12875
|
+
<a id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
12876
|
+
<a id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
12919
12877
|
</code></pre></div></td></tr></table></div>
|
|
12920
12878
|
</details>
|
|
12921
12879
|
|
|
@@ -12963,7 +12921,8 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
12963
12921
|
|
|
12964
12922
|
<details class="quote">
|
|
12965
12923
|
<summary>Source code in <code>nautobot/core/models/generics.py</code></summary>
|
|
12966
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
12924
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-30">30</a></span>
|
|
12925
|
+
<span class="normal"><a href="#__codelineno-0-31">31</a></span>
|
|
12967
12926
|
<span class="normal"><a href="#__codelineno-0-32">32</a></span>
|
|
12968
12927
|
<span class="normal"><a href="#__codelineno-0-33">33</a></span>
|
|
12969
12928
|
<span class="normal"><a href="#__codelineno-0-34">34</a></span>
|
|
@@ -12975,21 +12934,20 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
12975
12934
|
<span class="normal"><a href="#__codelineno-0-40">40</a></span>
|
|
12976
12935
|
<span class="normal"><a href="#__codelineno-0-41">41</a></span>
|
|
12977
12936
|
<span class="normal"><a href="#__codelineno-0-42">42</a></span>
|
|
12978
|
-
<span class="normal"><a href="#__codelineno-0-43">43</a></span>
|
|
12979
|
-
<
|
|
12980
|
-
<a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="
|
|
12981
|
-
<a id="__codelineno-0-33" name="__codelineno-0-33"></a
|
|
12982
|
-
<a id="__codelineno-0-34" name="__codelineno-0-34"></a>
|
|
12983
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd">
|
|
12984
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd">
|
|
12985
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd">
|
|
12986
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd">
|
|
12987
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a
|
|
12988
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a>
|
|
12989
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
12990
|
-
<a id="__codelineno-0-42" name="__codelineno-0-42"></a>
|
|
12991
|
-
<a id="__codelineno-0-43" name="__codelineno-0-43"></a>
|
|
12992
|
-
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
12937
|
+
<span class="normal"><a href="#__codelineno-0-43">43</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-30" name="__codelineno-0-30"></a><span class="k">class</span> <span class="nc">PrimaryModel</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">,</span> <span class="n">ChangeLoggedModel</span><span class="p">,</span> <span class="n">CustomFieldModel</span><span class="p">,</span> <span class="n">RelationshipModel</span><span class="p">,</span> <span class="n">DynamicGroupMixin</span><span class="p">,</span> <span class="n">NotesMixin</span><span class="p">):</span>
|
|
12938
|
+
<a id="__codelineno-0-31" name="__codelineno-0-31"></a><span class="w"> </span><span class="sd">"""</span>
|
|
12939
|
+
<a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="sd"> Base abstract model for all primary models.</span>
|
|
12940
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
12941
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a><span class="sd"> A primary model is one which is materialistically relevant to the network datamodel.</span>
|
|
12942
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd"> Such models form the basis of major elements of the data model, like Device,</span>
|
|
12943
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> IP Address, Location, VLAN, Virtual Machine, etc. Primary models usually represent</span>
|
|
12944
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> tangible or logical resources on the network, or within the organization.</span>
|
|
12945
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> """</span>
|
|
12946
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a>
|
|
12947
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="n">tags</span> <span class="o">=</span> <span class="n">TagsField</span><span class="p">()</span>
|
|
12948
|
+
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
12949
|
+
<a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
12950
|
+
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
12993
12951
|
</code></pre></div></td></tr></table></div>
|
|
12994
12952
|
</details>
|
|
12995
12953
|
|
|
@@ -13033,7 +12991,8 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
13033
12991
|
|
|
13034
12992
|
<details class="quote">
|
|
13035
12993
|
<summary>Source code in <code>nautobot/extras/models/relationships.py</code></summary>
|
|
13036
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
12994
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-35"> 35</a></span>
|
|
12995
|
+
<span class="normal"><a href="#__codelineno-0-36"> 36</a></span>
|
|
13037
12996
|
<span class="normal"><a href="#__codelineno-0-37"> 37</a></span>
|
|
13038
12997
|
<span class="normal"><a href="#__codelineno-0-38"> 38</a></span>
|
|
13039
12998
|
<span class="normal"><a href="#__codelineno-0-39"> 39</a></span>
|
|
@@ -13322,298 +13281,297 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
13322
13281
|
<span class="normal"><a href="#__codelineno-0-322">322</a></span>
|
|
13323
13282
|
<span class="normal"><a href="#__codelineno-0-323">323</a></span>
|
|
13324
13283
|
<span class="normal"><a href="#__codelineno-0-324">324</a></span>
|
|
13325
|
-
<span class="normal"><a href="#__codelineno-0-325">325</a></span>
|
|
13326
|
-
<
|
|
13327
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="
|
|
13328
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd">
|
|
13329
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a
|
|
13330
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a>
|
|
13331
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
13332
|
-
<a id="__codelineno-0-42" name="__codelineno-0-42"></a>
|
|
13333
|
-
<a id="__codelineno-0-43" name="__codelineno-0-43"></a>
|
|
13334
|
-
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="c1">#
|
|
13335
|
-
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="c1">#
|
|
13336
|
-
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="
|
|
13337
|
-
<a id="__codelineno-0-47" name="__codelineno-0-47"></a>
|
|
13338
|
-
<a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="s2">"
|
|
13339
|
-
<a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="n">
|
|
13340
|
-
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="n">
|
|
13341
|
-
<a id="__codelineno-0-51" name="__codelineno-0-51"></a>
|
|
13342
|
-
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="p">
|
|
13343
|
-
<a id="__codelineno-0-53" name="__codelineno-0-53"></a>
|
|
13344
|
-
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="s2">"
|
|
13345
|
-
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="n">
|
|
13346
|
-
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="n">
|
|
13347
|
-
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
13348
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
13349
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a>
|
|
13350
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="
|
|
13351
|
-
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
13352
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
13353
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
13354
|
-
<a id="__codelineno-0-64" name="__codelineno-0-64"></a
|
|
13355
|
-
<a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="
|
|
13356
|
-
<a id="__codelineno-0-66" name="__codelineno-0-66"></a
|
|
13357
|
-
<a id="__codelineno-0-67" name="__codelineno-0-67"></a>
|
|
13358
|
-
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd">
|
|
13359
|
-
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd">
|
|
13360
|
-
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd">
|
|
13361
|
-
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> <Relationship instance #
|
|
13362
|
-
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd">
|
|
13363
|
-
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd">
|
|
13364
|
-
<a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd">
|
|
13365
|
-
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> <Relationship instance #
|
|
13366
|
-
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="sd">
|
|
13367
|
-
<a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="sd">
|
|
13368
|
-
<a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="sd">
|
|
13369
|
-
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> <Relationship instance #
|
|
13370
|
-
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd">
|
|
13371
|
-
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd">
|
|
13372
|
-
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd">
|
|
13373
|
-
<a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="
|
|
13374
|
-
<a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="
|
|
13375
|
-
<a id="__codelineno-0-85" name="__codelineno-0-85"></a>
|
|
13376
|
-
<a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">
|
|
13377
|
-
<a id="__codelineno-0-87" name="__codelineno-0-87"></a>
|
|
13378
|
-
<a id="__codelineno-0-88" name="__codelineno-0-88"></a>
|
|
13379
|
-
<a id="__codelineno-0-89" name="__codelineno-0-89"></a>
|
|
13380
|
-
<a id="__codelineno-0-90" name="__codelineno-0-90"></a>
|
|
13381
|
-
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13382
|
-
<a id="__codelineno-0-92" name="__codelineno-0-92"></a>
|
|
13383
|
-
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
13384
|
-
<a id="__codelineno-0-94" name="__codelineno-0-94"></a>
|
|
13385
|
-
<a id="__codelineno-0-95" name="__codelineno-0-95"></a>
|
|
13386
|
-
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13387
|
-
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13388
|
-
<a id="__codelineno-0-98" name="__codelineno-0-98"></a>
|
|
13389
|
-
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="p">
|
|
13390
|
-
<a id="__codelineno-0-100" name="__codelineno-0-100"></a>
|
|
13391
|
-
<a id="__codelineno-0-101" name="__codelineno-0-101"></a>
|
|
13392
|
-
<a id="__codelineno-0-102" name="__codelineno-0-102"></a>
|
|
13393
|
-
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
13394
|
-
<a id="__codelineno-0-104" name="__codelineno-0-104"></a>
|
|
13395
|
-
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="c1">#
|
|
13396
|
-
<a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="c1">#
|
|
13397
|
-
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="c1">#
|
|
13398
|
-
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="
|
|
13399
|
-
<a id="__codelineno-0-109" name="__codelineno-0-109"></a>
|
|
13400
|
-
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="
|
|
13401
|
-
<a id="__codelineno-0-111" name="__codelineno-0-111"></a>
|
|
13402
|
-
<a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="
|
|
13403
|
-
<a id="__codelineno-0-113" name="__codelineno-0-113"></a>
|
|
13404
|
-
<a id="__codelineno-0-114" name="__codelineno-0-114"></a>
|
|
13405
|
-
<a id="__codelineno-0-115" name="__codelineno-0-115"></a>
|
|
13406
|
-
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="
|
|
13407
|
-
<a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="
|
|
13408
|
-
<a id="__codelineno-0-118" name="__codelineno-0-118"></a>
|
|
13409
|
-
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="
|
|
13410
|
-
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">query_params</span><span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">
|
|
13411
|
-
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
13412
|
-
<a id="__codelineno-0-122" name="__codelineno-0-122"></a>
|
|
13413
|
-
<a id="__codelineno-0-123" name="__codelineno-0-123"></a>
|
|
13414
|
-
<a id="__codelineno-0-124" name="__codelineno-0-124"></a>
|
|
13415
|
-
<a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="
|
|
13416
|
-
<a id="__codelineno-0-126" name="__codelineno-0-126"></a>
|
|
13417
|
-
<a id="__codelineno-0-127" name="__codelineno-0-127"></a>
|
|
13418
|
-
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="n">Q</span><span class="p">(</span><span class="n">
|
|
13419
|
-
<a id="__codelineno-0-129" name="__codelineno-0-129"></a>
|
|
13420
|
-
<a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="
|
|
13421
|
-
<a id="__codelineno-0-131" name="__codelineno-0-131"></a>
|
|
13422
|
-
<a id="__codelineno-0-132" name="__codelineno-0-132"></a>
|
|
13423
|
-
<a id="__codelineno-0-133" name="__codelineno-0-133"></a>
|
|
13424
|
-
<a id="__codelineno-0-134" name="__codelineno-0-134"></a>
|
|
13425
|
-
<a id="__codelineno-0-135" name="__codelineno-0-135"></a>
|
|
13426
|
-
<a id="__codelineno-0-136" name="__codelineno-0-136"></a
|
|
13427
|
-
<a id="__codelineno-0-137" name="__codelineno-0-137"></a><span class="
|
|
13428
|
-
<a id="__codelineno-0-138" name="__codelineno-0-138"></a
|
|
13429
|
-
<a id="__codelineno-0-139" name="__codelineno-0-139"></a>
|
|
13430
|
-
<a id="__codelineno-0-140" name="__codelineno-0-140"></a
|
|
13431
|
-
<a id="__codelineno-0-141" name="__codelineno-0-141"></a>
|
|
13432
|
-
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd">
|
|
13433
|
-
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd">
|
|
13434
|
-
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd">
|
|
13435
|
-
<a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd">
|
|
13436
|
-
<a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> "
|
|
13437
|
-
<a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> "
|
|
13438
|
-
<a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> "
|
|
13439
|
-
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> "
|
|
13440
|
-
<a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd">
|
|
13441
|
-
<a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd">
|
|
13442
|
-
<a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd">
|
|
13443
|
-
<a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> "
|
|
13444
|
-
<a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> "
|
|
13445
|
-
<a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> "
|
|
13446
|
-
<a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> "
|
|
13447
|
-
<a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd">
|
|
13448
|
-
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd">
|
|
13449
|
-
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd">
|
|
13450
|
-
<a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd">
|
|
13451
|
-
<a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="sd">
|
|
13452
|
-
<a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd">
|
|
13453
|
-
<a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd">
|
|
13454
|
-
<a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd">
|
|
13455
|
-
<a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd">
|
|
13456
|
-
<a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd">
|
|
13457
|
-
<a id="__codelineno-0-167" name="__codelineno-0-167"></a
|
|
13458
|
-
<a id="__codelineno-0-168" name="__codelineno-0-168"></a>
|
|
13459
|
-
<a id="__codelineno-0-169" name="__codelineno-0-169"></a>
|
|
13460
|
-
<a id="__codelineno-0-170" name="__codelineno-0-170"></a>
|
|
13461
|
-
<a id="__codelineno-0-171" name="__codelineno-0-171"></a>
|
|
13462
|
-
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13463
|
-
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13464
|
-
<a id="__codelineno-0-174" name="__codelineno-0-174"></a>
|
|
13465
|
-
<a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="p">
|
|
13466
|
-
<a id="__codelineno-0-176" name="__codelineno-0-176"></a>
|
|
13467
|
-
<a id="__codelineno-0-177" name="__codelineno-0-177"></a>
|
|
13468
|
-
<a id="__codelineno-0-178" name="__codelineno-0-178"></a>
|
|
13469
|
-
<a id="__codelineno-0-179" name="__codelineno-0-179"></a>
|
|
13470
|
-
<a id="__codelineno-0-180" name="__codelineno-0-180"></a>
|
|
13471
|
-
<a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="s2">"
|
|
13472
|
-
<a id="__codelineno-0-182" name="__codelineno-0-182"></a>
|
|
13473
|
-
<a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="
|
|
13474
|
-
<a id="__codelineno-0-184" name="__codelineno-0-184"></a>
|
|
13475
|
-
<a id="__codelineno-0-185" name="__codelineno-0-185"></a>
|
|
13476
|
-
<a id="__codelineno-0-186" name="__codelineno-0-186"></a>
|
|
13477
|
-
<a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="
|
|
13478
|
-
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
13479
|
-
<a id="__codelineno-0-189" name="__codelineno-0-189"></a>
|
|
13480
|
-
<a id="__codelineno-0-190" name="__codelineno-0-190"></a>
|
|
13481
|
-
<a id="__codelineno-0-191" name="__codelineno-0-191"></a>
|
|
13482
|
-
<a id="__codelineno-0-192" name="__codelineno-0-192"></a>
|
|
13483
|
-
<a id="__codelineno-0-193" name="__codelineno-0-193"></a>
|
|
13484
|
-
<a id="__codelineno-0-194" name="__codelineno-0-194"></a>
|
|
13485
|
-
<a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="n">
|
|
13486
|
-
<a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="
|
|
13487
|
-
<a id="__codelineno-0-197" name="__codelineno-0-197"></a>
|
|
13488
|
-
<a id="__codelineno-0-198" name="__codelineno-0-198"></a>
|
|
13489
|
-
<a id="__codelineno-0-199" name="__codelineno-0-199"></a>
|
|
13490
|
-
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
|
|
13491
|
-
<a id="__codelineno-0-201" name="__codelineno-0-201"></a>
|
|
13492
|
-
<a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="
|
|
13493
|
-
<a id="__codelineno-0-203" name="__codelineno-0-203"></a>
|
|
13494
|
-
<a id="__codelineno-0-204" name="__codelineno-0-204"></a>
|
|
13495
|
-
<a id="__codelineno-0-205" name="__codelineno-0-205"></a>
|
|
13496
|
-
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
13497
|
-
<a id="__codelineno-0-207" name="__codelineno-0-207"></a>
|
|
13498
|
-
<a id="__codelineno-0-208" name="__codelineno-0-208"></a>
|
|
13499
|
-
<a id="__codelineno-0-209" name="__codelineno-0-209"></a>
|
|
13500
|
-
<a id="__codelineno-0-210" name="__codelineno-0-210"></a
|
|
13501
|
-
<a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="
|
|
13502
|
-
<a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd">
|
|
13503
|
-
<a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="sd">
|
|
13504
|
-
<a id="__codelineno-0-214" name="__codelineno-0-214"></a><span class="
|
|
13505
|
-
<a id="__codelineno-0-215" name="__codelineno-0-215"></a>
|
|
13506
|
-
<a id="__codelineno-0-216" name="__codelineno-0-216"></a>
|
|
13507
|
-
<a id="__codelineno-0-217" name="__codelineno-0-217"></a
|
|
13508
|
-
<a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="
|
|
13509
|
-
<a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="sd">
|
|
13510
|
-
<a id="__codelineno-0-220" name="__codelineno-0-220"></a><span class="sd">
|
|
13511
|
-
<a id="__codelineno-0-221" name="__codelineno-0-221"></a><span class="
|
|
13512
|
-
<a id="__codelineno-0-222" name="__codelineno-0-222"></a>
|
|
13513
|
-
<a id="__codelineno-0-223" name="__codelineno-0-223"></a>
|
|
13514
|
-
<a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="
|
|
13515
|
-
<a id="__codelineno-0-225" name="__codelineno-0-225"></a>
|
|
13516
|
-
<a id="__codelineno-0-226" name="__codelineno-0-226"></a>
|
|
13517
|
-
<a id="__codelineno-0-227" name="__codelineno-0-227"></a
|
|
13518
|
-
<a id="__codelineno-0-228" name="__codelineno-0-228"></a><span class="
|
|
13519
|
-
<a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="sd">
|
|
13520
|
-
<a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="sd">
|
|
13521
|
-
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd">
|
|
13522
|
-
<a id="__codelineno-0-232" name="__codelineno-0-232"></a><span class="sd">
|
|
13523
|
-
<a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd">
|
|
13524
|
-
<a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="sd">
|
|
13525
|
-
<a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd">
|
|
13526
|
-
<a id="__codelineno-0-236" name="__codelineno-0-236"></a
|
|
13527
|
-
<a id="__codelineno-0-237" name="__codelineno-0-237"></a>
|
|
13528
|
-
<a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="n">
|
|
13529
|
-
<a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="n">
|
|
13530
|
-
<a id="__codelineno-0-240" name="__codelineno-0-240"></a>
|
|
13531
|
-
<a id="__codelineno-0-241" name="__codelineno-0-241"></a>
|
|
13532
|
-
<a id="__codelineno-0-242" name="__codelineno-0-242"></a>
|
|
13533
|
-
<a id="__codelineno-0-243" name="__codelineno-0-243"></a>
|
|
13534
|
-
<a id="__codelineno-0-244" name="__codelineno-0-244"></a>
|
|
13535
|
-
<a id="__codelineno-0-245" name="__codelineno-0-245"></a>
|
|
13536
|
-
<a id="__codelineno-0-246" name="__codelineno-0-246"></a>
|
|
13537
|
-
<a id="__codelineno-0-247" name="__codelineno-0-247"></a>
|
|
13538
|
-
<a id="__codelineno-0-248" name="__codelineno-0-248"></a>
|
|
13539
|
-
<a id="__codelineno-0-249" name="__codelineno-0-249"></a>
|
|
13540
|
-
<a id="__codelineno-0-250" name="__codelineno-0-250"></a>
|
|
13541
|
-
<a id="__codelineno-0-251" name="__codelineno-0-251"></a>
|
|
13542
|
-
<a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="c1">#
|
|
13543
|
-
<a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="
|
|
13544
|
-
<a id="__codelineno-0-254" name="__codelineno-0-254"></a>
|
|
13545
|
-
<a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="
|
|
13546
|
-
<a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="ow">and</span> <span class="
|
|
13547
|
-
<a id="__codelineno-0-257" name="__codelineno-0-257"></a>
|
|
13548
|
-
<a id="__codelineno-0-258" name="__codelineno-0-258"></a>
|
|
13549
|
-
<a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="
|
|
13550
|
-
<a id="__codelineno-0-260" name="__codelineno-0-260"></a>
|
|
13551
|
-
<a id="__codelineno-0-261" name="__codelineno-0-261"></a>
|
|
13552
|
-
<a id="__codelineno-0-262" name="__codelineno-0-262"></a>
|
|
13553
|
-
<a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="n">
|
|
13554
|
-
<a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="n">
|
|
13555
|
-
<a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">
|
|
13556
|
-
<a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">
|
|
13557
|
-
<a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="n">
|
|
13558
|
-
<a id="__codelineno-0-268" name="__codelineno-0-268"></a>
|
|
13559
|
-
<a id="__codelineno-0-269" name="__codelineno-0-269"></a>
|
|
13560
|
-
<a id="__codelineno-0-270" name="__codelineno-0-270"></a>
|
|
13561
|
-
<a id="__codelineno-0-271" name="__codelineno-0-271"></a>
|
|
13562
|
-
<a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="sa">f</span><span class="s2">"
|
|
13563
|
-
<a id="__codelineno-0-273" name="__codelineno-0-273"></a>
|
|
13564
|
-
<a id="__codelineno-0-274" name="__codelineno-0-274"></a>
|
|
13565
|
-
<a id="__codelineno-0-275" name="__codelineno-0-275"></a>
|
|
13566
|
-
<a id="__codelineno-0-276" name="__codelineno-0-276"></a>
|
|
13567
|
-
<a id="__codelineno-0-277" name="__codelineno-0-277"></a>
|
|
13568
|
-
<a id="__codelineno-0-278" name="__codelineno-0-278"></a> <span class="n">
|
|
13569
|
-
<a id="__codelineno-0-279" name="__codelineno-0-279"></a>
|
|
13570
|
-
<a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="
|
|
13571
|
-
<a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">
|
|
13572
|
-
<a id="__codelineno-0-282" name="__codelineno-0-282"></a>
|
|
13573
|
-
<a id="__codelineno-0-283" name="__codelineno-0-283"></a>
|
|
13574
|
-
<a id="__codelineno-0-284" name="__codelineno-0-284"></a>
|
|
13575
|
-
<a id="__codelineno-0-285" name="__codelineno-0-285"></a>
|
|
13576
|
-
<a id="__codelineno-0-286" name="__codelineno-0-286"></a>
|
|
13577
|
-
<a id="__codelineno-0-287" name="__codelineno-0-287"></a>
|
|
13578
|
-
<a id="__codelineno-0-288" name="__codelineno-0-288"></a>
|
|
13579
|
-
<a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="n">
|
|
13580
|
-
<a id="__codelineno-0-290" name="__codelineno-0-290"></a>
|
|
13581
|
-
<a id="__codelineno-0-291" name="__codelineno-0-291"></a>
|
|
13582
|
-
<a id="__codelineno-0-292" name="__codelineno-0-292"></a>
|
|
13583
|
-
<a id="__codelineno-0-293" name="__codelineno-0-293"></a>
|
|
13584
|
-
<a id="__codelineno-0-294" name="__codelineno-0-294"></a>
|
|
13585
|
-
<a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="
|
|
13586
|
-
<a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="n">
|
|
13587
|
-
<a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">
|
|
13588
|
-
<a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">
|
|
13589
|
-
<a id="__codelineno-0-299" name="__codelineno-0-299"></a>
|
|
13590
|
-
<a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="
|
|
13591
|
-
<a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="n">
|
|
13592
|
-
<a id="__codelineno-0-302" name="__codelineno-0-302"></a>
|
|
13593
|
-
<a id="__codelineno-0-303" name="__codelineno-0-303"></a>
|
|
13594
|
-
<a id="__codelineno-0-304" name="__codelineno-0-304"></a>
|
|
13595
|
-
<a id="__codelineno-0-305" name="__codelineno-0-305"></a>
|
|
13596
|
-
<a id="__codelineno-0-306" name="__codelineno-0-306"></a>
|
|
13597
|
-
<a id="__codelineno-0-307" name="__codelineno-0-307"></a>
|
|
13598
|
-
<a id="__codelineno-0-308" name="__codelineno-0-308"></a>
|
|
13599
|
-
<a id="__codelineno-0-309" name="__codelineno-0-309"></a>
|
|
13600
|
-
<a id="__codelineno-0-310" name="__codelineno-0-310"></a>
|
|
13601
|
-
<a id="__codelineno-0-311" name="__codelineno-0-311"></a>
|
|
13602
|
-
<a id="__codelineno-0-312" name="__codelineno-0-312"></a>
|
|
13603
|
-
<a id="__codelineno-0-313" name="__codelineno-0-313"></a>
|
|
13604
|
-
<a id="__codelineno-0-314" name="__codelineno-0-314"></a>
|
|
13605
|
-
<a id="__codelineno-0-315" name="__codelineno-0-315"></a>
|
|
13606
|
-
<a id="__codelineno-0-316" name="__codelineno-0-316"></a>
|
|
13607
|
-
<a id="__codelineno-0-317" name="__codelineno-0-317"></a>
|
|
13608
|
-
<a id="__codelineno-0-318" name="__codelineno-0-318"></a>
|
|
13609
|
-
<a id="__codelineno-0-319" name="__codelineno-0-319"></a>
|
|
13610
|
-
<a id="__codelineno-0-320" name="__codelineno-0-320"></a>
|
|
13611
|
-
<a id="__codelineno-0-321" name="__codelineno-0-321"></a>
|
|
13612
|
-
<a id="__codelineno-0-322" name="__codelineno-0-322"></a>
|
|
13613
|
-
<a id="__codelineno-0-323" name="__codelineno-0-323"></a>
|
|
13614
|
-
<a id="__codelineno-0-324" name="__codelineno-0-324"></a>
|
|
13615
|
-
<a id="__codelineno-0-325" name="__codelineno-0-325"></a>
|
|
13616
|
-
<a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="k">return</span> <span class="n">relationships_field_errors</span>
|
|
13284
|
+
<span class="normal"><a href="#__codelineno-0-325">325</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="k">class</span> <span class="nc">RelationshipModel</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
|
|
13285
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13286
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> Abstract class for any model which may have custom relationships associated with it.</span>
|
|
13287
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a><span class="sd"> """</span>
|
|
13288
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a>
|
|
13289
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
13290
|
+
<a id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
13291
|
+
<a id="__codelineno-0-42" name="__codelineno-0-42"></a>
|
|
13292
|
+
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="c1"># Define GenericRelations so that deleting a RelationshipModel instance</span>
|
|
13293
|
+
<a id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="c1"># cascades to deleting any RelationshipAssociations that were using this instance,</span>
|
|
13294
|
+
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="c1"># and also for convenience in looking up the RelationshipModels associated to any given RelationshipAssociation</span>
|
|
13295
|
+
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="n">source_for_associations</span> <span class="o">=</span> <span class="n">GenericRelation</span><span class="p">(</span>
|
|
13296
|
+
<a id="__codelineno-0-47" name="__codelineno-0-47"></a> <span class="s2">"extras.RelationshipAssociation"</span><span class="p">,</span>
|
|
13297
|
+
<a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="n">content_type_field</span><span class="o">=</span><span class="s2">"source_type"</span><span class="p">,</span>
|
|
13298
|
+
<a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="n">object_id_field</span><span class="o">=</span><span class="s2">"source_id"</span><span class="p">,</span>
|
|
13299
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="n">related_query_name</span><span class="o">=</span><span class="s2">"source_</span><span class="si">%(app_label)s</span><span class="s2">_</span><span class="si">%(class)s</span><span class="s2">"</span><span class="p">,</span> <span class="c1"># e.g. 'source_dcim_location', 'source_ipam_vlan'</span>
|
|
13300
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="p">)</span>
|
|
13301
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="n">destination_for_associations</span> <span class="o">=</span> <span class="n">GenericRelation</span><span class="p">(</span>
|
|
13302
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="s2">"extras.RelationshipAssociation"</span><span class="p">,</span>
|
|
13303
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="n">content_type_field</span><span class="o">=</span><span class="s2">"destination_type"</span><span class="p">,</span>
|
|
13304
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="n">object_id_field</span><span class="o">=</span><span class="s2">"destination_id"</span><span class="p">,</span>
|
|
13305
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="n">related_query_name</span><span class="o">=</span><span class="s2">"destination_</span><span class="si">%(app_label)s</span><span class="s2">_</span><span class="si">%(class)s</span><span class="s2">"</span><span class="p">,</span> <span class="c1"># e.g. 'destination_dcim_rack'</span>
|
|
13306
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="p">)</span>
|
|
13307
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
13308
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="nd">@property</span>
|
|
13309
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">def</span> <span class="nf">associations</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
13310
|
+
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">source_for_associations</span><span class="o">.</span><span class="n">all</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">destination_for_associations</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
|
|
13311
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
13312
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="k">def</span> <span class="nf">get_relationships</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">include_hidden</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
13313
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13314
|
+
<a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="sd"> Return a dictionary of RelationshipAssociation querysets for all custom relationships</span>
|
|
13315
|
+
<a id="__codelineno-0-66" name="__codelineno-0-66"></a>
|
|
13316
|
+
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="sd"> Returns:</span>
|
|
13317
|
+
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> (dict): `{</span>
|
|
13318
|
+
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> "source": {</span>
|
|
13319
|
+
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> <Relationship instance #1>: <RelationshipAssociation queryset #1>,</span>
|
|
13320
|
+
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> <Relationship instance #2>: <RelationshipAssociation queryset #2>,</span>
|
|
13321
|
+
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> },</span>
|
|
13322
|
+
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> "destination": {</span>
|
|
13323
|
+
<a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd"> <Relationship instance #3>: <RelationshipAssociation queryset #3>,</span>
|
|
13324
|
+
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> <Relationship instance #4>: <RelationshipAssociation queryset #4>,</span>
|
|
13325
|
+
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="sd"> },</span>
|
|
13326
|
+
<a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="sd"> "peer": {</span>
|
|
13327
|
+
<a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="sd"> <Relationship instance #5>: <RelationshipAssociation queryset #5>,</span>
|
|
13328
|
+
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> <Relationship instance #6>: <RelationshipAssociation queryset #6>,</span>
|
|
13329
|
+
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> },</span>
|
|
13330
|
+
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd"> }`</span>
|
|
13331
|
+
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd"> """</span>
|
|
13332
|
+
<a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="n">src_relationships</span><span class="p">,</span> <span class="n">dst_relationships</span> <span class="o">=</span> <span class="n">Relationship</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="bp">self</span><span class="p">)</span>
|
|
13333
|
+
<a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
13334
|
+
<a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="n">src_relationships</span> <span class="o">=</span> <span class="n">src_relationships</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
|
|
13335
|
+
<a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">dst_relationships</span> <span class="o">=</span> <span class="n">dst_relationships</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
|
|
13336
|
+
<a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="n">content_type</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="bp">self</span><span class="p">)</span>
|
|
13337
|
+
<a id="__codelineno-0-88" name="__codelineno-0-88"></a>
|
|
13338
|
+
<a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="n">sides</span> <span class="o">=</span> <span class="p">{</span>
|
|
13339
|
+
<a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_SOURCE</span><span class="p">:</span> <span class="n">src_relationships</span><span class="p">,</span>
|
|
13340
|
+
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_DESTINATION</span><span class="p">:</span> <span class="n">dst_relationships</span><span class="p">,</span>
|
|
13341
|
+
<a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="p">}</span>
|
|
13342
|
+
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
13343
|
+
<a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="n">resp</span> <span class="o">=</span> <span class="p">{</span>
|
|
13344
|
+
<a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_SOURCE</span><span class="p">:</span> <span class="p">{},</span>
|
|
13345
|
+
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_DESTINATION</span><span class="p">:</span> <span class="p">{},</span>
|
|
13346
|
+
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_PEER</span><span class="p">:</span> <span class="p">{},</span>
|
|
13347
|
+
<a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="p">}</span>
|
|
13348
|
+
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="k">for</span> <span class="n">side</span><span class="p">,</span> <span class="n">relationships</span> <span class="ow">in</span> <span class="n">sides</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
13349
|
+
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">for</span> <span class="n">relationship</span> <span class="ow">in</span> <span class="n">relationships</span><span class="p">:</span>
|
|
13350
|
+
<a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_hidden"</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">include_hidden</span><span class="p">:</span>
|
|
13351
|
+
<a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="k">continue</span>
|
|
13352
|
+
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
13353
|
+
<a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="c1"># Determine if the relationship is applicable to this object based on the filter</span>
|
|
13354
|
+
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="c1"># To resolve the filter we are using the FilterSet for the given model</span>
|
|
13355
|
+
<a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="c1"># If there is no match when we query the primary key of the device along with the filter</span>
|
|
13356
|
+
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="c1"># Then the relationship is not applicable to this object</span>
|
|
13357
|
+
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_filter"</span><span class="p">):</span>
|
|
13358
|
+
<a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="n">filterset</span> <span class="o">=</span> <span class="n">get_filterset_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
|
|
13359
|
+
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">if</span> <span class="n">filterset</span><span class="p">:</span>
|
|
13360
|
+
<a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">filter_params</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_filter"</span><span class="p">)</span>
|
|
13361
|
+
<a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">filterset</span><span class="p">(</span><span class="n">filter_params</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</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="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">))</span><span class="o">.</span><span class="n">qs</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
13362
|
+
<a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="k">continue</span>
|
|
13363
|
+
<a id="__codelineno-0-114" name="__codelineno-0-114"></a>
|
|
13364
|
+
<a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="c1"># Construct the queryset to query all RelationshipAssociation for this object and this relationship</span>
|
|
13365
|
+
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"relationship"</span><span class="p">:</span> <span class="n">relationship</span><span class="p">}</span>
|
|
13366
|
+
<a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">relationship</span><span class="o">.</span><span class="n">symmetric</span><span class="p">:</span>
|
|
13367
|
+
<a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="c1"># Query for RelationshipAssociations that this object is on the expected side of</span>
|
|
13368
|
+
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">query_params</span><span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_id"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span>
|
|
13369
|
+
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">query_params</span><span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_type"</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
|
|
13370
|
+
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
13371
|
+
<a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">]</span> <span class="o">=</span> <span class="n">RelationshipAssociation</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="o">**</span><span class="n">query_params</span><span class="p">)</span>
|
|
13372
|
+
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">else</span><span class="p">:</span>
|
|
13373
|
+
<a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="c1"># Query for RelationshipAssociations involving this object, regardless of side</span>
|
|
13374
|
+
<a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="n">resp</span><span class="p">[</span><span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_PEER</span><span class="p">][</span><span class="n">relationship</span><span class="p">]</span> <span class="o">=</span> <span class="n">RelationshipAssociation</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
|
|
13375
|
+
<a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="p">(</span>
|
|
13376
|
+
<a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="n">Q</span><span class="p">(</span><span class="n">source_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span> <span class="n">source_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
|
|
13377
|
+
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">destination_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span> <span class="n">destination_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
|
|
13378
|
+
<a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="p">),</span>
|
|
13379
|
+
<a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="o">**</span><span class="n">query_params</span><span class="p">,</span>
|
|
13380
|
+
<a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="p">)</span>
|
|
13381
|
+
<a id="__codelineno-0-132" name="__codelineno-0-132"></a>
|
|
13382
|
+
<a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="k">return</span> <span class="n">resp</span>
|
|
13383
|
+
<a id="__codelineno-0-134" name="__codelineno-0-134"></a>
|
|
13384
|
+
<a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="k">def</span> <span class="nf">get_relationships_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
13385
|
+
<a id="__codelineno-0-136" name="__codelineno-0-136"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13386
|
+
<a id="__codelineno-0-137" name="__codelineno-0-137"></a><span class="sd"> Return a dictionary of relationships with the label and the value or the queryset for each.</span>
|
|
13387
|
+
<a id="__codelineno-0-138" name="__codelineno-0-138"></a>
|
|
13388
|
+
<a id="__codelineno-0-139" name="__codelineno-0-139"></a><span class="sd"> Used for rendering relationships in the UI; see nautobot/core/templates/inc/relationships_table_rows.html</span>
|
|
13389
|
+
<a id="__codelineno-0-140" name="__codelineno-0-140"></a>
|
|
13390
|
+
<a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="sd"> Returns:</span>
|
|
13391
|
+
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd"> (dict): `{</span>
|
|
13392
|
+
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> "source": {</span>
|
|
13393
|
+
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> <Relationship instance #1>: { # one-to-one relationship that self is the source of</span>
|
|
13394
|
+
<a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd"> "label": "...",</span>
|
|
13395
|
+
<a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> "peer_type": <ContentType>,</span>
|
|
13396
|
+
<a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> "has_many": False,</span>
|
|
13397
|
+
<a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> "value": <model instance>, # single destination for this relationship</span>
|
|
13398
|
+
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> "url": "...",</span>
|
|
13399
|
+
<a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> },</span>
|
|
13400
|
+
<a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd"> <Relationship instance #2>: { # one-to-many or many-to-many relationship that self is a source for</span>
|
|
13401
|
+
<a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> "label": "...",</span>
|
|
13402
|
+
<a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> "peer_type": <ContentType>,</span>
|
|
13403
|
+
<a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> "has_many": True,</span>
|
|
13404
|
+
<a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> "value": None,</span>
|
|
13405
|
+
<a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> "queryset": <RelationshipAssociation queryset #2> # set of destinations for the relationship</span>
|
|
13406
|
+
<a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> },</span>
|
|
13407
|
+
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> },</span>
|
|
13408
|
+
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> "destination": {</span>
|
|
13409
|
+
<a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd"> (same format as "source" dict - relationships that self is the destination of)</span>
|
|
13410
|
+
<a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="sd"> },</span>
|
|
13411
|
+
<a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd"> "peer": {</span>
|
|
13412
|
+
<a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> (same format as "source" dict - symmetric relationships that self is involved in)</span>
|
|
13413
|
+
<a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> },</span>
|
|
13414
|
+
<a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> }`</span>
|
|
13415
|
+
<a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> """</span>
|
|
13416
|
+
<a id="__codelineno-0-167" name="__codelineno-0-167"></a>
|
|
13417
|
+
<a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="n">relationships_by_side</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
13418
|
+
<a id="__codelineno-0-169" name="__codelineno-0-169"></a>
|
|
13419
|
+
<a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">resp</span> <span class="o">=</span> <span class="p">{</span>
|
|
13420
|
+
<a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_SOURCE</span><span class="p">:</span> <span class="p">{},</span>
|
|
13421
|
+
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_DESTINATION</span><span class="p">:</span> <span class="p">{},</span>
|
|
13422
|
+
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_PEER</span><span class="p">:</span> <span class="p">{},</span>
|
|
13423
|
+
<a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="p">}</span>
|
|
13424
|
+
<a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="k">for</span> <span class="n">side</span><span class="p">,</span> <span class="n">relationships</span> <span class="ow">in</span> <span class="n">relationships_by_side</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
13425
|
+
<a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">for</span> <span class="n">relationship</span><span class="p">,</span> <span class="n">queryset</span> <span class="ow">in</span> <span class="n">relationships</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
13426
|
+
<a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="n">peer_side</span> <span class="o">=</span> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">OPPOSITE</span><span class="p">[</span><span class="n">side</span><span class="p">]</span>
|
|
13427
|
+
<a id="__codelineno-0-178" name="__codelineno-0-178"></a>
|
|
13428
|
+
<a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
13429
|
+
<a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="s2">"label"</span><span class="p">:</span> <span class="n">relationship</span><span class="o">.</span><span class="n">get_label</span><span class="p">(</span><span class="n">side</span><span class="p">),</span>
|
|
13430
|
+
<a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="s2">"value"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
13431
|
+
<a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="p">}</span>
|
|
13432
|
+
<a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">relationship</span><span class="o">.</span><span class="n">symmetric</span><span class="p">:</span>
|
|
13433
|
+
<a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"peer_type"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">peer_side</span><span class="si">}</span><span class="s2">_type"</span><span class="p">)</span>
|
|
13434
|
+
<a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="k">else</span><span class="p">:</span>
|
|
13435
|
+
<a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="c1"># Symmetric relationship - source_type == destination_type, so it doesn't matter which we choose</span>
|
|
13436
|
+
<a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"peer_type"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="s2">"source_type"</span><span class="p">)</span>
|
|
13437
|
+
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
13438
|
+
<a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"has_many"</span><span class="p">]</span> <span class="o">=</span> <span class="n">relationship</span><span class="o">.</span><span class="n">has_many</span><span class="p">(</span><span class="n">peer_side</span><span class="p">)</span>
|
|
13439
|
+
<a id="__codelineno-0-190" name="__codelineno-0-190"></a>
|
|
13440
|
+
<a id="__codelineno-0-191" name="__codelineno-0-191"></a> <span class="k">if</span> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"has_many"</span><span class="p">]:</span>
|
|
13441
|
+
<a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"queryset"</span><span class="p">]</span> <span class="o">=</span> <span class="n">queryset</span>
|
|
13442
|
+
<a id="__codelineno-0-193" name="__codelineno-0-193"></a> <span class="k">else</span><span class="p">:</span>
|
|
13443
|
+
<a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"url"</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
|
13444
|
+
<a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="n">association</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
|
|
13445
|
+
<a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">association</span><span class="p">:</span>
|
|
13446
|
+
<a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">continue</span>
|
|
13447
|
+
<a id="__codelineno-0-198" name="__codelineno-0-198"></a>
|
|
13448
|
+
<a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="n">peer</span> <span class="o">=</span> <span class="n">association</span><span class="o">.</span><span class="n">get_peer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
13449
|
+
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
|
|
13450
|
+
<a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"value"</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer</span>
|
|
13451
|
+
<a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">peer</span><span class="p">,</span> <span class="s2">"get_absolute_url"</span><span class="p">):</span>
|
|
13452
|
+
<a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"url"</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">()</span>
|
|
13453
|
+
<a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="k">else</span><span class="p">:</span>
|
|
13454
|
+
<a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"Peer object </span><span class="si">%s</span><span class="s2"> has no get_absolute_url() method"</span><span class="p">,</span> <span class="n">peer</span><span class="p">)</span>
|
|
13455
|
+
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
13456
|
+
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">return</span> <span class="n">resp</span>
|
|
13457
|
+
<a id="__codelineno-0-208" name="__codelineno-0-208"></a>
|
|
13458
|
+
<a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="k">def</span> <span class="nf">get_relationships_data_basic_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
13459
|
+
<a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13460
|
+
<a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> Same docstring as get_relationships_data() above except this only returns relationships</span>
|
|
13461
|
+
<a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd"> where advanced_ui==False for displaying in the main object detail tab on the object's page</span>
|
|
13462
|
+
<a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="sd"> """</span>
|
|
13463
|
+
<a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships_data</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
13464
|
+
<a id="__codelineno-0-215" name="__codelineno-0-215"></a>
|
|
13465
|
+
<a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="k">def</span> <span class="nf">get_relationships_data_advanced_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
13466
|
+
<a id="__codelineno-0-217" name="__codelineno-0-217"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13467
|
+
<a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="sd"> Same docstring as get_relationships_data() above except this only returns relationships</span>
|
|
13468
|
+
<a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="sd"> where advanced_ui==True for displaying in the 'Advanced' tab on the object's page</span>
|
|
13469
|
+
<a id="__codelineno-0-220" name="__codelineno-0-220"></a><span class="sd"> """</span>
|
|
13470
|
+
<a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships_data</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
13471
|
+
<a id="__codelineno-0-222" name="__codelineno-0-222"></a>
|
|
13472
|
+
<a id="__codelineno-0-223" name="__codelineno-0-223"></a> <span class="nd">@classmethod</span>
|
|
13473
|
+
<a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="k">def</span> <span class="nf">required_related_objects_errors</span><span class="p">(</span>
|
|
13474
|
+
<a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="bp">cls</span><span class="p">,</span> <span class="n">output_for</span><span class="o">=</span><span class="s2">"ui"</span><span class="p">,</span> <span class="n">initial_data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">relationships_key_specified</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">None</span>
|
|
13475
|
+
<a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="p">):</span>
|
|
13476
|
+
<a id="__codelineno-0-227" name="__codelineno-0-227"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13477
|
+
<a id="__codelineno-0-228" name="__codelineno-0-228"></a><span class="sd"> Args:</span>
|
|
13478
|
+
<a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="sd"> output_for (str): either "ui" or "api" depending on usage</span>
|
|
13479
|
+
<a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="sd"> initial_data (dict): submitted form/serializer data to validate against</span>
|
|
13480
|
+
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd"> relationships_key_specified (bool): if the "relationships" key was provided or not</span>
|
|
13481
|
+
<a id="__codelineno-0-232" name="__codelineno-0-232"></a><span class="sd"> instance (Optional[BaseModel]): an optional model instance to validate against</span>
|
|
13482
|
+
<a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd"> Returns:</span>
|
|
13483
|
+
<a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="sd"> (list[dict]): List of field error dicts if any are found</span>
|
|
13484
|
+
<a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> """</span>
|
|
13485
|
+
<a id="__codelineno-0-236" name="__codelineno-0-236"></a>
|
|
13486
|
+
<a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="n">required_relationships</span> <span class="o">=</span> <span class="n">Relationship</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_required_for_model</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
|
|
13487
|
+
<a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="n">relationships_field_errors</span> <span class="o">=</span> <span class="p">{}</span>
|
|
13488
|
+
<a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="k">for</span> <span class="n">relation</span> <span class="ow">in</span> <span class="n">required_relationships</span><span class="p">:</span>
|
|
13489
|
+
<a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="n">opposite_side</span> <span class="o">=</span> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">OPPOSITE</span><span class="p">[</span><span class="n">relation</span><span class="o">.</span><span class="n">required_on</span><span class="p">]</span>
|
|
13490
|
+
<a id="__codelineno-0-241" name="__codelineno-0-241"></a>
|
|
13491
|
+
<a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="k">if</span> <span class="n">relation</span><span class="o">.</span><span class="n">skip_required</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">opposite_side</span><span class="p">):</span>
|
|
13492
|
+
<a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="k">continue</span>
|
|
13493
|
+
<a id="__codelineno-0-244" name="__codelineno-0-244"></a>
|
|
13494
|
+
<a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="k">if</span> <span class="n">relation</span><span class="o">.</span><span class="n">has_many</span><span class="p">(</span><span class="n">opposite_side</span><span class="p">):</span>
|
|
13495
|
+
<a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="n">num_required_verbose</span> <span class="o">=</span> <span class="s2">"at least one"</span>
|
|
13496
|
+
<a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="k">else</span><span class="p">:</span>
|
|
13497
|
+
<a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="n">num_required_verbose</span> <span class="o">=</span> <span class="s2">"a"</span>
|
|
13498
|
+
<a id="__codelineno-0-249" name="__codelineno-0-249"></a>
|
|
13499
|
+
<a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
13500
|
+
<a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="c1"># If this is a model instance and the relationships json data key is missing, check to see if</span>
|
|
13501
|
+
<a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="c1"># required relationship associations already exist, and continue (ignore validation) if so</span>
|
|
13502
|
+
<a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="k">if</span> <span class="p">(</span>
|
|
13503
|
+
<a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="s2">"present_in_database"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span>
|
|
13504
|
+
<a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="ow">and</span> <span class="n">initial_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">opposite_side</span><span class="p">,</span> <span class="p">{})</span> <span class="o">==</span> <span class="p">{}</span>
|
|
13505
|
+
<a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">relationships_key_specified</span>
|
|
13506
|
+
<a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="p">):</span>
|
|
13507
|
+
<a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="n">filter_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"relationship"</span><span class="p">:</span> <span class="n">relation</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">relation</span><span class="o">.</span><span class="n">required_on</span><span class="si">}</span><span class="s2">_id"</span><span class="p">:</span> <span class="n">instance</span><span class="o">.</span><span class="n">pk</span><span class="p">}</span>
|
|
13508
|
+
<a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="k">if</span> <span class="n">RelationshipAssociation</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="o">**</span><span class="n">filter_kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
13509
|
+
<a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="k">continue</span>
|
|
13510
|
+
<a id="__codelineno-0-261" name="__codelineno-0-261"></a>
|
|
13511
|
+
<a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="n">required_model_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">opposite_side</span><span class="si">}</span><span class="s2">_type"</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
|
|
13512
|
+
<a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="n">required_model_meta</span> <span class="o">=</span> <span class="n">required_model_class</span><span class="o">.</span><span class="n">_meta</span>
|
|
13513
|
+
<a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="n">cr_field_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"cr_</span><span class="si">{</span><span class="n">relation</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">opposite_side</span><span class="si">}</span><span class="s2">"</span>
|
|
13514
|
+
<a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">name_plural</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span>
|
|
13515
|
+
<a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">field_key</span> <span class="o">=</span> <span class="n">relation</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span> <span class="k">else</span> <span class="n">cr_field_name</span>
|
|
13516
|
+
<a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="n">field_errors</span> <span class="o">=</span> <span class="p">{</span><span class="n">field_key</span><span class="p">:</span> <span class="p">[]}</span>
|
|
13517
|
+
<a id="__codelineno-0-268" name="__codelineno-0-268"></a>
|
|
13518
|
+
<a id="__codelineno-0-269" name="__codelineno-0-269"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">required_model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
13519
|
+
<a id="__codelineno-0-270" name="__codelineno-0-270"></a> <span class="n">hint</span> <span class="o">=</span> <span class="p">(</span>
|
|
13520
|
+
<a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="sa">f</span><span class="s2">"You need to create </span><span class="si">{</span><span class="n">num_required_verbose</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2"> "</span>
|
|
13521
|
+
<a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="sa">f</span><span class="s2">"before instantiating a </span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2">."</span>
|
|
13522
|
+
<a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="p">)</span>
|
|
13523
|
+
<a id="__codelineno-0-274" name="__codelineno-0-274"></a>
|
|
13524
|
+
<a id="__codelineno-0-275" name="__codelineno-0-275"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"ui"</span><span class="p">:</span>
|
|
13525
|
+
<a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="k">try</span><span class="p">:</span>
|
|
13526
|
+
<a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="n">add_url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">get_route_for_model</span><span class="p">(</span><span class="n">required_model_class</span><span class="p">,</span> <span class="s2">"add"</span><span class="p">))</span>
|
|
13527
|
+
<a id="__codelineno-0-278" name="__codelineno-0-278"></a> <span class="n">hint</span> <span class="o">=</span> <span class="n">format_html</span><span class="p">(</span>
|
|
13528
|
+
<a id="__codelineno-0-279" name="__codelineno-0-279"></a> <span class="s1">'<a target="_blank" href="</span><span class="si">{}</span><span class="s1">">Click here</a> to create a </span><span class="si">{}</span><span class="s1">.'</span><span class="p">,</span>
|
|
13529
|
+
<a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="n">add_url</span><span class="p">,</span>
|
|
13530
|
+
<a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
|
|
13531
|
+
<a id="__codelineno-0-282" name="__codelineno-0-282"></a> <span class="p">)</span>
|
|
13532
|
+
<a id="__codelineno-0-283" name="__codelineno-0-283"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
13533
|
+
<a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="k">pass</span>
|
|
13534
|
+
<a id="__codelineno-0-285" name="__codelineno-0-285"></a>
|
|
13535
|
+
<a id="__codelineno-0-286" name="__codelineno-0-286"></a> <span class="k">elif</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
13536
|
+
<a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">try</span><span class="p">:</span>
|
|
13537
|
+
<a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">api_post_url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">get_route_for_model</span><span class="p">(</span><span class="n">required_model_class</span><span class="p">,</span> <span class="s2">"list"</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
13538
|
+
<a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Create a </span><span class="si">{</span><span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2"> by posting to </span><span class="si">{</span><span class="n">api_post_url</span><span class="si">}</span><span class="s2">"</span>
|
|
13539
|
+
<a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
13540
|
+
<a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">pass</span>
|
|
13541
|
+
<a id="__codelineno-0-292" name="__codelineno-0-292"></a>
|
|
13542
|
+
<a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="n">error_message</span> <span class="o">=</span> <span class="n">format_html</span><span class="p">(</span>
|
|
13543
|
+
<a id="__codelineno-0-294" name="__codelineno-0-294"></a> <span class="s2">"</span><span class="si">{}</span><span class="s2"> require </span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">, but no </span><span class="si">{}</span><span class="s2"> exist yet. "</span><span class="p">,</span>
|
|
13544
|
+
<a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="n">bettertitle</span><span class="p">(</span><span class="n">name_plural</span><span class="p">),</span>
|
|
13545
|
+
<a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="n">num_required_verbose</span><span class="p">,</span>
|
|
13546
|
+
<a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
|
|
13547
|
+
<a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">,</span>
|
|
13548
|
+
<a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="p">)</span>
|
|
13549
|
+
<a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="n">error_message</span> <span class="o">+=</span> <span class="n">hint</span>
|
|
13550
|
+
<a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">error_message</span><span class="p">)</span>
|
|
13551
|
+
<a id="__codelineno-0-302" name="__codelineno-0-302"></a>
|
|
13552
|
+
<a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">if</span> <span class="n">initial_data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
13553
|
+
<a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="n">supplied_data</span> <span class="o">=</span> <span class="p">[]</span>
|
|
13554
|
+
<a id="__codelineno-0-305" name="__codelineno-0-305"></a>
|
|
13555
|
+
<a id="__codelineno-0-306" name="__codelineno-0-306"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"ui"</span><span class="p">:</span>
|
|
13556
|
+
<a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="n">supplied_data</span> <span class="o">=</span> <span class="n">initial_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field_key</span><span class="p">,</span> <span class="p">[])</span>
|
|
13557
|
+
<a id="__codelineno-0-308" name="__codelineno-0-308"></a>
|
|
13558
|
+
<a id="__codelineno-0-309" name="__codelineno-0-309"></a> <span class="k">elif</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
13559
|
+
<a id="__codelineno-0-310" name="__codelineno-0-310"></a> <span class="n">supplied_data</span> <span class="o">=</span> <span class="n">initial_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">opposite_side</span><span class="p">,</span> <span class="p">{})</span>
|
|
13560
|
+
<a id="__codelineno-0-311" name="__codelineno-0-311"></a>
|
|
13561
|
+
<a id="__codelineno-0-312" name="__codelineno-0-312"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">supplied_data</span><span class="p">:</span>
|
|
13562
|
+
<a id="__codelineno-0-313" name="__codelineno-0-313"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"ui"</span><span class="p">:</span>
|
|
13563
|
+
<a id="__codelineno-0-314" name="__codelineno-0-314"></a> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
13564
|
+
<a id="__codelineno-0-315" name="__codelineno-0-315"></a> <span class="sa">f</span><span class="s2">"You need to select </span><span class="si">{</span><span class="n">num_required_verbose</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2">."</span>
|
|
13565
|
+
<a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="p">)</span>
|
|
13566
|
+
<a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="k">elif</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
13567
|
+
<a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
13568
|
+
<a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="sa">f</span><span class="s1">'You need to specify ["relationships"]["</span><span class="si">{</span><span class="n">relation</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s1">"]["</span><span class="si">{</span><span class="n">opposite_side</span><span class="si">}</span><span class="s1">"]["objects"].'</span>
|
|
13569
|
+
<a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="p">)</span>
|
|
13570
|
+
<a id="__codelineno-0-321" name="__codelineno-0-321"></a>
|
|
13571
|
+
<a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">])</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
13572
|
+
<a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">relationships_field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span>
|
|
13573
|
+
<a id="__codelineno-0-324" name="__codelineno-0-324"></a>
|
|
13574
|
+
<a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="k">return</span> <span class="n">relationships_field_errors</span>
|
|
13617
13575
|
</code></pre></div></td></tr></table></div>
|
|
13618
13576
|
</details>
|
|
13619
13577
|
|
|
@@ -13683,7 +13641,8 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
13683
13641
|
|
|
13684
13642
|
<details class="quote">
|
|
13685
13643
|
<summary>Source code in <code>nautobot/extras/models/relationships.py</code></summary>
|
|
13686
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
13644
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-63"> 63</a></span>
|
|
13645
|
+
<span class="normal"><a href="#__codelineno-0-64"> 64</a></span>
|
|
13687
13646
|
<span class="normal"><a href="#__codelineno-0-65"> 65</a></span>
|
|
13688
13647
|
<span class="normal"><a href="#__codelineno-0-66"> 66</a></span>
|
|
13689
13648
|
<span class="normal"><a href="#__codelineno-0-67"> 67</a></span>
|
|
@@ -13752,78 +13711,77 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
13752
13711
|
<span class="normal"><a href="#__codelineno-0-130">130</a></span>
|
|
13753
13712
|
<span class="normal"><a href="#__codelineno-0-131">131</a></span>
|
|
13754
13713
|
<span class="normal"><a href="#__codelineno-0-132">132</a></span>
|
|
13755
|
-
<span class="normal"><a href="#__codelineno-0-133">133</a></span>
|
|
13756
|
-
<
|
|
13757
|
-
<a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="
|
|
13758
|
-
<a id="__codelineno-0-66" name="__codelineno-0-66"></a
|
|
13759
|
-
<a id="__codelineno-0-67" name="__codelineno-0-67"></a>
|
|
13760
|
-
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd">
|
|
13761
|
-
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd">
|
|
13762
|
-
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd">
|
|
13763
|
-
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> <Relationship instance #
|
|
13764
|
-
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd">
|
|
13765
|
-
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd">
|
|
13766
|
-
<a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd">
|
|
13767
|
-
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> <Relationship instance #
|
|
13768
|
-
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="sd">
|
|
13769
|
-
<a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="sd">
|
|
13770
|
-
<a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="sd">
|
|
13771
|
-
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> <Relationship instance #
|
|
13772
|
-
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd">
|
|
13773
|
-
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd">
|
|
13774
|
-
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd">
|
|
13775
|
-
<a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="
|
|
13776
|
-
<a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="
|
|
13777
|
-
<a id="__codelineno-0-85" name="__codelineno-0-85"></a>
|
|
13778
|
-
<a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">
|
|
13779
|
-
<a id="__codelineno-0-87" name="__codelineno-0-87"></a>
|
|
13780
|
-
<a id="__codelineno-0-88" name="__codelineno-0-88"></a>
|
|
13781
|
-
<a id="__codelineno-0-89" name="__codelineno-0-89"></a>
|
|
13782
|
-
<a id="__codelineno-0-90" name="__codelineno-0-90"></a>
|
|
13783
|
-
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13784
|
-
<a id="__codelineno-0-92" name="__codelineno-0-92"></a>
|
|
13785
|
-
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
13786
|
-
<a id="__codelineno-0-94" name="__codelineno-0-94"></a>
|
|
13787
|
-
<a id="__codelineno-0-95" name="__codelineno-0-95"></a>
|
|
13788
|
-
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13789
|
-
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
13790
|
-
<a id="__codelineno-0-98" name="__codelineno-0-98"></a>
|
|
13791
|
-
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="p">
|
|
13792
|
-
<a id="__codelineno-0-100" name="__codelineno-0-100"></a>
|
|
13793
|
-
<a id="__codelineno-0-101" name="__codelineno-0-101"></a>
|
|
13794
|
-
<a id="__codelineno-0-102" name="__codelineno-0-102"></a>
|
|
13795
|
-
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
13796
|
-
<a id="__codelineno-0-104" name="__codelineno-0-104"></a>
|
|
13797
|
-
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="c1">#
|
|
13798
|
-
<a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="c1">#
|
|
13799
|
-
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="c1">#
|
|
13800
|
-
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="
|
|
13801
|
-
<a id="__codelineno-0-109" name="__codelineno-0-109"></a>
|
|
13802
|
-
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="
|
|
13803
|
-
<a id="__codelineno-0-111" name="__codelineno-0-111"></a>
|
|
13804
|
-
<a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="
|
|
13805
|
-
<a id="__codelineno-0-113" name="__codelineno-0-113"></a>
|
|
13806
|
-
<a id="__codelineno-0-114" name="__codelineno-0-114"></a>
|
|
13807
|
-
<a id="__codelineno-0-115" name="__codelineno-0-115"></a>
|
|
13808
|
-
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="
|
|
13809
|
-
<a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="
|
|
13810
|
-
<a id="__codelineno-0-118" name="__codelineno-0-118"></a>
|
|
13811
|
-
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="
|
|
13812
|
-
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">query_params</span><span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">
|
|
13813
|
-
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
13814
|
-
<a id="__codelineno-0-122" name="__codelineno-0-122"></a>
|
|
13815
|
-
<a id="__codelineno-0-123" name="__codelineno-0-123"></a>
|
|
13816
|
-
<a id="__codelineno-0-124" name="__codelineno-0-124"></a>
|
|
13817
|
-
<a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="
|
|
13818
|
-
<a id="__codelineno-0-126" name="__codelineno-0-126"></a>
|
|
13819
|
-
<a id="__codelineno-0-127" name="__codelineno-0-127"></a>
|
|
13820
|
-
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="n">Q</span><span class="p">(</span><span class="n">
|
|
13821
|
-
<a id="__codelineno-0-129" name="__codelineno-0-129"></a>
|
|
13822
|
-
<a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="
|
|
13823
|
-
<a id="__codelineno-0-131" name="__codelineno-0-131"></a>
|
|
13824
|
-
<a id="__codelineno-0-132" name="__codelineno-0-132"></a>
|
|
13825
|
-
<a id="__codelineno-0-133" name="__codelineno-0-133"></a>
|
|
13826
|
-
<a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="k">return</span> <span class="n">resp</span>
|
|
13714
|
+
<span class="normal"><a href="#__codelineno-0-133">133</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-63" name="__codelineno-0-63"></a><span class="k">def</span> <span class="nf">get_relationships</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">include_hidden</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">advanced_ui</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
13715
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13716
|
+
<a id="__codelineno-0-65" name="__codelineno-0-65"></a><span class="sd"> Return a dictionary of RelationshipAssociation querysets for all custom relationships</span>
|
|
13717
|
+
<a id="__codelineno-0-66" name="__codelineno-0-66"></a>
|
|
13718
|
+
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="sd"> Returns:</span>
|
|
13719
|
+
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> (dict): `{</span>
|
|
13720
|
+
<a id="__codelineno-0-69" name="__codelineno-0-69"></a><span class="sd"> "source": {</span>
|
|
13721
|
+
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> <Relationship instance #1>: <RelationshipAssociation queryset #1>,</span>
|
|
13722
|
+
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> <Relationship instance #2>: <RelationshipAssociation queryset #2>,</span>
|
|
13723
|
+
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> },</span>
|
|
13724
|
+
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> "destination": {</span>
|
|
13725
|
+
<a id="__codelineno-0-74" name="__codelineno-0-74"></a><span class="sd"> <Relationship instance #3>: <RelationshipAssociation queryset #3>,</span>
|
|
13726
|
+
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> <Relationship instance #4>: <RelationshipAssociation queryset #4>,</span>
|
|
13727
|
+
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="sd"> },</span>
|
|
13728
|
+
<a id="__codelineno-0-77" name="__codelineno-0-77"></a><span class="sd"> "peer": {</span>
|
|
13729
|
+
<a id="__codelineno-0-78" name="__codelineno-0-78"></a><span class="sd"> <Relationship instance #5>: <RelationshipAssociation queryset #5>,</span>
|
|
13730
|
+
<a id="__codelineno-0-79" name="__codelineno-0-79"></a><span class="sd"> <Relationship instance #6>: <RelationshipAssociation queryset #6>,</span>
|
|
13731
|
+
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="sd"> },</span>
|
|
13732
|
+
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="sd"> }`</span>
|
|
13733
|
+
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd"> """</span>
|
|
13734
|
+
<a id="__codelineno-0-83" name="__codelineno-0-83"></a> <span class="n">src_relationships</span><span class="p">,</span> <span class="n">dst_relationships</span> <span class="o">=</span> <span class="n">Relationship</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="bp">self</span><span class="p">)</span>
|
|
13735
|
+
<a id="__codelineno-0-84" name="__codelineno-0-84"></a> <span class="k">if</span> <span class="n">advanced_ui</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
13736
|
+
<a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="n">src_relationships</span> <span class="o">=</span> <span class="n">src_relationships</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
|
|
13737
|
+
<a id="__codelineno-0-86" name="__codelineno-0-86"></a> <span class="n">dst_relationships</span> <span class="o">=</span> <span class="n">dst_relationships</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="n">advanced_ui</span><span class="p">)</span>
|
|
13738
|
+
<a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="n">content_type</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="bp">self</span><span class="p">)</span>
|
|
13739
|
+
<a id="__codelineno-0-88" name="__codelineno-0-88"></a>
|
|
13740
|
+
<a id="__codelineno-0-89" name="__codelineno-0-89"></a> <span class="n">sides</span> <span class="o">=</span> <span class="p">{</span>
|
|
13741
|
+
<a id="__codelineno-0-90" name="__codelineno-0-90"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_SOURCE</span><span class="p">:</span> <span class="n">src_relationships</span><span class="p">,</span>
|
|
13742
|
+
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_DESTINATION</span><span class="p">:</span> <span class="n">dst_relationships</span><span class="p">,</span>
|
|
13743
|
+
<a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="p">}</span>
|
|
13744
|
+
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
13745
|
+
<a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="n">resp</span> <span class="o">=</span> <span class="p">{</span>
|
|
13746
|
+
<a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_SOURCE</span><span class="p">:</span> <span class="p">{},</span>
|
|
13747
|
+
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_DESTINATION</span><span class="p">:</span> <span class="p">{},</span>
|
|
13748
|
+
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_PEER</span><span class="p">:</span> <span class="p">{},</span>
|
|
13749
|
+
<a id="__codelineno-0-98" name="__codelineno-0-98"></a> <span class="p">}</span>
|
|
13750
|
+
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="k">for</span> <span class="n">side</span><span class="p">,</span> <span class="n">relationships</span> <span class="ow">in</span> <span class="n">sides</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
13751
|
+
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">for</span> <span class="n">relationship</span> <span class="ow">in</span> <span class="n">relationships</span><span class="p">:</span>
|
|
13752
|
+
<a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_hidden"</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">include_hidden</span><span class="p">:</span>
|
|
13753
|
+
<a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="k">continue</span>
|
|
13754
|
+
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
13755
|
+
<a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="c1"># Determine if the relationship is applicable to this object based on the filter</span>
|
|
13756
|
+
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="c1"># To resolve the filter we are using the FilterSet for the given model</span>
|
|
13757
|
+
<a id="__codelineno-0-106" name="__codelineno-0-106"></a> <span class="c1"># If there is no match when we query the primary key of the device along with the filter</span>
|
|
13758
|
+
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="c1"># Then the relationship is not applicable to this object</span>
|
|
13759
|
+
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_filter"</span><span class="p">):</span>
|
|
13760
|
+
<a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="n">filterset</span> <span class="o">=</span> <span class="n">get_filterset_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
|
|
13761
|
+
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">if</span> <span class="n">filterset</span><span class="p">:</span>
|
|
13762
|
+
<a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">filter_params</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_filter"</span><span class="p">)</span>
|
|
13763
|
+
<a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">filterset</span><span class="p">(</span><span class="n">filter_params</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</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="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">))</span><span class="o">.</span><span class="n">qs</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
13764
|
+
<a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="k">continue</span>
|
|
13765
|
+
<a id="__codelineno-0-114" name="__codelineno-0-114"></a>
|
|
13766
|
+
<a id="__codelineno-0-115" name="__codelineno-0-115"></a> <span class="c1"># Construct the queryset to query all RelationshipAssociation for this object and this relationship</span>
|
|
13767
|
+
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="n">query_params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"relationship"</span><span class="p">:</span> <span class="n">relationship</span><span class="p">}</span>
|
|
13768
|
+
<a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">relationship</span><span class="o">.</span><span class="n">symmetric</span><span class="p">:</span>
|
|
13769
|
+
<a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="c1"># Query for RelationshipAssociations that this object is on the expected side of</span>
|
|
13770
|
+
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">query_params</span><span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_id"</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pk</span>
|
|
13771
|
+
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">query_params</span><span class="p">[</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">side</span><span class="si">}</span><span class="s2">_type"</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
|
|
13772
|
+
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
13773
|
+
<a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">]</span> <span class="o">=</span> <span class="n">RelationshipAssociation</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="o">**</span><span class="n">query_params</span><span class="p">)</span>
|
|
13774
|
+
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">else</span><span class="p">:</span>
|
|
13775
|
+
<a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="c1"># Query for RelationshipAssociations involving this object, regardless of side</span>
|
|
13776
|
+
<a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="n">resp</span><span class="p">[</span><span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_PEER</span><span class="p">][</span><span class="n">relationship</span><span class="p">]</span> <span class="o">=</span> <span class="n">RelationshipAssociation</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
|
|
13777
|
+
<a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="p">(</span>
|
|
13778
|
+
<a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="n">Q</span><span class="p">(</span><span class="n">source_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span> <span class="n">source_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
|
|
13779
|
+
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="o">|</span> <span class="n">Q</span><span class="p">(</span><span class="n">destination_id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">pk</span><span class="p">,</span> <span class="n">destination_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
|
|
13780
|
+
<a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="p">),</span>
|
|
13781
|
+
<a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="o">**</span><span class="n">query_params</span><span class="p">,</span>
|
|
13782
|
+
<a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="p">)</span>
|
|
13783
|
+
<a id="__codelineno-0-132" name="__codelineno-0-132"></a>
|
|
13784
|
+
<a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="k">return</span> <span class="n">resp</span>
|
|
13827
13785
|
</code></pre></div></td></tr></table></div>
|
|
13828
13786
|
</details>
|
|
13829
13787
|
</div>
|
|
@@ -13895,7 +13853,8 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
13895
13853
|
|
|
13896
13854
|
<details class="quote">
|
|
13897
13855
|
<summary>Source code in <code>nautobot/extras/models/relationships.py</code></summary>
|
|
13898
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
13856
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-135">135</a></span>
|
|
13857
|
+
<span class="normal"><a href="#__codelineno-0-136">136</a></span>
|
|
13899
13858
|
<span class="normal"><a href="#__codelineno-0-137">137</a></span>
|
|
13900
13859
|
<span class="normal"><a href="#__codelineno-0-138">138</a></span>
|
|
13901
13860
|
<span class="normal"><a href="#__codelineno-0-139">139</a></span>
|
|
@@ -13966,80 +13925,79 @@ tangible or logical resources on the network, or within the organization.</p>
|
|
|
13966
13925
|
<span class="normal"><a href="#__codelineno-0-204">204</a></span>
|
|
13967
13926
|
<span class="normal"><a href="#__codelineno-0-205">205</a></span>
|
|
13968
13927
|
<span class="normal"><a href="#__codelineno-0-206">206</a></span>
|
|
13969
|
-
<span class="normal"><a href="#__codelineno-0-207">207</a></span>
|
|
13970
|
-
<
|
|
13971
|
-
<a id="__codelineno-0-137" name="__codelineno-0-137"></a><span class="
|
|
13972
|
-
<a id="__codelineno-0-138" name="__codelineno-0-138"></a
|
|
13973
|
-
<a id="__codelineno-0-139" name="__codelineno-0-139"></a>
|
|
13974
|
-
<a id="__codelineno-0-140" name="__codelineno-0-140"></a
|
|
13975
|
-
<a id="__codelineno-0-141" name="__codelineno-0-141"></a>
|
|
13976
|
-
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd">
|
|
13977
|
-
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd">
|
|
13978
|
-
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd">
|
|
13979
|
-
<a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd">
|
|
13980
|
-
<a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> "
|
|
13981
|
-
<a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> "
|
|
13982
|
-
<a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> "
|
|
13983
|
-
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> "
|
|
13984
|
-
<a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd">
|
|
13985
|
-
<a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd">
|
|
13986
|
-
<a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd">
|
|
13987
|
-
<a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> "
|
|
13988
|
-
<a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> "
|
|
13989
|
-
<a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> "
|
|
13990
|
-
<a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> "
|
|
13991
|
-
<a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd">
|
|
13992
|
-
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd">
|
|
13993
|
-
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd">
|
|
13994
|
-
<a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd">
|
|
13995
|
-
<a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="sd">
|
|
13996
|
-
<a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd">
|
|
13997
|
-
<a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd">
|
|
13998
|
-
<a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd">
|
|
13999
|
-
<a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd">
|
|
14000
|
-
<a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd">
|
|
14001
|
-
<a id="__codelineno-0-167" name="__codelineno-0-167"></a
|
|
14002
|
-
<a id="__codelineno-0-168" name="__codelineno-0-168"></a>
|
|
14003
|
-
<a id="__codelineno-0-169" name="__codelineno-0-169"></a>
|
|
14004
|
-
<a id="__codelineno-0-170" name="__codelineno-0-170"></a>
|
|
14005
|
-
<a id="__codelineno-0-171" name="__codelineno-0-171"></a>
|
|
14006
|
-
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
14007
|
-
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">
|
|
14008
|
-
<a id="__codelineno-0-174" name="__codelineno-0-174"></a>
|
|
14009
|
-
<a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="p">
|
|
14010
|
-
<a id="__codelineno-0-176" name="__codelineno-0-176"></a>
|
|
14011
|
-
<a id="__codelineno-0-177" name="__codelineno-0-177"></a>
|
|
14012
|
-
<a id="__codelineno-0-178" name="__codelineno-0-178"></a>
|
|
14013
|
-
<a id="__codelineno-0-179" name="__codelineno-0-179"></a>
|
|
14014
|
-
<a id="__codelineno-0-180" name="__codelineno-0-180"></a>
|
|
14015
|
-
<a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="s2">"
|
|
14016
|
-
<a id="__codelineno-0-182" name="__codelineno-0-182"></a>
|
|
14017
|
-
<a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="
|
|
14018
|
-
<a id="__codelineno-0-184" name="__codelineno-0-184"></a>
|
|
14019
|
-
<a id="__codelineno-0-185" name="__codelineno-0-185"></a>
|
|
14020
|
-
<a id="__codelineno-0-186" name="__codelineno-0-186"></a>
|
|
14021
|
-
<a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="
|
|
14022
|
-
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
14023
|
-
<a id="__codelineno-0-189" name="__codelineno-0-189"></a>
|
|
14024
|
-
<a id="__codelineno-0-190" name="__codelineno-0-190"></a>
|
|
14025
|
-
<a id="__codelineno-0-191" name="__codelineno-0-191"></a>
|
|
14026
|
-
<a id="__codelineno-0-192" name="__codelineno-0-192"></a>
|
|
14027
|
-
<a id="__codelineno-0-193" name="__codelineno-0-193"></a>
|
|
14028
|
-
<a id="__codelineno-0-194" name="__codelineno-0-194"></a>
|
|
14029
|
-
<a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="n">
|
|
14030
|
-
<a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="
|
|
14031
|
-
<a id="__codelineno-0-197" name="__codelineno-0-197"></a>
|
|
14032
|
-
<a id="__codelineno-0-198" name="__codelineno-0-198"></a>
|
|
14033
|
-
<a id="__codelineno-0-199" name="__codelineno-0-199"></a>
|
|
14034
|
-
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
|
|
14035
|
-
<a id="__codelineno-0-201" name="__codelineno-0-201"></a>
|
|
14036
|
-
<a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="
|
|
14037
|
-
<a id="__codelineno-0-203" name="__codelineno-0-203"></a>
|
|
14038
|
-
<a id="__codelineno-0-204" name="__codelineno-0-204"></a>
|
|
14039
|
-
<a id="__codelineno-0-205" name="__codelineno-0-205"></a>
|
|
14040
|
-
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
14041
|
-
<a id="__codelineno-0-207" name="__codelineno-0-207"></a>
|
|
14042
|
-
<a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="k">return</span> <span class="n">resp</span>
|
|
13928
|
+
<span class="normal"><a href="#__codelineno-0-207">207</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-135" name="__codelineno-0-135"></a><span class="k">def</span> <span class="nf">get_relationships_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
13929
|
+
<a id="__codelineno-0-136" name="__codelineno-0-136"></a><span class="w"> </span><span class="sd">"""</span>
|
|
13930
|
+
<a id="__codelineno-0-137" name="__codelineno-0-137"></a><span class="sd"> Return a dictionary of relationships with the label and the value or the queryset for each.</span>
|
|
13931
|
+
<a id="__codelineno-0-138" name="__codelineno-0-138"></a>
|
|
13932
|
+
<a id="__codelineno-0-139" name="__codelineno-0-139"></a><span class="sd"> Used for rendering relationships in the UI; see nautobot/core/templates/inc/relationships_table_rows.html</span>
|
|
13933
|
+
<a id="__codelineno-0-140" name="__codelineno-0-140"></a>
|
|
13934
|
+
<a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="sd"> Returns:</span>
|
|
13935
|
+
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd"> (dict): `{</span>
|
|
13936
|
+
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> "source": {</span>
|
|
13937
|
+
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> <Relationship instance #1>: { # one-to-one relationship that self is the source of</span>
|
|
13938
|
+
<a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd"> "label": "...",</span>
|
|
13939
|
+
<a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> "peer_type": <ContentType>,</span>
|
|
13940
|
+
<a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> "has_many": False,</span>
|
|
13941
|
+
<a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> "value": <model instance>, # single destination for this relationship</span>
|
|
13942
|
+
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> "url": "...",</span>
|
|
13943
|
+
<a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> },</span>
|
|
13944
|
+
<a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd"> <Relationship instance #2>: { # one-to-many or many-to-many relationship that self is a source for</span>
|
|
13945
|
+
<a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> "label": "...",</span>
|
|
13946
|
+
<a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> "peer_type": <ContentType>,</span>
|
|
13947
|
+
<a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> "has_many": True,</span>
|
|
13948
|
+
<a id="__codelineno-0-155" name="__codelineno-0-155"></a><span class="sd"> "value": None,</span>
|
|
13949
|
+
<a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="sd"> "queryset": <RelationshipAssociation queryset #2> # set of destinations for the relationship</span>
|
|
13950
|
+
<a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="sd"> },</span>
|
|
13951
|
+
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> },</span>
|
|
13952
|
+
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> "destination": {</span>
|
|
13953
|
+
<a id="__codelineno-0-160" name="__codelineno-0-160"></a><span class="sd"> (same format as "source" dict - relationships that self is the destination of)</span>
|
|
13954
|
+
<a id="__codelineno-0-161" name="__codelineno-0-161"></a><span class="sd"> },</span>
|
|
13955
|
+
<a id="__codelineno-0-162" name="__codelineno-0-162"></a><span class="sd"> "peer": {</span>
|
|
13956
|
+
<a id="__codelineno-0-163" name="__codelineno-0-163"></a><span class="sd"> (same format as "source" dict - symmetric relationships that self is involved in)</span>
|
|
13957
|
+
<a id="__codelineno-0-164" name="__codelineno-0-164"></a><span class="sd"> },</span>
|
|
13958
|
+
<a id="__codelineno-0-165" name="__codelineno-0-165"></a><span class="sd"> }`</span>
|
|
13959
|
+
<a id="__codelineno-0-166" name="__codelineno-0-166"></a><span class="sd"> """</span>
|
|
13960
|
+
<a id="__codelineno-0-167" name="__codelineno-0-167"></a>
|
|
13961
|
+
<a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="n">relationships_by_side</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
13962
|
+
<a id="__codelineno-0-169" name="__codelineno-0-169"></a>
|
|
13963
|
+
<a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">resp</span> <span class="o">=</span> <span class="p">{</span>
|
|
13964
|
+
<a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_SOURCE</span><span class="p">:</span> <span class="p">{},</span>
|
|
13965
|
+
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_DESTINATION</span><span class="p">:</span> <span class="p">{},</span>
|
|
13966
|
+
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">SIDE_PEER</span><span class="p">:</span> <span class="p">{},</span>
|
|
13967
|
+
<a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="p">}</span>
|
|
13968
|
+
<a id="__codelineno-0-175" name="__codelineno-0-175"></a> <span class="k">for</span> <span class="n">side</span><span class="p">,</span> <span class="n">relationships</span> <span class="ow">in</span> <span class="n">relationships_by_side</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
13969
|
+
<a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">for</span> <span class="n">relationship</span><span class="p">,</span> <span class="n">queryset</span> <span class="ow">in</span> <span class="n">relationships</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
13970
|
+
<a id="__codelineno-0-177" name="__codelineno-0-177"></a> <span class="n">peer_side</span> <span class="o">=</span> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">OPPOSITE</span><span class="p">[</span><span class="n">side</span><span class="p">]</span>
|
|
13971
|
+
<a id="__codelineno-0-178" name="__codelineno-0-178"></a>
|
|
13972
|
+
<a id="__codelineno-0-179" name="__codelineno-0-179"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
|
|
13973
|
+
<a id="__codelineno-0-180" name="__codelineno-0-180"></a> <span class="s2">"label"</span><span class="p">:</span> <span class="n">relationship</span><span class="o">.</span><span class="n">get_label</span><span class="p">(</span><span class="n">side</span><span class="p">),</span>
|
|
13974
|
+
<a id="__codelineno-0-181" name="__codelineno-0-181"></a> <span class="s2">"value"</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
|
|
13975
|
+
<a id="__codelineno-0-182" name="__codelineno-0-182"></a> <span class="p">}</span>
|
|
13976
|
+
<a id="__codelineno-0-183" name="__codelineno-0-183"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">relationship</span><span class="o">.</span><span class="n">symmetric</span><span class="p">:</span>
|
|
13977
|
+
<a id="__codelineno-0-184" name="__codelineno-0-184"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"peer_type"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">peer_side</span><span class="si">}</span><span class="s2">_type"</span><span class="p">)</span>
|
|
13978
|
+
<a id="__codelineno-0-185" name="__codelineno-0-185"></a> <span class="k">else</span><span class="p">:</span>
|
|
13979
|
+
<a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="c1"># Symmetric relationship - source_type == destination_type, so it doesn't matter which we choose</span>
|
|
13980
|
+
<a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"peer_type"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relationship</span><span class="p">,</span> <span class="s2">"source_type"</span><span class="p">)</span>
|
|
13981
|
+
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
13982
|
+
<a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"has_many"</span><span class="p">]</span> <span class="o">=</span> <span class="n">relationship</span><span class="o">.</span><span class="n">has_many</span><span class="p">(</span><span class="n">peer_side</span><span class="p">)</span>
|
|
13983
|
+
<a id="__codelineno-0-190" name="__codelineno-0-190"></a>
|
|
13984
|
+
<a id="__codelineno-0-191" name="__codelineno-0-191"></a> <span class="k">if</span> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"has_many"</span><span class="p">]:</span>
|
|
13985
|
+
<a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"queryset"</span><span class="p">]</span> <span class="o">=</span> <span class="n">queryset</span>
|
|
13986
|
+
<a id="__codelineno-0-193" name="__codelineno-0-193"></a> <span class="k">else</span><span class="p">:</span>
|
|
13987
|
+
<a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"url"</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
|
|
13988
|
+
<a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="n">association</span> <span class="o">=</span> <span class="n">queryset</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
|
|
13989
|
+
<a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">association</span><span class="p">:</span>
|
|
13990
|
+
<a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">continue</span>
|
|
13991
|
+
<a id="__codelineno-0-198" name="__codelineno-0-198"></a>
|
|
13992
|
+
<a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="n">peer</span> <span class="o">=</span> <span class="n">association</span><span class="o">.</span><span class="n">get_peer</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
13993
|
+
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
|
|
13994
|
+
<a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"value"</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer</span>
|
|
13995
|
+
<a id="__codelineno-0-202" name="__codelineno-0-202"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">peer</span><span class="p">,</span> <span class="s2">"get_absolute_url"</span><span class="p">):</span>
|
|
13996
|
+
<a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="n">resp</span><span class="p">[</span><span class="n">side</span><span class="p">][</span><span class="n">relationship</span><span class="p">][</span><span class="s2">"url"</span><span class="p">]</span> <span class="o">=</span> <span class="n">peer</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">()</span>
|
|
13997
|
+
<a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="k">else</span><span class="p">:</span>
|
|
13998
|
+
<a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"Peer object </span><span class="si">%s</span><span class="s2"> has no get_absolute_url() method"</span><span class="p">,</span> <span class="n">peer</span><span class="p">)</span>
|
|
13999
|
+
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
14000
|
+
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">return</span> <span class="n">resp</span>
|
|
14043
14001
|
</code></pre></div></td></tr></table></div>
|
|
14044
14002
|
</details>
|
|
14045
14003
|
</div>
|
|
@@ -14064,17 +14022,17 @@ where advanced_ui==True for displaying in the 'Advanced' tab on the object's pag
|
|
|
14064
14022
|
|
|
14065
14023
|
<details class="quote">
|
|
14066
14024
|
<summary>Source code in <code>nautobot/extras/models/relationships.py</code></summary>
|
|
14067
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
14025
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-216">216</a></span>
|
|
14026
|
+
<span class="normal"><a href="#__codelineno-0-217">217</a></span>
|
|
14068
14027
|
<span class="normal"><a href="#__codelineno-0-218">218</a></span>
|
|
14069
14028
|
<span class="normal"><a href="#__codelineno-0-219">219</a></span>
|
|
14070
14029
|
<span class="normal"><a href="#__codelineno-0-220">220</a></span>
|
|
14071
|
-
<span class="normal"><a href="#__codelineno-0-221">221</a></span>
|
|
14072
|
-
<
|
|
14073
|
-
<a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="
|
|
14074
|
-
<a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="sd">
|
|
14075
|
-
<a id="__codelineno-0-220" name="__codelineno-0-220"></a><span class="sd">
|
|
14076
|
-
<a id="__codelineno-0-221" name="__codelineno-0-221"></a><span class="
|
|
14077
|
-
<a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships_data</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
14030
|
+
<span class="normal"><a href="#__codelineno-0-221">221</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-216" name="__codelineno-0-216"></a><span class="k">def</span> <span class="nf">get_relationships_data_advanced_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
14031
|
+
<a id="__codelineno-0-217" name="__codelineno-0-217"></a><span class="w"> </span><span class="sd">"""</span>
|
|
14032
|
+
<a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="sd"> Same docstring as get_relationships_data() above except this only returns relationships</span>
|
|
14033
|
+
<a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="sd"> where advanced_ui==True for displaying in the 'Advanced' tab on the object's page</span>
|
|
14034
|
+
<a id="__codelineno-0-220" name="__codelineno-0-220"></a><span class="sd"> """</span>
|
|
14035
|
+
<a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships_data</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
14078
14036
|
</code></pre></div></td></tr></table></div>
|
|
14079
14037
|
</details>
|
|
14080
14038
|
</div>
|
|
@@ -14099,17 +14057,17 @@ where advanced_ui==False for displaying in the main object detail tab on the obj
|
|
|
14099
14057
|
|
|
14100
14058
|
<details class="quote">
|
|
14101
14059
|
<summary>Source code in <code>nautobot/extras/models/relationships.py</code></summary>
|
|
14102
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
14060
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-209">209</a></span>
|
|
14061
|
+
<span class="normal"><a href="#__codelineno-0-210">210</a></span>
|
|
14103
14062
|
<span class="normal"><a href="#__codelineno-0-211">211</a></span>
|
|
14104
14063
|
<span class="normal"><a href="#__codelineno-0-212">212</a></span>
|
|
14105
14064
|
<span class="normal"><a href="#__codelineno-0-213">213</a></span>
|
|
14106
|
-
<span class="normal"><a href="#__codelineno-0-214">214</a></span>
|
|
14107
|
-
<
|
|
14108
|
-
<a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="
|
|
14109
|
-
<a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd">
|
|
14110
|
-
<a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="sd">
|
|
14111
|
-
<a id="__codelineno-0-214" name="__codelineno-0-214"></a><span class="
|
|
14112
|
-
<a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships_data</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
14065
|
+
<span class="normal"><a href="#__codelineno-0-214">214</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-209" name="__codelineno-0-209"></a><span class="k">def</span> <span class="nf">get_relationships_data_basic_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
14066
|
+
<a id="__codelineno-0-210" name="__codelineno-0-210"></a><span class="w"> </span><span class="sd">"""</span>
|
|
14067
|
+
<a id="__codelineno-0-211" name="__codelineno-0-211"></a><span class="sd"> Same docstring as get_relationships_data() above except this only returns relationships</span>
|
|
14068
|
+
<a id="__codelineno-0-212" name="__codelineno-0-212"></a><span class="sd"> where advanced_ui==False for displaying in the main object detail tab on the object's page</span>
|
|
14069
|
+
<a id="__codelineno-0-213" name="__codelineno-0-213"></a><span class="sd"> """</span>
|
|
14070
|
+
<a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_relationships_data</span><span class="p">(</span><span class="n">advanced_ui</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
14113
14071
|
</code></pre></div></td></tr></table></div>
|
|
14114
14072
|
</details>
|
|
14115
14073
|
</div>
|
|
@@ -14232,7 +14190,8 @@ where advanced_ui==False for displaying in the main object detail tab on the obj
|
|
|
14232
14190
|
|
|
14233
14191
|
<details class="quote">
|
|
14234
14192
|
<summary>Source code in <code>nautobot/extras/models/relationships.py</code></summary>
|
|
14235
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
14193
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-223">223</a></span>
|
|
14194
|
+
<span class="normal"><a href="#__codelineno-0-224">224</a></span>
|
|
14236
14195
|
<span class="normal"><a href="#__codelineno-0-225">225</a></span>
|
|
14237
14196
|
<span class="normal"><a href="#__codelineno-0-226">226</a></span>
|
|
14238
14197
|
<span class="normal"><a href="#__codelineno-0-227">227</a></span>
|
|
@@ -14333,110 +14292,109 @@ where advanced_ui==False for displaying in the main object detail tab on the obj
|
|
|
14333
14292
|
<span class="normal"><a href="#__codelineno-0-322">322</a></span>
|
|
14334
14293
|
<span class="normal"><a href="#__codelineno-0-323">323</a></span>
|
|
14335
14294
|
<span class="normal"><a href="#__codelineno-0-324">324</a></span>
|
|
14336
|
-
<span class="normal"><a href="#__codelineno-0-325">325</a></span>
|
|
14337
|
-
<
|
|
14338
|
-
<a id="__codelineno-0-225" name="__codelineno-0-225"></a><span class="
|
|
14339
|
-
<a id="__codelineno-0-226" name="__codelineno-0-226"></a
|
|
14340
|
-
<a id="__codelineno-0-227" name="__codelineno-0-227"></a><span class="
|
|
14341
|
-
<a id="__codelineno-0-228" name="__codelineno-0-228"></a><span class="
|
|
14342
|
-
<a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="sd">
|
|
14343
|
-
<a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="sd">
|
|
14344
|
-
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd">
|
|
14345
|
-
<a id="__codelineno-0-232" name="__codelineno-0-232"></a><span class="sd">
|
|
14346
|
-
<a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd">
|
|
14347
|
-
<a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="sd">
|
|
14348
|
-
<a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd">
|
|
14349
|
-
<a id="__codelineno-0-236" name="__codelineno-0-236"></a
|
|
14350
|
-
<a id="__codelineno-0-237" name="__codelineno-0-237"></a>
|
|
14351
|
-
<a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="n">
|
|
14352
|
-
<a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="n">
|
|
14353
|
-
<a id="__codelineno-0-240" name="__codelineno-0-240"></a>
|
|
14354
|
-
<a id="__codelineno-0-241" name="__codelineno-0-241"></a>
|
|
14355
|
-
<a id="__codelineno-0-242" name="__codelineno-0-242"></a>
|
|
14356
|
-
<a id="__codelineno-0-243" name="__codelineno-0-243"></a>
|
|
14357
|
-
<a id="__codelineno-0-244" name="__codelineno-0-244"></a>
|
|
14358
|
-
<a id="__codelineno-0-245" name="__codelineno-0-245"></a>
|
|
14359
|
-
<a id="__codelineno-0-246" name="__codelineno-0-246"></a>
|
|
14360
|
-
<a id="__codelineno-0-247" name="__codelineno-0-247"></a>
|
|
14361
|
-
<a id="__codelineno-0-248" name="__codelineno-0-248"></a>
|
|
14362
|
-
<a id="__codelineno-0-249" name="__codelineno-0-249"></a>
|
|
14363
|
-
<a id="__codelineno-0-250" name="__codelineno-0-250"></a>
|
|
14364
|
-
<a id="__codelineno-0-251" name="__codelineno-0-251"></a>
|
|
14365
|
-
<a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="c1">#
|
|
14366
|
-
<a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="
|
|
14367
|
-
<a id="__codelineno-0-254" name="__codelineno-0-254"></a>
|
|
14368
|
-
<a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="
|
|
14369
|
-
<a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="ow">and</span> <span class="
|
|
14370
|
-
<a id="__codelineno-0-257" name="__codelineno-0-257"></a>
|
|
14371
|
-
<a id="__codelineno-0-258" name="__codelineno-0-258"></a>
|
|
14372
|
-
<a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="
|
|
14373
|
-
<a id="__codelineno-0-260" name="__codelineno-0-260"></a>
|
|
14374
|
-
<a id="__codelineno-0-261" name="__codelineno-0-261"></a>
|
|
14375
|
-
<a id="__codelineno-0-262" name="__codelineno-0-262"></a>
|
|
14376
|
-
<a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="n">
|
|
14377
|
-
<a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="n">
|
|
14378
|
-
<a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">
|
|
14379
|
-
<a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">
|
|
14380
|
-
<a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="n">
|
|
14381
|
-
<a id="__codelineno-0-268" name="__codelineno-0-268"></a>
|
|
14382
|
-
<a id="__codelineno-0-269" name="__codelineno-0-269"></a>
|
|
14383
|
-
<a id="__codelineno-0-270" name="__codelineno-0-270"></a>
|
|
14384
|
-
<a id="__codelineno-0-271" name="__codelineno-0-271"></a>
|
|
14385
|
-
<a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="sa">f</span><span class="s2">"
|
|
14386
|
-
<a id="__codelineno-0-273" name="__codelineno-0-273"></a>
|
|
14387
|
-
<a id="__codelineno-0-274" name="__codelineno-0-274"></a>
|
|
14388
|
-
<a id="__codelineno-0-275" name="__codelineno-0-275"></a>
|
|
14389
|
-
<a id="__codelineno-0-276" name="__codelineno-0-276"></a>
|
|
14390
|
-
<a id="__codelineno-0-277" name="__codelineno-0-277"></a>
|
|
14391
|
-
<a id="__codelineno-0-278" name="__codelineno-0-278"></a> <span class="n">
|
|
14392
|
-
<a id="__codelineno-0-279" name="__codelineno-0-279"></a>
|
|
14393
|
-
<a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="
|
|
14394
|
-
<a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">
|
|
14395
|
-
<a id="__codelineno-0-282" name="__codelineno-0-282"></a>
|
|
14396
|
-
<a id="__codelineno-0-283" name="__codelineno-0-283"></a>
|
|
14397
|
-
<a id="__codelineno-0-284" name="__codelineno-0-284"></a>
|
|
14398
|
-
<a id="__codelineno-0-285" name="__codelineno-0-285"></a>
|
|
14399
|
-
<a id="__codelineno-0-286" name="__codelineno-0-286"></a>
|
|
14400
|
-
<a id="__codelineno-0-287" name="__codelineno-0-287"></a>
|
|
14401
|
-
<a id="__codelineno-0-288" name="__codelineno-0-288"></a>
|
|
14402
|
-
<a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="n">
|
|
14403
|
-
<a id="__codelineno-0-290" name="__codelineno-0-290"></a>
|
|
14404
|
-
<a id="__codelineno-0-291" name="__codelineno-0-291"></a>
|
|
14405
|
-
<a id="__codelineno-0-292" name="__codelineno-0-292"></a>
|
|
14406
|
-
<a id="__codelineno-0-293" name="__codelineno-0-293"></a>
|
|
14407
|
-
<a id="__codelineno-0-294" name="__codelineno-0-294"></a>
|
|
14408
|
-
<a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="
|
|
14409
|
-
<a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="n">
|
|
14410
|
-
<a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">
|
|
14411
|
-
<a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">
|
|
14412
|
-
<a id="__codelineno-0-299" name="__codelineno-0-299"></a>
|
|
14413
|
-
<a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="
|
|
14414
|
-
<a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="n">
|
|
14415
|
-
<a id="__codelineno-0-302" name="__codelineno-0-302"></a>
|
|
14416
|
-
<a id="__codelineno-0-303" name="__codelineno-0-303"></a>
|
|
14417
|
-
<a id="__codelineno-0-304" name="__codelineno-0-304"></a>
|
|
14418
|
-
<a id="__codelineno-0-305" name="__codelineno-0-305"></a>
|
|
14419
|
-
<a id="__codelineno-0-306" name="__codelineno-0-306"></a>
|
|
14420
|
-
<a id="__codelineno-0-307" name="__codelineno-0-307"></a>
|
|
14421
|
-
<a id="__codelineno-0-308" name="__codelineno-0-308"></a>
|
|
14422
|
-
<a id="__codelineno-0-309" name="__codelineno-0-309"></a>
|
|
14423
|
-
<a id="__codelineno-0-310" name="__codelineno-0-310"></a>
|
|
14424
|
-
<a id="__codelineno-0-311" name="__codelineno-0-311"></a>
|
|
14425
|
-
<a id="__codelineno-0-312" name="__codelineno-0-312"></a>
|
|
14426
|
-
<a id="__codelineno-0-313" name="__codelineno-0-313"></a>
|
|
14427
|
-
<a id="__codelineno-0-314" name="__codelineno-0-314"></a>
|
|
14428
|
-
<a id="__codelineno-0-315" name="__codelineno-0-315"></a>
|
|
14429
|
-
<a id="__codelineno-0-316" name="__codelineno-0-316"></a>
|
|
14430
|
-
<a id="__codelineno-0-317" name="__codelineno-0-317"></a>
|
|
14431
|
-
<a id="__codelineno-0-318" name="__codelineno-0-318"></a>
|
|
14432
|
-
<a id="__codelineno-0-319" name="__codelineno-0-319"></a>
|
|
14433
|
-
<a id="__codelineno-0-320" name="__codelineno-0-320"></a>
|
|
14434
|
-
<a id="__codelineno-0-321" name="__codelineno-0-321"></a>
|
|
14435
|
-
<a id="__codelineno-0-322" name="__codelineno-0-322"></a>
|
|
14436
|
-
<a id="__codelineno-0-323" name="__codelineno-0-323"></a>
|
|
14437
|
-
<a id="__codelineno-0-324" name="__codelineno-0-324"></a>
|
|
14438
|
-
<a id="__codelineno-0-325" name="__codelineno-0-325"></a>
|
|
14439
|
-
<a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="k">return</span> <span class="n">relationships_field_errors</span>
|
|
14295
|
+
<span class="normal"><a href="#__codelineno-0-325">325</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-223" name="__codelineno-0-223"></a><span class="nd">@classmethod</span>
|
|
14296
|
+
<a id="__codelineno-0-224" name="__codelineno-0-224"></a><span class="k">def</span> <span class="nf">required_related_objects_errors</span><span class="p">(</span>
|
|
14297
|
+
<a id="__codelineno-0-225" name="__codelineno-0-225"></a> <span class="bp">cls</span><span class="p">,</span> <span class="n">output_for</span><span class="o">=</span><span class="s2">"ui"</span><span class="p">,</span> <span class="n">initial_data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">relationships_key_specified</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">instance</span><span class="o">=</span><span class="kc">None</span>
|
|
14298
|
+
<a id="__codelineno-0-226" name="__codelineno-0-226"></a><span class="p">):</span>
|
|
14299
|
+
<a id="__codelineno-0-227" name="__codelineno-0-227"></a><span class="w"> </span><span class="sd">"""</span>
|
|
14300
|
+
<a id="__codelineno-0-228" name="__codelineno-0-228"></a><span class="sd"> Args:</span>
|
|
14301
|
+
<a id="__codelineno-0-229" name="__codelineno-0-229"></a><span class="sd"> output_for (str): either "ui" or "api" depending on usage</span>
|
|
14302
|
+
<a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="sd"> initial_data (dict): submitted form/serializer data to validate against</span>
|
|
14303
|
+
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="sd"> relationships_key_specified (bool): if the "relationships" key was provided or not</span>
|
|
14304
|
+
<a id="__codelineno-0-232" name="__codelineno-0-232"></a><span class="sd"> instance (Optional[BaseModel]): an optional model instance to validate against</span>
|
|
14305
|
+
<a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="sd"> Returns:</span>
|
|
14306
|
+
<a id="__codelineno-0-234" name="__codelineno-0-234"></a><span class="sd"> (list[dict]): List of field error dicts if any are found</span>
|
|
14307
|
+
<a id="__codelineno-0-235" name="__codelineno-0-235"></a><span class="sd"> """</span>
|
|
14308
|
+
<a id="__codelineno-0-236" name="__codelineno-0-236"></a>
|
|
14309
|
+
<a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="n">required_relationships</span> <span class="o">=</span> <span class="n">Relationship</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_required_for_model</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
|
|
14310
|
+
<a id="__codelineno-0-238" name="__codelineno-0-238"></a> <span class="n">relationships_field_errors</span> <span class="o">=</span> <span class="p">{}</span>
|
|
14311
|
+
<a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="k">for</span> <span class="n">relation</span> <span class="ow">in</span> <span class="n">required_relationships</span><span class="p">:</span>
|
|
14312
|
+
<a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="n">opposite_side</span> <span class="o">=</span> <span class="n">RelationshipSideChoices</span><span class="o">.</span><span class="n">OPPOSITE</span><span class="p">[</span><span class="n">relation</span><span class="o">.</span><span class="n">required_on</span><span class="p">]</span>
|
|
14313
|
+
<a id="__codelineno-0-241" name="__codelineno-0-241"></a>
|
|
14314
|
+
<a id="__codelineno-0-242" name="__codelineno-0-242"></a> <span class="k">if</span> <span class="n">relation</span><span class="o">.</span><span class="n">skip_required</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">opposite_side</span><span class="p">):</span>
|
|
14315
|
+
<a id="__codelineno-0-243" name="__codelineno-0-243"></a> <span class="k">continue</span>
|
|
14316
|
+
<a id="__codelineno-0-244" name="__codelineno-0-244"></a>
|
|
14317
|
+
<a id="__codelineno-0-245" name="__codelineno-0-245"></a> <span class="k">if</span> <span class="n">relation</span><span class="o">.</span><span class="n">has_many</span><span class="p">(</span><span class="n">opposite_side</span><span class="p">):</span>
|
|
14318
|
+
<a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="n">num_required_verbose</span> <span class="o">=</span> <span class="s2">"at least one"</span>
|
|
14319
|
+
<a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="k">else</span><span class="p">:</span>
|
|
14320
|
+
<a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="n">num_required_verbose</span> <span class="o">=</span> <span class="s2">"a"</span>
|
|
14321
|
+
<a id="__codelineno-0-249" name="__codelineno-0-249"></a>
|
|
14322
|
+
<a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
14323
|
+
<a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="c1"># If this is a model instance and the relationships json data key is missing, check to see if</span>
|
|
14324
|
+
<a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="c1"># required relationship associations already exist, and continue (ignore validation) if so</span>
|
|
14325
|
+
<a id="__codelineno-0-253" name="__codelineno-0-253"></a> <span class="k">if</span> <span class="p">(</span>
|
|
14326
|
+
<a id="__codelineno-0-254" name="__codelineno-0-254"></a> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="s2">"present_in_database"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span>
|
|
14327
|
+
<a id="__codelineno-0-255" name="__codelineno-0-255"></a> <span class="ow">and</span> <span class="n">initial_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">opposite_side</span><span class="p">,</span> <span class="p">{})</span> <span class="o">==</span> <span class="p">{}</span>
|
|
14328
|
+
<a id="__codelineno-0-256" name="__codelineno-0-256"></a> <span class="ow">and</span> <span class="ow">not</span> <span class="n">relationships_key_specified</span>
|
|
14329
|
+
<a id="__codelineno-0-257" name="__codelineno-0-257"></a> <span class="p">):</span>
|
|
14330
|
+
<a id="__codelineno-0-258" name="__codelineno-0-258"></a> <span class="n">filter_kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"relationship"</span><span class="p">:</span> <span class="n">relation</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">relation</span><span class="o">.</span><span class="n">required_on</span><span class="si">}</span><span class="s2">_id"</span><span class="p">:</span> <span class="n">instance</span><span class="o">.</span><span class="n">pk</span><span class="p">}</span>
|
|
14331
|
+
<a id="__codelineno-0-259" name="__codelineno-0-259"></a> <span class="k">if</span> <span class="n">RelationshipAssociation</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="o">**</span><span class="n">filter_kwargs</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
14332
|
+
<a id="__codelineno-0-260" name="__codelineno-0-260"></a> <span class="k">continue</span>
|
|
14333
|
+
<a id="__codelineno-0-261" name="__codelineno-0-261"></a>
|
|
14334
|
+
<a id="__codelineno-0-262" name="__codelineno-0-262"></a> <span class="n">required_model_class</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">opposite_side</span><span class="si">}</span><span class="s2">_type"</span><span class="p">)</span><span class="o">.</span><span class="n">model_class</span><span class="p">()</span>
|
|
14335
|
+
<a id="__codelineno-0-263" name="__codelineno-0-263"></a> <span class="n">required_model_meta</span> <span class="o">=</span> <span class="n">required_model_class</span><span class="o">.</span><span class="n">_meta</span>
|
|
14336
|
+
<a id="__codelineno-0-264" name="__codelineno-0-264"></a> <span class="n">cr_field_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"cr_</span><span class="si">{</span><span class="n">relation</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">opposite_side</span><span class="si">}</span><span class="s2">"</span>
|
|
14337
|
+
<a id="__codelineno-0-265" name="__codelineno-0-265"></a> <span class="n">name_plural</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span>
|
|
14338
|
+
<a id="__codelineno-0-266" name="__codelineno-0-266"></a> <span class="n">field_key</span> <span class="o">=</span> <span class="n">relation</span><span class="o">.</span><span class="n">key</span> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span> <span class="k">else</span> <span class="n">cr_field_name</span>
|
|
14339
|
+
<a id="__codelineno-0-267" name="__codelineno-0-267"></a> <span class="n">field_errors</span> <span class="o">=</span> <span class="p">{</span><span class="n">field_key</span><span class="p">:</span> <span class="p">[]}</span>
|
|
14340
|
+
<a id="__codelineno-0-268" name="__codelineno-0-268"></a>
|
|
14341
|
+
<a id="__codelineno-0-269" name="__codelineno-0-269"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">required_model_class</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
14342
|
+
<a id="__codelineno-0-270" name="__codelineno-0-270"></a> <span class="n">hint</span> <span class="o">=</span> <span class="p">(</span>
|
|
14343
|
+
<a id="__codelineno-0-271" name="__codelineno-0-271"></a> <span class="sa">f</span><span class="s2">"You need to create </span><span class="si">{</span><span class="n">num_required_verbose</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2"> "</span>
|
|
14344
|
+
<a id="__codelineno-0-272" name="__codelineno-0-272"></a> <span class="sa">f</span><span class="s2">"before instantiating a </span><span class="si">{</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2">."</span>
|
|
14345
|
+
<a id="__codelineno-0-273" name="__codelineno-0-273"></a> <span class="p">)</span>
|
|
14346
|
+
<a id="__codelineno-0-274" name="__codelineno-0-274"></a>
|
|
14347
|
+
<a id="__codelineno-0-275" name="__codelineno-0-275"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"ui"</span><span class="p">:</span>
|
|
14348
|
+
<a id="__codelineno-0-276" name="__codelineno-0-276"></a> <span class="k">try</span><span class="p">:</span>
|
|
14349
|
+
<a id="__codelineno-0-277" name="__codelineno-0-277"></a> <span class="n">add_url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">get_route_for_model</span><span class="p">(</span><span class="n">required_model_class</span><span class="p">,</span> <span class="s2">"add"</span><span class="p">))</span>
|
|
14350
|
+
<a id="__codelineno-0-278" name="__codelineno-0-278"></a> <span class="n">hint</span> <span class="o">=</span> <span class="n">format_html</span><span class="p">(</span>
|
|
14351
|
+
<a id="__codelineno-0-279" name="__codelineno-0-279"></a> <span class="s1">'<a target="_blank" href="</span><span class="si">{}</span><span class="s1">">Click here</a> to create a </span><span class="si">{}</span><span class="s1">.'</span><span class="p">,</span>
|
|
14352
|
+
<a id="__codelineno-0-280" name="__codelineno-0-280"></a> <span class="n">add_url</span><span class="p">,</span>
|
|
14353
|
+
<a id="__codelineno-0-281" name="__codelineno-0-281"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
|
|
14354
|
+
<a id="__codelineno-0-282" name="__codelineno-0-282"></a> <span class="p">)</span>
|
|
14355
|
+
<a id="__codelineno-0-283" name="__codelineno-0-283"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
14356
|
+
<a id="__codelineno-0-284" name="__codelineno-0-284"></a> <span class="k">pass</span>
|
|
14357
|
+
<a id="__codelineno-0-285" name="__codelineno-0-285"></a>
|
|
14358
|
+
<a id="__codelineno-0-286" name="__codelineno-0-286"></a> <span class="k">elif</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
14359
|
+
<a id="__codelineno-0-287" name="__codelineno-0-287"></a> <span class="k">try</span><span class="p">:</span>
|
|
14360
|
+
<a id="__codelineno-0-288" name="__codelineno-0-288"></a> <span class="n">api_post_url</span> <span class="o">=</span> <span class="n">reverse</span><span class="p">(</span><span class="n">get_route_for_model</span><span class="p">(</span><span class="n">required_model_class</span><span class="p">,</span> <span class="s2">"list"</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
14361
|
+
<a id="__codelineno-0-289" name="__codelineno-0-289"></a> <span class="n">hint</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Create a </span><span class="si">{</span><span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2"> by posting to </span><span class="si">{</span><span class="n">api_post_url</span><span class="si">}</span><span class="s2">"</span>
|
|
14362
|
+
<a id="__codelineno-0-290" name="__codelineno-0-290"></a> <span class="k">except</span> <span class="n">NoReverseMatch</span><span class="p">:</span>
|
|
14363
|
+
<a id="__codelineno-0-291" name="__codelineno-0-291"></a> <span class="k">pass</span>
|
|
14364
|
+
<a id="__codelineno-0-292" name="__codelineno-0-292"></a>
|
|
14365
|
+
<a id="__codelineno-0-293" name="__codelineno-0-293"></a> <span class="n">error_message</span> <span class="o">=</span> <span class="n">format_html</span><span class="p">(</span>
|
|
14366
|
+
<a id="__codelineno-0-294" name="__codelineno-0-294"></a> <span class="s2">"</span><span class="si">{}</span><span class="s2"> require </span><span class="si">{}</span><span class="s2"> </span><span class="si">{}</span><span class="s2">, but no </span><span class="si">{}</span><span class="s2"> exist yet. "</span><span class="p">,</span>
|
|
14367
|
+
<a id="__codelineno-0-295" name="__codelineno-0-295"></a> <span class="n">bettertitle</span><span class="p">(</span><span class="n">name_plural</span><span class="p">),</span>
|
|
14368
|
+
<a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="n">num_required_verbose</span><span class="p">,</span>
|
|
14369
|
+
<a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="p">,</span>
|
|
14370
|
+
<a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name_plural</span><span class="p">,</span>
|
|
14371
|
+
<a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="p">)</span>
|
|
14372
|
+
<a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="n">error_message</span> <span class="o">+=</span> <span class="n">hint</span>
|
|
14373
|
+
<a id="__codelineno-0-301" name="__codelineno-0-301"></a> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">error_message</span><span class="p">)</span>
|
|
14374
|
+
<a id="__codelineno-0-302" name="__codelineno-0-302"></a>
|
|
14375
|
+
<a id="__codelineno-0-303" name="__codelineno-0-303"></a> <span class="k">if</span> <span class="n">initial_data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
14376
|
+
<a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="n">supplied_data</span> <span class="o">=</span> <span class="p">[]</span>
|
|
14377
|
+
<a id="__codelineno-0-305" name="__codelineno-0-305"></a>
|
|
14378
|
+
<a id="__codelineno-0-306" name="__codelineno-0-306"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"ui"</span><span class="p">:</span>
|
|
14379
|
+
<a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="n">supplied_data</span> <span class="o">=</span> <span class="n">initial_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field_key</span><span class="p">,</span> <span class="p">[])</span>
|
|
14380
|
+
<a id="__codelineno-0-308" name="__codelineno-0-308"></a>
|
|
14381
|
+
<a id="__codelineno-0-309" name="__codelineno-0-309"></a> <span class="k">elif</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
14382
|
+
<a id="__codelineno-0-310" name="__codelineno-0-310"></a> <span class="n">supplied_data</span> <span class="o">=</span> <span class="n">initial_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">relation</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">opposite_side</span><span class="p">,</span> <span class="p">{})</span>
|
|
14383
|
+
<a id="__codelineno-0-311" name="__codelineno-0-311"></a>
|
|
14384
|
+
<a id="__codelineno-0-312" name="__codelineno-0-312"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">supplied_data</span><span class="p">:</span>
|
|
14385
|
+
<a id="__codelineno-0-313" name="__codelineno-0-313"></a> <span class="k">if</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"ui"</span><span class="p">:</span>
|
|
14386
|
+
<a id="__codelineno-0-314" name="__codelineno-0-314"></a> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
14387
|
+
<a id="__codelineno-0-315" name="__codelineno-0-315"></a> <span class="sa">f</span><span class="s2">"You need to select </span><span class="si">{</span><span class="n">num_required_verbose</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">required_model_meta</span><span class="o">.</span><span class="n">verbose_name</span><span class="si">}</span><span class="s2">."</span>
|
|
14388
|
+
<a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="p">)</span>
|
|
14389
|
+
<a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="k">elif</span> <span class="n">output_for</span> <span class="o">==</span> <span class="s2">"api"</span><span class="p">:</span>
|
|
14390
|
+
<a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
14391
|
+
<a id="__codelineno-0-319" name="__codelineno-0-319"></a> <span class="sa">f</span><span class="s1">'You need to specify ["relationships"]["</span><span class="si">{</span><span class="n">relation</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s1">"]["</span><span class="si">{</span><span class="n">opposite_side</span><span class="si">}</span><span class="s1">"]["objects"].'</span>
|
|
14392
|
+
<a id="__codelineno-0-320" name="__codelineno-0-320"></a> <span class="p">)</span>
|
|
14393
|
+
<a id="__codelineno-0-321" name="__codelineno-0-321"></a>
|
|
14394
|
+
<a id="__codelineno-0-322" name="__codelineno-0-322"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">])</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
14395
|
+
<a id="__codelineno-0-323" name="__codelineno-0-323"></a> <span class="n">relationships_field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span> <span class="o">=</span> <span class="n">field_errors</span><span class="p">[</span><span class="n">field_key</span><span class="p">]</span>
|
|
14396
|
+
<a id="__codelineno-0-324" name="__codelineno-0-324"></a>
|
|
14397
|
+
<a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="k">return</span> <span class="n">relationships_field_errors</span>
|
|
14440
14398
|
</code></pre></div></td></tr></table></div>
|
|
14441
14399
|
</details>
|
|
14442
14400
|
</div>
|
|
@@ -15543,9 +15501,9 @@ having to define it on the model yourself.</p>
|
|
|
15543
15501
|
|
|
15544
15502
|
<details class="quote">
|
|
15545
15503
|
<summary>Source code in <code>nautobot/core/models/managers.py</code></summary>
|
|
15546
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
15547
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
15548
|
-
<a id="__codelineno-0-
|
|
15504
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-43">43</a></span>
|
|
15505
|
+
<span class="normal"><a href="#__codelineno-0-44">44</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="k">class</span> <span class="nc">TagsManager</span><span class="p">(</span><span class="n">_TaggableManager</span><span class="p">,</span> <span class="n">BaseManager</span><span class="p">):</span>
|
|
15506
|
+
<a id="__codelineno-0-44" name="__codelineno-0-44"></a><span class="w"> </span><span class="sd">"""Manager class for model 'tags' fields."""</span>
|
|
15549
15507
|
</code></pre></div></td></tr></table></div>
|
|
15550
15508
|
</details>
|
|
15551
15509
|
|
|
@@ -15573,19 +15531,19 @@ having to define it on the model yourself.</p>
|
|
|
15573
15531
|
|
|
15574
15532
|
<details class="quote">
|
|
15575
15533
|
<summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
|
|
15576
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
15534
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-23">23</a></span>
|
|
15535
|
+
<span class="normal"><a href="#__codelineno-0-24">24</a></span>
|
|
15536
|
+
<span class="normal"><a href="#__codelineno-0-25">25</a></span>
|
|
15577
15537
|
<span class="normal"><a href="#__codelineno-0-26">26</a></span>
|
|
15578
15538
|
<span class="normal"><a href="#__codelineno-0-27">27</a></span>
|
|
15579
15539
|
<span class="normal"><a href="#__codelineno-0-28">28</a></span>
|
|
15580
|
-
<span class="normal"><a href="#__codelineno-0-29">29</a></span>
|
|
15581
|
-
<
|
|
15582
|
-
<
|
|
15583
|
-
<a id="__codelineno-0-26" name="__codelineno-0-26"></a><span class="
|
|
15584
|
-
<a id="__codelineno-0-27" name="__codelineno-0-27"></a
|
|
15585
|
-
<a id="__codelineno-0-28" name="__codelineno-0-28"></a
|
|
15586
|
-
<a id="__codelineno-0-29" name="__codelineno-0-29"></a>
|
|
15587
|
-
<a id="__codelineno-0-30" name="__codelineno-0-30"></a> <span class="n">_with_tree_fields</span> <span class="o">=</span> <span class="kc">True</span>
|
|
15588
|
-
<a id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="n">use_in_migrations</span> <span class="o">=</span> <span class="kc">True</span>
|
|
15540
|
+
<span class="normal"><a href="#__codelineno-0-29">29</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-23" name="__codelineno-0-23"></a><span class="k">class</span> <span class="nc">TreeManager</span><span class="p">(</span><span class="n">TreeManager_</span><span class="p">,</span> <span class="n">BaseManager</span><span class="o">.</span><span class="n">from_queryset</span><span class="p">(</span><span class="n">TreeQuerySet</span><span class="p">)):</span>
|
|
15541
|
+
<a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="w"> </span><span class="sd">"""</span>
|
|
15542
|
+
<a id="__codelineno-0-25" name="__codelineno-0-25"></a><span class="sd"> Extend django-tree-queries' TreeManager to incorporate RestrictedQuerySet.</span>
|
|
15543
|
+
<a id="__codelineno-0-26" name="__codelineno-0-26"></a><span class="sd"> """</span>
|
|
15544
|
+
<a id="__codelineno-0-27" name="__codelineno-0-27"></a>
|
|
15545
|
+
<a id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="n">_with_tree_fields</span> <span class="o">=</span> <span class="kc">True</span>
|
|
15546
|
+
<a id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="n">use_in_migrations</span> <span class="o">=</span> <span class="kc">True</span>
|
|
15589
15547
|
</code></pre></div></td></tr></table></div>
|
|
15590
15548
|
</details>
|
|
15591
15549
|
|
|
@@ -15629,7 +15587,9 @@ having to define it on the model yourself.</p>
|
|
|
15629
15587
|
|
|
15630
15588
|
<details class="quote">
|
|
15631
15589
|
<summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
|
|
15632
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
15590
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-32">32</a></span>
|
|
15591
|
+
<span class="normal"><a href="#__codelineno-0-33">33</a></span>
|
|
15592
|
+
<span class="normal"><a href="#__codelineno-0-34">34</a></span>
|
|
15633
15593
|
<span class="normal"><a href="#__codelineno-0-35">35</a></span>
|
|
15634
15594
|
<span class="normal"><a href="#__codelineno-0-36">36</a></span>
|
|
15635
15595
|
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
|
|
@@ -15659,41 +15619,39 @@ having to define it on the model yourself.</p>
|
|
|
15659
15619
|
<span class="normal"><a href="#__codelineno-0-61">61</a></span>
|
|
15660
15620
|
<span class="normal"><a href="#__codelineno-0-62">62</a></span>
|
|
15661
15621
|
<span class="normal"><a href="#__codelineno-0-63">63</a></span>
|
|
15662
|
-
<span class="normal"><a href="#__codelineno-0-64">64</a></span>
|
|
15663
|
-
<
|
|
15664
|
-
<
|
|
15665
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="
|
|
15666
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a
|
|
15667
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="
|
|
15622
|
+
<span class="normal"><a href="#__codelineno-0-64">64</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="k">class</span> <span class="nc">TreeModel</span><span class="p">(</span><span class="n">TreeNode</span><span class="p">):</span>
|
|
15623
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="w"> </span><span class="sd">"""</span>
|
|
15624
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a><span class="sd"> Nautobot-specific base class for models that exist in a self-referential tree.</span>
|
|
15625
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd"> """</span>
|
|
15626
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a>
|
|
15627
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="n">objects</span> <span class="o">=</span> <span class="n">TreeManager</span><span class="p">()</span>
|
|
15668
15628
|
<a id="__codelineno-0-38" name="__codelineno-0-38"></a>
|
|
15669
|
-
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="
|
|
15670
|
-
<a id="__codelineno-0-40" name="__codelineno-0-40"></a>
|
|
15671
|
-
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
15672
|
-
<a id="__codelineno-0-42" name="__codelineno-0-42"></a>
|
|
15673
|
-
<a id="__codelineno-0-43" name="__codelineno-0-43"></a>
|
|
15674
|
-
<a id="__codelineno-0-44" name="__codelineno-0-44"></a
|
|
15675
|
-
<a id="__codelineno-0-45" name="__codelineno-0-45"></a
|
|
15676
|
-
<a id="__codelineno-0-46" name="__codelineno-0-46"></a
|
|
15677
|
-
<a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="sd">
|
|
15678
|
-
<a id="__codelineno-0-48" name="__codelineno-0-48"></a>
|
|
15679
|
-
<a id="__codelineno-0-49" name="__codelineno-0-49"></a
|
|
15680
|
-
<a id="__codelineno-0-50" name="__codelineno-0-50"></a><span class="
|
|
15681
|
-
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="
|
|
15682
|
-
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
15683
|
-
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="
|
|
15684
|
-
<a id="__codelineno-0-54" name="__codelineno-0-54"></a>
|
|
15685
|
-
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="k">
|
|
15686
|
-
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="k">
|
|
15687
|
-
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
15688
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
15689
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a>
|
|
15690
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a>
|
|
15691
|
-
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
15692
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="
|
|
15693
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a>
|
|
15694
|
-
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="
|
|
15695
|
-
<a id="__codelineno-0-65" name="__codelineno-0-65"></a> <span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="n">display_str</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
|
15696
|
-
<a id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="k">return</span> <span class="n">display_str</span> <span class="c1"># pylint: disable=lost-exception</span>
|
|
15629
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
|
|
15630
|
+
<a id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="n">abstract</span> <span class="o">=</span> <span class="kc">True</span>
|
|
15631
|
+
<a id="__codelineno-0-41" name="__codelineno-0-41"></a>
|
|
15632
|
+
<a id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="nd">@property</span>
|
|
15633
|
+
<a id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="k">def</span> <span class="nf">display</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
15634
|
+
<a id="__codelineno-0-44" name="__codelineno-0-44"></a><span class="w"> </span><span class="sd">"""</span>
|
|
15635
|
+
<a id="__codelineno-0-45" name="__codelineno-0-45"></a><span class="sd"> By default, TreeModels display their full ancestry for clarity.</span>
|
|
15636
|
+
<a id="__codelineno-0-46" name="__codelineno-0-46"></a>
|
|
15637
|
+
<a id="__codelineno-0-47" name="__codelineno-0-47"></a><span class="sd"> As this is an expensive thing to calculate, we cache it for a few seconds in the case of repeated lookups.</span>
|
|
15638
|
+
<a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="sd"> """</span>
|
|
15639
|
+
<a id="__codelineno-0-49" name="__codelineno-0-49"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"name"</span><span class="p">):</span>
|
|
15640
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"default TreeModel.display implementation requires a `name` attribute!"</span><span class="p">)</span>
|
|
15641
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">cache_key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">.</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">.display"</span>
|
|
15642
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="n">display_str</span> <span class="o">=</span> <span class="n">cache</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span>
|
|
15643
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="k">if</span> <span class="n">display_str</span><span class="p">:</span>
|
|
15644
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="k">return</span> <span class="n">display_str</span>
|
|
15645
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="k">try</span><span class="p">:</span>
|
|
15646
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
15647
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="n">display_str</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">display</span> <span class="o">+</span> <span class="s2">" → "</span>
|
|
15648
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">except</span> <span class="bp">self</span><span class="o">.</span><span class="n">DoesNotExist</span><span class="p">:</span>
|
|
15649
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="c1"># Expected to occur at times during bulk-delete operations</span>
|
|
15650
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></a> <span class="k">pass</span>
|
|
15651
|
+
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="k">finally</span><span class="p">:</span>
|
|
15652
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="n">display_str</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
|
|
15653
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="n">cache</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">cache_key</span><span class="p">,</span> <span class="n">display_str</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
|
|
15654
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="k">return</span> <span class="n">display_str</span> <span class="c1"># pylint: disable=lost-exception</span>
|
|
15697
15655
|
</code></pre></div></td></tr></table></div>
|
|
15698
15656
|
</details>
|
|
15699
15657
|
|
|
@@ -15759,7 +15717,9 @@ having to define it on the model yourself.</p>
|
|
|
15759
15717
|
|
|
15760
15718
|
<details class="quote">
|
|
15761
15719
|
<summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
|
|
15762
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
15720
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-8"> 8</a></span>
|
|
15721
|
+
<span class="normal"><a href="#__codelineno-0-9"> 9</a></span>
|
|
15722
|
+
<span class="normal"><a href="#__codelineno-0-10">10</a></span>
|
|
15763
15723
|
<span class="normal"><a href="#__codelineno-0-11">11</a></span>
|
|
15764
15724
|
<span class="normal"><a href="#__codelineno-0-12">12</a></span>
|
|
15765
15725
|
<span class="normal"><a href="#__codelineno-0-13">13</a></span>
|
|
@@ -15769,21 +15729,19 @@ having to define it on the model yourself.</p>
|
|
|
15769
15729
|
<span class="normal"><a href="#__codelineno-0-17">17</a></span>
|
|
15770
15730
|
<span class="normal"><a href="#__codelineno-0-18">18</a></span>
|
|
15771
15731
|
<span class="normal"><a href="#__codelineno-0-19">19</a></span>
|
|
15772
|
-
<span class="normal"><a href="#__codelineno-0-20">20</a></span>
|
|
15773
|
-
<
|
|
15774
|
-
<
|
|
15775
|
-
<a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="
|
|
15776
|
-
<a id="__codelineno-0-12" name="__codelineno-0-12"></a
|
|
15777
|
-
<a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="
|
|
15778
|
-
<a id="__codelineno-0-14" name="__codelineno-0-14"></a>
|
|
15779
|
-
<a id="__codelineno-0-15" name="__codelineno-0-15"></a
|
|
15780
|
-
<a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="
|
|
15781
|
-
<a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="
|
|
15782
|
-
<a id="__codelineno-0-18" name="__codelineno-0-18"></a
|
|
15783
|
-
<a id="__codelineno-0-19" name="__codelineno-0-19"></a>
|
|
15784
|
-
<a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="k">
|
|
15785
|
-
<a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
|
|
15786
|
-
<a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="k">return</span> <span class="mi">0</span>
|
|
15732
|
+
<span class="normal"><a href="#__codelineno-0-20">20</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-8" name="__codelineno-0-8"></a><span class="k">class</span> <span class="nc">TreeQuerySet</span><span class="p">(</span><span class="n">TreeQuerySet_</span><span class="p">,</span> <span class="n">querysets</span><span class="o">.</span><span class="n">RestrictedQuerySet</span><span class="p">):</span>
|
|
15733
|
+
<a id="__codelineno-0-9" name="__codelineno-0-9"></a><span class="w"> </span><span class="sd">"""</span>
|
|
15734
|
+
<a id="__codelineno-0-10" name="__codelineno-0-10"></a><span class="sd"> Combine django-tree-queries' TreeQuerySet with our RestrictedQuerySet for permissions enforcement.</span>
|
|
15735
|
+
<a id="__codelineno-0-11" name="__codelineno-0-11"></a><span class="sd"> """</span>
|
|
15736
|
+
<a id="__codelineno-0-12" name="__codelineno-0-12"></a>
|
|
15737
|
+
<a id="__codelineno-0-13" name="__codelineno-0-13"></a> <span class="k">def</span> <span class="nf">max_tree_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
15738
|
+
<a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="w"> </span><span class="sd">"""</span>
|
|
15739
|
+
<a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="sd"> Get the maximum depth of any tree in this queryset.</span>
|
|
15740
|
+
<a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="sd"> """</span>
|
|
15741
|
+
<a id="__codelineno-0-17" name="__codelineno-0-17"></a> <span class="n">deepest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">order_by</span><span class="o">=</span><span class="p">[</span><span class="s2">"-__tree.tree_depth"</span><span class="p">])</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
|
|
15742
|
+
<a id="__codelineno-0-18" name="__codelineno-0-18"></a> <span class="k">if</span> <span class="n">deepest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
15743
|
+
<a id="__codelineno-0-19" name="__codelineno-0-19"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
|
|
15744
|
+
<a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="k">return</span> <span class="mi">0</span>
|
|
15787
15745
|
</code></pre></div></td></tr></table></div>
|
|
15788
15746
|
</details>
|
|
15789
15747
|
|
|
@@ -15816,21 +15774,21 @@ having to define it on the model yourself.</p>
|
|
|
15816
15774
|
|
|
15817
15775
|
<details class="quote">
|
|
15818
15776
|
<summary>Source code in <code>nautobot/core/models/tree_queries.py</code></summary>
|
|
15819
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
15777
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-13">13</a></span>
|
|
15778
|
+
<span class="normal"><a href="#__codelineno-0-14">14</a></span>
|
|
15779
|
+
<span class="normal"><a href="#__codelineno-0-15">15</a></span>
|
|
15820
15780
|
<span class="normal"><a href="#__codelineno-0-16">16</a></span>
|
|
15821
15781
|
<span class="normal"><a href="#__codelineno-0-17">17</a></span>
|
|
15822
15782
|
<span class="normal"><a href="#__codelineno-0-18">18</a></span>
|
|
15823
15783
|
<span class="normal"><a href="#__codelineno-0-19">19</a></span>
|
|
15824
|
-
<span class="normal"><a href="#__codelineno-0-20">20</a></span>
|
|
15825
|
-
<
|
|
15826
|
-
<
|
|
15827
|
-
<a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="
|
|
15828
|
-
<a id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="
|
|
15829
|
-
<a id="__codelineno-0-18" name="__codelineno-0-18"></a
|
|
15830
|
-
<a id="__codelineno-0-19" name="__codelineno-0-19"></a>
|
|
15831
|
-
<a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="k">
|
|
15832
|
-
<a id="__codelineno-0-21" name="__codelineno-0-21"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
|
|
15833
|
-
<a id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="k">return</span> <span class="mi">0</span>
|
|
15784
|
+
<span class="normal"><a href="#__codelineno-0-20">20</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="k">def</span> <span class="nf">max_tree_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
15785
|
+
<a id="__codelineno-0-14" name="__codelineno-0-14"></a><span class="w"> </span><span class="sd">"""</span>
|
|
15786
|
+
<a id="__codelineno-0-15" name="__codelineno-0-15"></a><span class="sd"> Get the maximum depth of any tree in this queryset.</span>
|
|
15787
|
+
<a id="__codelineno-0-16" name="__codelineno-0-16"></a><span class="sd"> """</span>
|
|
15788
|
+
<a id="__codelineno-0-17" name="__codelineno-0-17"></a> <span class="n">deepest</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">with_tree_fields</span><span class="p">()</span><span class="o">.</span><span class="n">extra</span><span class="p">(</span><span class="n">order_by</span><span class="o">=</span><span class="p">[</span><span class="s2">"-__tree.tree_depth"</span><span class="p">])</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
|
|
15789
|
+
<a id="__codelineno-0-18" name="__codelineno-0-18"></a> <span class="k">if</span> <span class="n">deepest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
15790
|
+
<a id="__codelineno-0-19" name="__codelineno-0-19"></a> <span class="k">return</span> <span class="n">deepest</span><span class="o">.</span><span class="n">tree_depth</span>
|
|
15791
|
+
<a id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="k">return</span> <span class="mi">0</span>
|
|
15834
15792
|
</code></pre></div></td></tr></table></div>
|
|
15835
15793
|
</details>
|
|
15836
15794
|
</div>
|
|
@@ -16648,7 +16606,8 @@ slug, and then they are joined with an underscore.</p>
|
|
|
16648
16606
|
|
|
16649
16607
|
<details class="quote">
|
|
16650
16608
|
<summary>Source code in <code>nautobot/extras/utils.py</code></summary>
|
|
16651
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
16609
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-200">200</a></span>
|
|
16610
|
+
<span class="normal"><a href="#__codelineno-0-201">201</a></span>
|
|
16652
16611
|
<span class="normal"><a href="#__codelineno-0-202">202</a></span>
|
|
16653
16612
|
<span class="normal"><a href="#__codelineno-0-203">203</a></span>
|
|
16654
16613
|
<span class="normal"><a href="#__codelineno-0-204">204</a></span>
|
|
@@ -16664,25 +16623,24 @@ slug, and then they are joined with an underscore.</p>
|
|
|
16664
16623
|
<span class="normal"><a href="#__codelineno-0-214">214</a></span>
|
|
16665
16624
|
<span class="normal"><a href="#__codelineno-0-215">215</a></span>
|
|
16666
16625
|
<span class="normal"><a href="#__codelineno-0-216">216</a></span>
|
|
16667
|
-
<span class="normal"><a href="#__codelineno-0-217">217</a></span>
|
|
16668
|
-
<
|
|
16669
|
-
<a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="
|
|
16670
|
-
<a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd">
|
|
16671
|
-
<a id="__codelineno-0-204" name="__codelineno-0-204"></a
|
|
16672
|
-
<a id="__codelineno-0-205" name="__codelineno-0-205"></a>
|
|
16673
|
-
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
16674
|
-
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="
|
|
16675
|
-
<a id="__codelineno-0-208" name="__codelineno-0-208"></a>
|
|
16676
|
-
<a id="__codelineno-0-209" name="__codelineno-0-209"></a>
|
|
16677
|
-
<a id="__codelineno-0-210" name="__codelineno-0-210"></a>
|
|
16678
|
-
<a id="__codelineno-0-211" name="__codelineno-0-211"></a>
|
|
16679
|
-
<a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="n">
|
|
16680
|
-
<a id="__codelineno-0-213" name="__codelineno-0-213"></a>
|
|
16681
|
-
<a id="__codelineno-0-214" name="__codelineno-0-214"></a>
|
|
16682
|
-
<a id="__codelineno-0-215" name="__codelineno-0-215"></a>
|
|
16683
|
-
<a id="__codelineno-0-216" name="__codelineno-0-216"></a>
|
|
16684
|
-
<a id="__codelineno-0-217" name="__codelineno-0-217"></a>
|
|
16685
|
-
<a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">return</span> <span class="n">wrapper</span>
|
|
16626
|
+
<span class="normal"><a href="#__codelineno-0-217">217</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-200" name="__codelineno-0-200"></a><span class="k">def</span> <span class="nf">extras_features</span><span class="p">(</span><span class="o">*</span><span class="n">features</span><span class="p">):</span>
|
|
16627
|
+
<a id="__codelineno-0-201" name="__codelineno-0-201"></a><span class="w"> </span><span class="sd">"""</span>
|
|
16628
|
+
<a id="__codelineno-0-202" name="__codelineno-0-202"></a><span class="sd"> Decorator used to register extras provided features to a model</span>
|
|
16629
|
+
<a id="__codelineno-0-203" name="__codelineno-0-203"></a><span class="sd"> """</span>
|
|
16630
|
+
<a id="__codelineno-0-204" name="__codelineno-0-204"></a>
|
|
16631
|
+
<a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">model_class</span><span class="p">):</span>
|
|
16632
|
+
<a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="c1"># Initialize the model_features store if not already defined</span>
|
|
16633
|
+
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">if</span> <span class="s2">"model_features"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">registry</span><span class="p">:</span>
|
|
16634
|
+
<a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">"model_features"</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">f</span><span class="p">:</span> <span class="n">collections</span><span class="o">.</span><span class="n">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">EXTRAS_FEATURES</span><span class="p">}</span>
|
|
16635
|
+
<a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="k">for</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">features</span><span class="p">:</span>
|
|
16636
|
+
<a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">if</span> <span class="n">feature</span> <span class="ow">in</span> <span class="n">EXTRAS_FEATURES</span><span class="p">:</span>
|
|
16637
|
+
<a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="n">app_label</span><span class="p">,</span> <span class="n">model_name</span> <span class="o">=</span> <span class="n">model_class</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">label_lower</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"."</span><span class="p">)</span>
|
|
16638
|
+
<a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="n">registry</span><span class="p">[</span><span class="s2">"model_features"</span><span class="p">][</span><span class="n">feature</span><span class="p">][</span><span class="n">app_label</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">model_name</span><span class="p">)</span>
|
|
16639
|
+
<a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="k">else</span><span class="p">:</span>
|
|
16640
|
+
<a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">feature</span><span class="si">}</span><span class="s2"> is not a valid extras feature!"</span><span class="p">)</span>
|
|
16641
|
+
<a id="__codelineno-0-215" name="__codelineno-0-215"></a> <span class="k">return</span> <span class="n">model_class</span>
|
|
16642
|
+
<a id="__codelineno-0-216" name="__codelineno-0-216"></a>
|
|
16643
|
+
<a id="__codelineno-0-217" name="__codelineno-0-217"></a> <span class="k">return</span> <span class="n">wrapper</span>
|
|
16686
16644
|
</code></pre></div></td></tr></table></div>
|
|
16687
16645
|
</details>
|
|
16688
16646
|
</div>
|