nautobot 2.4.13__py3-none-any.whl → 2.4.15__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.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/apps/choices.py +8 -0
- nautobot/apps/ui.py +14 -0
- nautobot/core/api/views.py +2 -0
- nautobot/core/choices.py +4 -0
- nautobot/core/filters.py +21 -41
- nautobot/core/graphql/generators.py +8 -0
- nautobot/core/graphql/schema.py +30 -30
- nautobot/core/management/commands/check_job_approval_status.py +47 -0
- nautobot/core/management/commands/generate_test_data.py +1 -1
- nautobot/core/management/commands/migrate.py +90 -1
- nautobot/core/models/tree_queries.py +17 -0
- nautobot/core/settings.py +2 -2
- nautobot/core/settings.yaml +3 -3
- nautobot/core/tables.py +29 -6
- nautobot/core/templates/base_django.html +1 -1
- nautobot/core/templates/components/panel/header_extra_content_table.html +1 -1
- nautobot/core/templates/generic/object_list.html +17 -20
- nautobot/core/templates/inc/breadcrumbs.html +14 -0
- nautobot/core/templatetags/buttons.py +2 -4
- nautobot/core/templatetags/helpers.py +29 -6
- nautobot/core/templatetags/ui_framework.py +21 -0
- nautobot/core/testing/api.py +7 -0
- nautobot/core/testing/filters.py +20 -3
- nautobot/core/testing/forms.py +1 -1
- nautobot/core/tests/integration/test_filters.py +2 -2
- nautobot/core/tests/test_breadcrumbs.py +366 -0
- nautobot/core/tests/test_commands.py +40 -0
- nautobot/core/tests/test_filters.py +51 -1
- nautobot/core/tests/test_forms.py +1 -1
- nautobot/core/tests/test_graphql.py +4 -4
- nautobot/core/tests/test_titles.py +183 -0
- nautobot/core/tests/test_tree_queries.py +30 -0
- nautobot/core/tests/test_views.py +2 -2
- nautobot/core/tests/test_views_utils.py +1 -1
- nautobot/core/ui/breadcrumbs.py +538 -0
- nautobot/core/ui/bulk_buttons.py +53 -0
- nautobot/core/ui/object_detail.py +31 -8
- nautobot/core/ui/titles.py +127 -0
- nautobot/core/ui/utils.py +25 -0
- nautobot/core/utils/migrations.py +1 -1
- nautobot/core/views/__init__.py +1 -1
- nautobot/core/views/mixins.py +26 -1
- nautobot/core/views/renderers.py +20 -2
- nautobot/core/views/utils.py +14 -13
- nautobot/dcim/api/serializers.py +9 -0
- nautobot/dcim/choices.py +55 -0
- nautobot/dcim/constants.py +0 -16
- nautobot/dcim/factory.py +1 -1
- nautobot/dcim/filters/__init__.py +15 -3
- nautobot/dcim/forms.py +120 -7
- nautobot/dcim/management/commands/trace_paths.py +1 -1
- nautobot/dcim/migrations/0072_alter_powerfeed_options_and_more.py +97 -0
- nautobot/dcim/models/device_component_templates.py +8 -0
- nautobot/dcim/models/device_components.py +31 -12
- nautobot/dcim/models/devices.py +1 -1
- nautobot/dcim/models/power.py +171 -10
- nautobot/dcim/models/racks.py +7 -4
- nautobot/dcim/tables/devices.py +2 -0
- nautobot/dcim/tables/devicetypes.py +1 -0
- nautobot/dcim/tables/power.py +30 -2
- nautobot/dcim/templates/dcim/device.html +2 -2
- nautobot/dcim/templates/dcim/devicetype_retrieve.html +1 -214
- nautobot/dcim/templates/dcim/location_retrieve.html +2 -2
- nautobot/dcim/templates/dcim/powerfeed_edit.html +8 -0
- nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/rack.html +2 -318
- nautobot/dcim/templates/dcim/rack_edit.html +2 -47
- nautobot/dcim/templates/dcim/rack_retrieve.html +318 -0
- nautobot/dcim/templates/dcim/rack_update.html +47 -0
- nautobot/dcim/tests/integration/test_device_bulk_operations.py +61 -0
- nautobot/dcim/tests/test_api.py +24 -4
- nautobot/dcim/tests/test_filters.py +91 -13
- nautobot/dcim/tests/test_models.py +262 -0
- nautobot/dcim/tests/test_views.py +20 -12
- nautobot/dcim/urls.py +2 -27
- nautobot/dcim/utils.py +13 -30
- nautobot/dcim/views.py +428 -146
- nautobot/extras/choices.py +12 -4
- nautobot/extras/factory.py +19 -20
- nautobot/extras/filters/__init__.py +3 -2
- nautobot/extras/filters/mixins.py +23 -7
- nautobot/extras/forms/__init__.py +2 -1
- nautobot/extras/forms/forms.py +71 -0
- nautobot/extras/forms/mixins.py +4 -2
- nautobot/extras/managers.py +4 -1
- nautobot/extras/migrations/0062_collect_roles_from_related_apps_roles.py +30 -7
- nautobot/extras/migrations/0124_add_joblogentry_index.py +16 -0
- nautobot/extras/migrations/0125_jobresult_date_started.py +18 -0
- nautobot/extras/models/customfields.py +53 -5
- nautobot/extras/models/datasources.py +1 -2
- nautobot/extras/models/jobs.py +13 -3
- nautobot/extras/models/relationships.py +55 -6
- nautobot/extras/plugins/views.py +24 -1
- nautobot/extras/secrets/__init__.py +1 -1
- nautobot/extras/tables.py +9 -0
- nautobot/extras/templates/extras/customfield.html +2 -129
- nautobot/extras/templates/extras/customfield_edit.html +2 -108
- nautobot/extras/templates/extras/customfield_retrieve.html +129 -0
- nautobot/extras/templates/extras/customfield_update.html +108 -0
- nautobot/extras/templates/extras/graphqlquery.html +2 -97
- nautobot/extras/templates/extras/graphqlquery_list.html +1 -0
- nautobot/extras/templates/extras/graphqlquery_retrieve.html +97 -0
- nautobot/extras/templates/extras/inc/jobresult.html +7 -3
- nautobot/extras/templates/extras/jobresult.html +2 -155
- nautobot/extras/templates/extras/jobresult_retrieve.html +155 -0
- nautobot/extras/templates/extras/marketplace.html +5 -6
- nautobot/extras/templates/extras/note.html +2 -53
- nautobot/extras/templates/extras/note_retrieve.html +53 -0
- nautobot/extras/templates/extras/plugins_list.html +5 -6
- nautobot/extras/templates/extras/secretsgroup.html +2 -29
- nautobot/extras/templates/extras/secretsgroup_edit.html +2 -82
- nautobot/extras/templates/extras/secretsgroup_retrieve.html +29 -0
- nautobot/extras/templates/extras/secretsgroup_update.html +82 -0
- nautobot/extras/templatetags/custom_links.py +2 -2
- nautobot/extras/templatetags/job_buttons.py +1 -1
- nautobot/extras/templatetags/plugins.py +1 -1
- nautobot/extras/tests/integration/test_computedfields.py +2 -2
- nautobot/extras/tests/integration/test_customfields.py +14 -11
- nautobot/extras/tests/integration/test_dynamicgroups.py +1 -1
- nautobot/extras/tests/integration/test_notes.py +1 -1
- nautobot/extras/tests/integration/test_plugins.py +6 -6
- nautobot/extras/tests/integration/test_relationships.py +2 -2
- nautobot/extras/tests/test_customfields.py +115 -7
- nautobot/extras/tests/test_filters.py +9 -0
- nautobot/extras/tests/test_forms.py +2 -2
- nautobot/extras/tests/test_plugins.py +2 -3
- nautobot/extras/tests/test_relationships.py +14 -8
- nautobot/extras/tests/test_views.py +285 -2
- nautobot/extras/urls.py +5 -110
- nautobot/extras/utils.py +5 -2
- nautobot/extras/views.py +116 -311
- nautobot/ipam/api/views.py +69 -6
- nautobot/ipam/tables.py +8 -15
- nautobot/ipam/tests/migration/test_migrations.py +8 -8
- nautobot/ipam/tests/test_api.py +352 -2
- nautobot/ipam/tests/test_models.py +1 -1
- nautobot/project-static/docs/404.html +34 -34
- nautobot/project-static/docs/apps/index.html +34 -34
- nautobot/project-static/docs/apps/nautobot-apps.html +34 -34
- nautobot/project-static/docs/assets/_mkdocstrings.css +44 -6
- nautobot/project-static/docs/assets/javascripts/{bundle.56ea9cef.min.js → bundle.50899def.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.56ea9cef.min.js.map → bundle.50899def.min.js.map} +2 -2
- nautobot/project-static/docs/assets/stylesheets/{main.342714a4.min.css → main.7e37652d.min.css} +1 -1
- nautobot/project-static/docs/assets/stylesheets/{main.342714a4.min.css.map → main.7e37652d.min.css.map} +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +39 -34
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +36 -34
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +139 -54
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +48 -38
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +50 -40
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +36 -34
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +35 -34
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +43 -39
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +52 -42
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +50 -41
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +54 -44
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +85 -93
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +154 -62
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +54 -46
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +146 -87
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +240 -70
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +38 -35
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +41 -35
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +173 -52
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +269 -85
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +5987 -2643
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +36 -34
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +165 -89
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +161 -69
- nautobot/project-static/docs/development/apps/api/configuration-view.html +34 -34
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +34 -34
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +34 -34
- nautobot/project-static/docs/development/apps/api/models/global-search.html +34 -34
- nautobot/project-static/docs/development/apps/api/models/graphql.html +34 -34
- nautobot/project-static/docs/development/apps/api/models/index.html +34 -34
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +34 -34
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +34 -34
- nautobot/project-static/docs/development/apps/api/prometheus.html +34 -34
- nautobot/project-static/docs/development/apps/api/setup.html +34 -34
- nautobot/project-static/docs/development/apps/api/testing.html +34 -34
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +34 -34
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +34 -34
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +34 -34
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +34 -34
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/base-template.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/index.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +42 -36
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/notes.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +34 -34
- nautobot/project-static/docs/development/apps/api/views/urls.html +34 -34
- nautobot/project-static/docs/development/apps/index.html +34 -34
- nautobot/project-static/docs/development/apps/migration/code-updates.html +34 -34
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +34 -34
- nautobot/project-static/docs/development/apps/migration/from-v1.html +34 -34
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +34 -34
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +34 -34
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +34 -34
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +34 -34
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +37 -37
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/breadcrumbs-titles.html +10544 -0
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +34 -34
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +34 -34
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +34 -34
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +37 -37
- nautobot/project-static/docs/development/core/application-registry.html +162 -133
- nautobot/project-static/docs/development/core/best-practices.html +34 -34
- nautobot/project-static/docs/development/core/bootstrap-ui.html +34 -34
- nautobot/project-static/docs/development/core/caching.html +34 -34
- nautobot/project-static/docs/development/core/controllers.html +34 -34
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +34 -34
- nautobot/project-static/docs/development/core/generic-views.html +34 -34
- nautobot/project-static/docs/development/core/getting-started.html +34 -34
- nautobot/project-static/docs/development/core/homepage.html +34 -34
- nautobot/project-static/docs/development/core/index.html +34 -34
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +34 -34
- nautobot/project-static/docs/development/core/model-checklist.html +34 -34
- nautobot/project-static/docs/development/core/model-features.html +34 -34
- nautobot/project-static/docs/development/core/natural-keys.html +34 -34
- nautobot/project-static/docs/development/core/navigation-menu.html +34 -34
- nautobot/project-static/docs/development/core/release-checklist.html +34 -34
- nautobot/project-static/docs/development/core/role-internals.html +34 -34
- nautobot/project-static/docs/development/core/settings.html +34 -34
- nautobot/project-static/docs/development/core/style-guide.html +34 -34
- nautobot/project-static/docs/development/core/templates.html +34 -34
- nautobot/project-static/docs/development/core/testing.html +34 -34
- nautobot/project-static/docs/development/core/ui-component-framework.html +724 -289
- nautobot/project-static/docs/development/core/user-preferences.html +34 -34
- nautobot/project-static/docs/development/index.html +34 -34
- nautobot/project-static/docs/development/jobs/getting-started.html +34 -34
- nautobot/project-static/docs/development/jobs/index.html +34 -34
- nautobot/project-static/docs/development/jobs/installation.html +34 -34
- nautobot/project-static/docs/development/jobs/job-extensions.html +34 -34
- nautobot/project-static/docs/development/jobs/job-logging.html +34 -34
- nautobot/project-static/docs/development/jobs/job-patterns.html +34 -34
- nautobot/project-static/docs/development/jobs/job-structure.html +34 -34
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +34 -34
- nautobot/project-static/docs/development/jobs/testing.html +34 -34
- nautobot/project-static/docs/index.html +34 -34
- nautobot/project-static/docs/media/development/core/ui-component-framework/breadcrumbs-titles-data-flow.png +0 -0
- nautobot/project-static/docs/media/power_distribution.png +0 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +34 -34
- nautobot/project-static/docs/overview/design_philosophy.html +34 -34
- nautobot/project-static/docs/release-notes/index.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.0.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.1.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.2.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.3.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.4.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.5.html +34 -34
- nautobot/project-static/docs/release-notes/version-1.6.html +34 -34
- nautobot/project-static/docs/release-notes/version-2.0.html +34 -34
- nautobot/project-static/docs/release-notes/version-2.1.html +34 -34
- nautobot/project-static/docs/release-notes/version-2.2.html +34 -34
- nautobot/project-static/docs/release-notes/version-2.3.html +34 -34
- nautobot/project-static/docs/release-notes/version-2.4.html +402 -34
- nautobot/project-static/docs/requirements.txt +3 -3
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +303 -299
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +34 -34
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +34 -34
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +34 -34
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +34 -34
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +34 -34
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +37 -37
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +34 -34
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/index.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +34 -34
- nautobot/project-static/docs/user-guide/administration/installation/services.html +34 -34
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +34 -34
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +34 -34
- nautobot/project-static/docs/user-guide/administration/security/index.html +34 -34
- nautobot/project-static/docs/user-guide/administration/security/notices.html +34 -34
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +296 -251
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +34 -34
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +37 -37
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +42 -52
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +37 -37
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +316 -39
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +35 -35
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +147 -37
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +52 -35
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +51 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +34 -34
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +34 -34
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +34 -34
- nautobot/project-static/docs/user-guide/index.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +35 -35
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +34 -34
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +34 -34
- nautobot/tenancy/api/views.py +2 -1
- nautobot/users/tests/test_api.py +2 -2
- nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -252
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -75
- nautobot/virtualization/templates/virtualization/virtualmachine_retrieve.html +252 -0
- nautobot/virtualization/templates/virtualization/virtualmachine_update.html +75 -0
- nautobot/virtualization/urls.py +3 -61
- nautobot/virtualization/views.py +48 -72
- {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/METADATA +27 -27
- {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/RECORD +463 -439
- {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/NOTICE +0 -0
- {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/WHEEL +0 -0
- {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/entry_points.txt +0 -0
|
@@ -4,7 +4,7 @@ import logging
|
|
|
4
4
|
from django.conf import settings
|
|
5
5
|
from django.contrib.contenttypes.models import ContentType
|
|
6
6
|
from django.core.exceptions import ValidationError
|
|
7
|
-
from django.db.models import ProtectedError
|
|
7
|
+
from django.db.models import ProtectedError, QuerySet
|
|
8
8
|
from django.forms import ChoiceField, IntegerField, NumberInput
|
|
9
9
|
from django.urls import reverse
|
|
10
10
|
from rest_framework import status
|
|
@@ -400,28 +400,46 @@ class CustomFieldTest(ModelTestCases.BaseModelTestCase, TestCase):
|
|
|
400
400
|
class CustomFieldManagerTest(TestCase):
|
|
401
401
|
def setUp(self):
|
|
402
402
|
self.content_type = ContentType.objects.get_for_model(Location)
|
|
403
|
-
custom_field = CustomField(
|
|
403
|
+
custom_field = CustomField(
|
|
404
|
+
type=CustomFieldTypeChoices.TYPE_TEXT,
|
|
405
|
+
label="Text Field",
|
|
406
|
+
default="foo",
|
|
407
|
+
filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED,
|
|
408
|
+
)
|
|
404
409
|
custom_field.save()
|
|
405
410
|
custom_field.content_types.set([self.content_type])
|
|
406
411
|
|
|
407
412
|
def test_get_for_model(self):
|
|
408
413
|
self.assertEqual(CustomField.objects.get_for_model(Location).count(), 2)
|
|
409
414
|
self.assertEqual(CustomField.objects.get_for_model(VirtualMachine).count(), 0)
|
|
415
|
+
self.assertEqual(len(CustomField.objects.get_for_model(Location, get_queryset=False)), 2)
|
|
416
|
+
self.assertEqual(len(CustomField.objects.get_for_model(VirtualMachine, get_queryset=False)), 0)
|
|
410
417
|
|
|
411
418
|
def test_get_for_model_caching_and_cache_invalidation(self):
|
|
412
419
|
"""Test that the cache is used and is properly invalidated when CustomFields are created or deleted."""
|
|
413
420
|
# Assert that the cache is used when calling get_for_model a second time
|
|
414
421
|
CustomField.objects.get_for_model(Location)
|
|
415
422
|
with self.assertNumQueries(0):
|
|
416
|
-
CustomField.objects.get_for_model(Location)
|
|
423
|
+
qs = CustomField.objects.get_for_model(Location)
|
|
424
|
+
with self.assertNumQueries(0):
|
|
425
|
+
listing = CustomField.objects.get_for_model(Location, get_queryset=False)
|
|
426
|
+
self.assertIsInstance(qs, QuerySet)
|
|
427
|
+
self.assertIsInstance(listing, list)
|
|
428
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
417
429
|
|
|
418
430
|
# Assert that different values of exclude_filter_disabled are cached separately
|
|
419
431
|
with self.assertNumQueries(1):
|
|
420
432
|
CustomField.objects.get_for_model(Location, exclude_filter_disabled=True)
|
|
421
433
|
with self.assertNumQueries(0):
|
|
422
|
-
CustomField.objects.get_for_model(Location, exclude_filter_disabled=True)
|
|
434
|
+
qs = CustomField.objects.get_for_model(Location, exclude_filter_disabled=True)
|
|
435
|
+
with self.assertNumQueries(0):
|
|
436
|
+
listing = CustomField.objects.get_for_model(Location, exclude_filter_disabled=True, get_queryset=False)
|
|
423
437
|
with self.assertNumQueries(0):
|
|
424
438
|
CustomField.objects.get_for_model(Location)
|
|
439
|
+
self.assertIsInstance(qs, QuerySet)
|
|
440
|
+
self.assertIsInstance(listing, list)
|
|
441
|
+
self.assertEqual(1, len(listing))
|
|
442
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
425
443
|
|
|
426
444
|
# Assert that different models are cached separately
|
|
427
445
|
with self.assertNumQueries(1):
|
|
@@ -444,21 +462,111 @@ class CustomFieldManagerTest(TestCase):
|
|
|
444
462
|
with self.assertNumQueries(1):
|
|
445
463
|
CustomField.objects.get_for_model(Location)
|
|
446
464
|
with self.assertNumQueries(0):
|
|
447
|
-
CustomField.objects.get_for_model(Location)
|
|
465
|
+
qs = CustomField.objects.get_for_model(Location)
|
|
466
|
+
with self.assertNumQueries(0):
|
|
467
|
+
listing = CustomField.objects.get_for_model(Location, get_queryset=False)
|
|
468
|
+
self.assertIsInstance(qs, QuerySet)
|
|
469
|
+
self.assertIsInstance(listing, list)
|
|
470
|
+
self.assertEqual(3, len(listing))
|
|
471
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
448
472
|
|
|
449
473
|
# Assert that the cache is invalidated when removing a CustomField.content_types m2m relationship
|
|
450
474
|
custom_field.content_types.set([])
|
|
451
475
|
with self.assertNumQueries(1):
|
|
452
476
|
CustomField.objects.get_for_model(Location)
|
|
453
477
|
with self.assertNumQueries(0):
|
|
454
|
-
CustomField.objects.get_for_model(Location)
|
|
478
|
+
qs = CustomField.objects.get_for_model(Location)
|
|
479
|
+
with self.assertNumQueries(0):
|
|
480
|
+
listing = CustomField.objects.get_for_model(Location, get_queryset=False)
|
|
481
|
+
self.assertIsInstance(qs, QuerySet)
|
|
482
|
+
self.assertIsInstance(listing, list)
|
|
483
|
+
self.assertEqual(2, len(listing))
|
|
484
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
455
485
|
|
|
456
486
|
# Assert that the cache is invalidated on object delete
|
|
457
487
|
custom_field.delete()
|
|
458
488
|
with self.assertNumQueries(1):
|
|
459
489
|
CustomField.objects.get_for_model(Location)
|
|
460
490
|
with self.assertNumQueries(0):
|
|
461
|
-
CustomField.objects.get_for_model(Location)
|
|
491
|
+
qs = CustomField.objects.get_for_model(Location)
|
|
492
|
+
with self.assertNumQueries(0):
|
|
493
|
+
listing = CustomField.objects.get_for_model(Location, get_queryset=False)
|
|
494
|
+
self.assertIsInstance(qs, QuerySet)
|
|
495
|
+
self.assertIsInstance(listing, list)
|
|
496
|
+
self.assertEqual(2, len(listing))
|
|
497
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
class ComputedFieldManagerTestCase(TestCase):
|
|
501
|
+
def setUp(self):
|
|
502
|
+
self.content_type = ContentType.objects.get_for_model(Location)
|
|
503
|
+
ComputedField.objects.create(
|
|
504
|
+
content_type=ContentType.objects.get_for_model(Location),
|
|
505
|
+
key="computed_field_one",
|
|
506
|
+
label="Computed Field One",
|
|
507
|
+
template="{{ obj.name }} is the name of this location.",
|
|
508
|
+
fallback_value="An error occurred while rendering this template.",
|
|
509
|
+
weight=100,
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
def test_get_for_model(self):
|
|
513
|
+
self.assertEqual(ComputedField.objects.get_for_model(Location).count(), 1)
|
|
514
|
+
self.assertEqual(ComputedField.objects.get_for_model(VirtualMachine).count(), 0)
|
|
515
|
+
self.assertEqual(len(ComputedField.objects.get_for_model(Location, get_queryset=False)), 1)
|
|
516
|
+
self.assertEqual(len(ComputedField.objects.get_for_model(VirtualMachine, get_queryset=False)), 0)
|
|
517
|
+
|
|
518
|
+
def test_get_for_model_caching_and_cache_invalidation(self):
|
|
519
|
+
# Assert that the cache is used when calling get_for_model a second time
|
|
520
|
+
ComputedField.objects.get_for_model(Location)
|
|
521
|
+
with self.assertNumQueries(0):
|
|
522
|
+
qs = ComputedField.objects.get_for_model(Location)
|
|
523
|
+
with self.assertNumQueries(0):
|
|
524
|
+
listing = ComputedField.objects.get_for_model(Location, get_queryset=False)
|
|
525
|
+
self.assertIsInstance(qs, QuerySet)
|
|
526
|
+
self.assertIsInstance(listing, list)
|
|
527
|
+
self.assertEqual(1, len(listing))
|
|
528
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
529
|
+
|
|
530
|
+
# Assert that different models are cached separately
|
|
531
|
+
with self.assertNumQueries(1):
|
|
532
|
+
ComputedField.objects.get_for_model(VirtualMachine)
|
|
533
|
+
with self.assertNumQueries(0):
|
|
534
|
+
ComputedField.objects.get_for_model(VirtualMachine)
|
|
535
|
+
with self.assertNumQueries(0):
|
|
536
|
+
ComputedField.objects.get_for_model(Location)
|
|
537
|
+
|
|
538
|
+
# Assert that the cache is invalidated on object save
|
|
539
|
+
computed_field = ComputedField.objects.create(
|
|
540
|
+
content_type=ContentType.objects.get_for_model(Location),
|
|
541
|
+
key="computed_field_two",
|
|
542
|
+
label="Computed Field Two",
|
|
543
|
+
template="{{ obj.name }} is still jthe name of this location.",
|
|
544
|
+
fallback_value="An error occurred while rendering this template.",
|
|
545
|
+
weight=200,
|
|
546
|
+
)
|
|
547
|
+
with self.assertNumQueries(1):
|
|
548
|
+
ComputedField.objects.get_for_model(Location)
|
|
549
|
+
with self.assertNumQueries(0):
|
|
550
|
+
qs = ComputedField.objects.get_for_model(Location)
|
|
551
|
+
with self.assertNumQueries(0):
|
|
552
|
+
listing = ComputedField.objects.get_for_model(Location, get_queryset=False)
|
|
553
|
+
self.assertIsInstance(qs, QuerySet)
|
|
554
|
+
self.assertIsInstance(listing, list)
|
|
555
|
+
self.assertEqual(2, len(listing))
|
|
556
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
557
|
+
|
|
558
|
+
# Assert that the cache is invalided on object delete
|
|
559
|
+
computed_field.delete()
|
|
560
|
+
with self.assertNumQueries(1):
|
|
561
|
+
ComputedField.objects.get_for_model(Location)
|
|
562
|
+
with self.assertNumQueries(0):
|
|
563
|
+
qs = ComputedField.objects.get_for_model(Location)
|
|
564
|
+
with self.assertNumQueries(0):
|
|
565
|
+
listing = ComputedField.objects.get_for_model(Location, get_queryset=False)
|
|
566
|
+
self.assertIsInstance(qs, QuerySet)
|
|
567
|
+
self.assertIsInstance(listing, list)
|
|
568
|
+
self.assertEqual(1, len(listing))
|
|
569
|
+
self.assertQuerysetEqualAndNotEmpty(qs, listing)
|
|
462
570
|
|
|
463
571
|
|
|
464
572
|
class CustomFieldDataAPITest(APITestCase):
|
|
@@ -171,6 +171,8 @@ class ComputedFieldTestCase(FilterTestCases.FilterTestCase):
|
|
|
171
171
|
def test_content_type(self):
|
|
172
172
|
params = {"content_type": "dcim.location"}
|
|
173
173
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3)
|
|
174
|
+
params = {"content_type__n": "dcim.location"}
|
|
175
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
|
174
176
|
|
|
175
177
|
|
|
176
178
|
class ConfigContextTestCase(FilterTestCases.FilterTestCase):
|
|
@@ -650,6 +652,8 @@ class ExportTemplateTestCase(FilterTestCases.FilterTestCase):
|
|
|
650
652
|
def test_content_type(self):
|
|
651
653
|
params = {"content_type": ContentType.objects.get(model="location").pk}
|
|
652
654
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
|
655
|
+
params = {"content_type__n": ContentType.objects.get(model="location").pk}
|
|
656
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
653
657
|
|
|
654
658
|
|
|
655
659
|
class FileProxyTestCase(FilterTestCases.FilterTestCase):
|
|
@@ -865,6 +869,8 @@ class ImageAttachmentTestCase(FilterTestCases.FilterTestCase):
|
|
|
865
869
|
def test_content_type(self):
|
|
866
870
|
params = {"content_type": "dcim.location"}
|
|
867
871
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
872
|
+
params = {"content_type__n": "dcim.location"}
|
|
873
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
868
874
|
|
|
869
875
|
def test_content_type_id_and_object_id(self):
|
|
870
876
|
params = {
|
|
@@ -981,6 +987,7 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
|
|
|
981
987
|
filterset = JobResultFilterSet
|
|
982
988
|
generic_filter_tests = (
|
|
983
989
|
("date_created",),
|
|
990
|
+
("date_started",),
|
|
984
991
|
("date_done",),
|
|
985
992
|
("job_model", "job_model__id"),
|
|
986
993
|
("job_model", "job_model__name"),
|
|
@@ -1091,6 +1098,8 @@ class JobHookFilterSetTestCase(FilterTestCases.FilterTestCase):
|
|
|
1091
1098
|
def test_content_types(self):
|
|
1092
1099
|
params = {"content_types": ["dcim.devicetype"]}
|
|
1093
1100
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
1101
|
+
params = {"content_types__n": ["dcim.devicetype"]}
|
|
1102
|
+
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
|
1094
1103
|
|
|
1095
1104
|
def test_enabled(self):
|
|
1096
1105
|
params = {"enabled": True}
|
|
@@ -1101,9 +1101,9 @@ class DeprecatedAliasesTestCase(TestCase):
|
|
|
1101
1101
|
|
|
1102
1102
|
def test_deprecated_form_mixin_classes(self):
|
|
1103
1103
|
# Importing these mixin classes doesn't directly warn, but subclassing them does.
|
|
1104
|
-
from nautobot.extras.forms import
|
|
1104
|
+
from nautobot.extras.forms import CustomFieldBulkCreateForm
|
|
1105
|
+
from nautobot.extras.forms.mixins import (
|
|
1105
1106
|
AddRemoveTagsForm,
|
|
1106
|
-
CustomFieldBulkCreateForm,
|
|
1107
1107
|
CustomFieldBulkEditForm,
|
|
1108
1108
|
CustomFieldModelForm,
|
|
1109
1109
|
RelationshipModelForm,
|
|
@@ -888,11 +888,10 @@ class TestAppCoreViewOverrides(TestCase):
|
|
|
888
888
|
self.assertEqual("Hello world! I'm an overridden view.", response.content.decode(response.charset))
|
|
889
889
|
|
|
890
890
|
response = self.client.get(
|
|
891
|
-
f
|
|
891
|
+
f"{reverse('plugins:plugin_detail', kwargs={'plugin': 'example_app_with_view_override'})}"
|
|
892
892
|
)
|
|
893
893
|
self.assertIn(
|
|
894
|
-
"plugins:example_app:view_to_be_overridden <code>"
|
|
895
|
-
"example_app_with_view_override.views.ViewOverride</code>",
|
|
894
|
+
"plugins:example_app:view_to_be_overridden <code>example_app_with_view_override.views.ViewOverride</code>",
|
|
896
895
|
extract_page_body(response.content.decode(response.charset)),
|
|
897
896
|
)
|
|
898
897
|
|
|
@@ -482,10 +482,12 @@ class RelationshipTest(RelationshipBaseTest, ModelTestCases.BaseModelTestCase):
|
|
|
482
482
|
# Assert that the cache is used when calling method a second time
|
|
483
483
|
with self.assertNumQueries(0):
|
|
484
484
|
manager_method(Location)
|
|
485
|
+
with self.assertNumQueries(0):
|
|
486
|
+
manager_method(Location, get_queryset=False)
|
|
485
487
|
|
|
486
488
|
# Assert that different models are cached separately
|
|
487
489
|
with self.assertNumQueries(expected_queries):
|
|
488
|
-
manager_method(Rack)
|
|
490
|
+
manager_method(Rack, get_queryset=False)
|
|
489
491
|
with self.assertNumQueries(0):
|
|
490
492
|
manager_method(Rack)
|
|
491
493
|
with self.assertNumQueries(0):
|
|
@@ -507,6 +509,8 @@ class RelationshipTest(RelationshipBaseTest, ModelTestCases.BaseModelTestCase):
|
|
|
507
509
|
manager_method(Location)
|
|
508
510
|
with self.assertNumQueries(0):
|
|
509
511
|
manager_method(Location)
|
|
512
|
+
with self.assertNumQueries(0):
|
|
513
|
+
manager_method(Location, get_queryset=False)
|
|
510
514
|
finally:
|
|
511
515
|
# Assert that the cache is invalidated on object delete
|
|
512
516
|
relationship.delete()
|
|
@@ -514,6 +518,8 @@ class RelationshipTest(RelationshipBaseTest, ModelTestCases.BaseModelTestCase):
|
|
|
514
518
|
manager_method(Location)
|
|
515
519
|
with self.assertNumQueries(0):
|
|
516
520
|
manager_method(Location)
|
|
521
|
+
with self.assertNumQueries(0):
|
|
522
|
+
manager_method(Location, get_queryset=False)
|
|
517
523
|
|
|
518
524
|
def test_required_related_object_errors(self):
|
|
519
525
|
"""
|
|
@@ -1664,7 +1670,7 @@ class RequiredRelationshipTestMixin:
|
|
|
1664
1670
|
response = self.send_data(
|
|
1665
1671
|
from_model,
|
|
1666
1672
|
{
|
|
1667
|
-
"name": f
|
|
1673
|
+
"name": f"{params['create_data']['name']} edited",
|
|
1668
1674
|
"relationships": {},
|
|
1669
1675
|
},
|
|
1670
1676
|
interact_with,
|
|
@@ -1682,13 +1688,13 @@ class RequiredRelationshipTestMixin:
|
|
|
1682
1688
|
# Object is updated with the required relationship data (succeeds)
|
|
1683
1689
|
response = self.send_data(
|
|
1684
1690
|
from_model,
|
|
1685
|
-
{"name": f
|
|
1691
|
+
{"name": f"{params['create_data']['name']} edited", **related_objects_data},
|
|
1686
1692
|
interact_with,
|
|
1687
1693
|
action="edit",
|
|
1688
1694
|
url_kwargs={"pk": newly_created_object.pk},
|
|
1689
1695
|
)
|
|
1690
1696
|
self.assertHttpStatus(response, 200)
|
|
1691
|
-
self.assertEqual(f
|
|
1697
|
+
self.assertEqual(f"{params['create_data']['name']} edited", response.json()["name"])
|
|
1692
1698
|
|
|
1693
1699
|
"""
|
|
1694
1700
|
- Object is created with the required relationship data (succeeds)
|
|
@@ -1698,7 +1704,7 @@ class RequiredRelationshipTestMixin:
|
|
|
1698
1704
|
"""
|
|
1699
1705
|
|
|
1700
1706
|
# Delete the object that was previously created, so we can test with the same data again
|
|
1701
|
-
from_model.objects.get(name=f
|
|
1707
|
+
from_model.objects.get(name=f"{params['create_data']['name']} edited").delete()
|
|
1702
1708
|
self.assertEqual(from_model.objects.count(), existing_count)
|
|
1703
1709
|
|
|
1704
1710
|
# Object is created with the required relationship data (succeeds)
|
|
@@ -1712,19 +1718,19 @@ class RequiredRelationshipTestMixin:
|
|
|
1712
1718
|
newly_created_object = from_model.objects.get(name=params["create_data"]["name"])
|
|
1713
1719
|
response = self.send_data(
|
|
1714
1720
|
from_model,
|
|
1715
|
-
{"name": f
|
|
1721
|
+
{"name": f"{params['create_data']['name']} changed"},
|
|
1716
1722
|
interact_with,
|
|
1717
1723
|
action="edit",
|
|
1718
1724
|
url_kwargs={"pk": newly_created_object.pk},
|
|
1719
1725
|
)
|
|
1720
1726
|
self.assertHttpStatus(response, 200)
|
|
1721
|
-
self.assertEqual(f
|
|
1727
|
+
self.assertEqual(f"{params['create_data']['name']} changed", response.json()["name"])
|
|
1722
1728
|
|
|
1723
1729
|
# Object is updated to remove the relationship data (fails)
|
|
1724
1730
|
response = self.send_data(
|
|
1725
1731
|
from_model,
|
|
1726
1732
|
{
|
|
1727
|
-
"name": f
|
|
1733
|
+
"name": f"{params['create_data']['name']} changed again",
|
|
1728
1734
|
"relationships": {},
|
|
1729
1735
|
},
|
|
1730
1736
|
interact_with,
|