nautobot 2.1.7__py3-none-any.whl → 2.1.9__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/api.py +1 -2
- nautobot/apps/utils.py +4 -0
- nautobot/apps/views.py +2 -0
- nautobot/circuits/api/urls.py +1 -2
- nautobot/circuits/api/views.py +0 -12
- nautobot/circuits/tests/integration/test_relationships.py +0 -4
- nautobot/core/api/routers.py +25 -3
- nautobot/core/api/utils.py +4 -0
- nautobot/core/api/views.py +21 -15
- nautobot/core/celery/schedulers.py +13 -0
- nautobot/core/choices.py +0 -21
- nautobot/core/models/__init__.py +1 -1
- nautobot/core/models/tree_queries.py +29 -7
- nautobot/core/releases.py +1 -1
- nautobot/core/settings.py +9 -0
- nautobot/core/settings_funcs.py +0 -18
- nautobot/core/signals.py +5 -5
- nautobot/core/tasks.py +7 -3
- nautobot/core/templates/admin/base.html +23 -94
- nautobot/core/templates/generic/object_list.html +2 -0
- nautobot/core/templates/graphene/graphiql.html +18 -47
- nautobot/core/templates/inc/footer.html +5 -5
- nautobot/core/templates/inc/nav_menu.html +0 -7
- nautobot/core/templates/nautobot_config.py.j2 +6 -0
- nautobot/core/templates/rest_framework/api.html +12 -5
- nautobot/core/testing/mixins.py +13 -5
- nautobot/core/tests/integration/test_plugin_navbar.py +7 -21
- nautobot/core/tests/integration/test_view_authentication.py +67 -0
- nautobot/core/tests/runner.py +25 -2
- nautobot/core/tests/test_graphql.py +2 -14
- nautobot/core/tests/test_models.py +3 -3
- nautobot/core/tests/test_navigations.py +67 -10
- nautobot/core/tests/test_releases.py +9 -3
- nautobot/core/tests/test_views.py +23 -16
- nautobot/core/utils/lookup.py +124 -0
- nautobot/core/views/__init__.py +3 -7
- nautobot/core/views/generic.py +9 -0
- nautobot/dcim/api/urls.py +1 -2
- nautobot/dcim/api/views.py +1 -12
- nautobot/dcim/choices.py +56 -0
- nautobot/dcim/models/racks.py +1 -3
- nautobot/dcim/navigation.py +1 -1
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +67 -43
- nautobot/dcim/tests/test_api.py +3 -0
- nautobot/dcim/tests/test_filters.py +0 -28
- nautobot/dcim/views.py +5 -2
- nautobot/extras/api/urls.py +1 -2
- nautobot/extras/api/views.py +0 -10
- nautobot/extras/choices.py +14 -0
- nautobot/extras/models/customfields.py +93 -34
- nautobot/extras/models/groups.py +1 -1
- nautobot/extras/models/relationships.py +32 -19
- nautobot/extras/navigation.py +3 -2
- nautobot/extras/plugins/__init__.py +8 -0
- nautobot/extras/plugins/views.py +6 -9
- nautobot/extras/querysets.py +1 -1
- nautobot/extras/signals.py +12 -6
- nautobot/extras/templates/extras/customfield.html +22 -14
- nautobot/extras/templatetags/job_buttons.py +7 -0
- nautobot/extras/templatetags/plugins.py +5 -1
- nautobot/extras/tests/test_customfields.py +323 -287
- nautobot/extras/tests/test_dynamicgroups.py +1 -1
- nautobot/extras/tests/test_jobs.py +2 -2
- nautobot/extras/tests/test_plugins.py +41 -0
- nautobot/extras/tests/test_relationships.py +31 -14
- nautobot/extras/tests/test_views.py +124 -1
- nautobot/extras/utils.py +7 -3
- nautobot/extras/views.py +10 -10
- nautobot/ipam/api/urls.py +1 -2
- nautobot/ipam/api/views.py +6 -13
- nautobot/ipam/tables.py +0 -1
- nautobot/ipam/tests/test_graphql.py +2 -3
- nautobot/ipam/views.py +12 -10
- nautobot/project-static/css/base.css +1 -0
- nautobot/project-static/docs/404.html +30 -2
- nautobot/project-static/docs/apps/index.html +30 -2
- nautobot/project-static/docs/apps/nautobot-apps.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +410 -410
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +386 -358
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +759 -602
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +528 -467
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +205 -109
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +30 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1265 -785
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1827 -1746
- nautobot/project-static/docs/development/apps/api/configuration-view.html +30 -2
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +30 -2
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +30 -2
- nautobot/project-static/docs/development/apps/api/models/global-search.html +30 -2
- nautobot/project-static/docs/development/apps/api/models/graphql.html +30 -2
- nautobot/project-static/docs/development/apps/api/models/index.html +30 -2
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +31 -3
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +30 -2
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +30 -2
- nautobot/project-static/docs/development/apps/api/prometheus.html +30 -2
- nautobot/project-static/docs/development/apps/api/setup.html +30 -2
- nautobot/project-static/docs/development/apps/api/testing.html +33 -5
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +30 -2
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +30 -2
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +30 -2
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +33 -5
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +13 -5559
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +5594 -0
- nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +3 -3
- nautobot/project-static/docs/development/apps/api/views/base-template.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +44 -11
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +47 -14
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/index.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/notes.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +30 -2
- nautobot/project-static/docs/development/apps/api/views/urls.html +30 -2
- nautobot/project-static/docs/development/apps/index.html +30 -2
- nautobot/project-static/docs/development/apps/migration/code-updates.html +30 -2
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +30 -2
- nautobot/project-static/docs/development/apps/migration/from-v1.html +30 -2
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +30 -2
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +30 -2
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +30 -2
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +30 -2
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +30 -2
- nautobot/project-static/docs/development/core/application-registry.html +30 -2
- nautobot/project-static/docs/development/core/best-practices.html +33 -5
- nautobot/project-static/docs/development/core/bootstrap-ui.html +30 -2
- nautobot/project-static/docs/development/core/caching.html +5481 -0
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +30 -2
- nautobot/project-static/docs/development/core/extending-models.html +33 -5
- nautobot/project-static/docs/development/core/generic-views.html +30 -2
- nautobot/project-static/docs/development/core/getting-started.html +49 -12
- nautobot/project-static/docs/development/core/homepage.html +30 -2
- nautobot/project-static/docs/development/core/index.html +30 -2
- nautobot/project-static/docs/development/core/model-features.html +30 -2
- nautobot/project-static/docs/development/core/natural-keys.html +30 -2
- nautobot/project-static/docs/development/core/navigation-menu.html +30 -2
- nautobot/project-static/docs/development/core/release-checklist.html +30 -2
- nautobot/project-static/docs/development/core/role-internals.html +30 -2
- nautobot/project-static/docs/development/core/style-guide.html +30 -2
- nautobot/project-static/docs/development/core/templates.html +30 -2
- nautobot/project-static/docs/development/core/testing.html +30 -2
- nautobot/project-static/docs/development/core/user-preferences.html +30 -2
- nautobot/project-static/docs/development/index.html +30 -2
- nautobot/project-static/docs/development/jobs/index.html +30 -2
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +30 -2
- nautobot/project-static/docs/index.html +30 -2
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/release-notes/index.html +30 -2
- nautobot/project-static/docs/release-notes/version-1.0.html +30 -2
- nautobot/project-static/docs/release-notes/version-1.1.html +30 -2
- nautobot/project-static/docs/release-notes/version-1.2.html +30 -2
- nautobot/project-static/docs/release-notes/version-1.3.html +30 -2
- nautobot/project-static/docs/release-notes/version-1.4.html +31 -3
- nautobot/project-static/docs/release-notes/version-1.5.html +30 -2
- nautobot/project-static/docs/release-notes/version-1.6.html +573 -134
- nautobot/project-static/docs/release-notes/version-2.0.html +30 -2
- nautobot/project-static/docs/release-notes/version-2.1.html +539 -170
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +250 -240
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +30 -2
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +30 -2
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +30 -2
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +30 -2
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +49 -2
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +30 -2
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +30 -2
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +37 -5
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +6019 -0
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/index.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +30 -2
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +33 -5
- nautobot/project-static/docs/user-guide/administration/installation/services.html +30 -2
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +30 -2
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +30 -2
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +30 -2
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +30 -2
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +30 -2
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +33 -5
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +30 -2
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +30 -2
- nautobot/project-static/docs/user-guide/index.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +111 -15
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +30 -2
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +30 -2
- nautobot/tenancy/api/urls.py +1 -2
- nautobot/tenancy/api/views.py +0 -12
- nautobot/tenancy/navigation.py +1 -1
- nautobot/tenancy/tests/test_filters.py +0 -168
- nautobot/users/api/urls.py +1 -2
- nautobot/users/api/views.py +2 -65
- nautobot/users/views.py +8 -8
- nautobot/virtualization/api/urls.py +1 -2
- nautobot/virtualization/api/views.py +0 -12
- nautobot/virtualization/tests/test_filters.py +0 -28
- {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/METADATA +2 -2
- {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/RECORD +338 -334
- {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/NOTICE +0 -0
- {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/WHEEL +0 -0
- {nautobot-2.1.7.dist-info → nautobot-2.1.9.dist-info}/entry_points.txt +0 -0
|
@@ -550,6 +550,20 @@
|
|
|
550
550
|
|
|
551
551
|
|
|
552
552
|
|
|
553
|
+
<li class="md-nav__item">
|
|
554
|
+
<a href="../../../user-guide/administration/installation/health-checks.html" class="md-nav__link">
|
|
555
|
+
Health Checks
|
|
556
|
+
</a>
|
|
557
|
+
</li>
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
|
|
553
567
|
<li class="md-nav__item">
|
|
554
568
|
<a href="../../../user-guide/administration/installation/selinux-troubleshooting.html" class="md-nav__link">
|
|
555
569
|
SELinux Troubleshooting
|
|
@@ -3888,8 +3902,8 @@
|
|
|
3888
3902
|
|
|
3889
3903
|
|
|
3890
3904
|
<li class="md-nav__item">
|
|
3891
|
-
<a href="../../../development/apps/api/ui-extensions/object-
|
|
3892
|
-
Object Detail
|
|
3905
|
+
<a href="../../../development/apps/api/ui-extensions/object-views.html" class="md-nav__link">
|
|
3906
|
+
Object Detail & List Views
|
|
3893
3907
|
</a>
|
|
3894
3908
|
</li>
|
|
3895
3909
|
|
|
@@ -5775,6 +5789,20 @@
|
|
|
5775
5789
|
|
|
5776
5790
|
|
|
5777
5791
|
|
|
5792
|
+
<li class="md-nav__item">
|
|
5793
|
+
<a href="../../../development/core/caching.html" class="md-nav__link">
|
|
5794
|
+
Caching
|
|
5795
|
+
</a>
|
|
5796
|
+
</li>
|
|
5797
|
+
|
|
5798
|
+
|
|
5799
|
+
|
|
5800
|
+
|
|
5801
|
+
|
|
5802
|
+
|
|
5803
|
+
|
|
5804
|
+
|
|
5805
|
+
|
|
5778
5806
|
<li class="md-nav__item">
|
|
5779
5807
|
<a href="../../../development/core/extending-models.html" class="md-nav__link">
|
|
5780
5808
|
Extending Models
|
|
@@ -17414,8 +17442,7 @@ This expects a field named <code>devices</code> on the model and a filter named
|
|
|
17414
17442
|
|
|
17415
17443
|
<details class="quote">
|
|
17416
17444
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
17417
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
17418
|
-
<span class="normal"><a href="#__codelineno-0-42"> 42</a></span>
|
|
17445
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-42"> 42</a></span>
|
|
17419
17446
|
<span class="normal"><a href="#__codelineno-0-43"> 43</a></span>
|
|
17420
17447
|
<span class="normal"><a href="#__codelineno-0-44"> 44</a></span>
|
|
17421
17448
|
<span class="normal"><a href="#__codelineno-0-45"> 45</a></span>
|
|
@@ -17617,210 +17644,225 @@ This expects a field named <code>devices</code> on the model and a filter named
|
|
|
17617
17644
|
<span class="normal"><a href="#__codelineno-0-241">241</a></span>
|
|
17618
17645
|
<span class="normal"><a href="#__codelineno-0-242">242</a></span>
|
|
17619
17646
|
<span class="normal"><a href="#__codelineno-0-243">243</a></span>
|
|
17620
|
-
<span class="normal"><a href="#__codelineno-0-244">244</a></span
|
|
17621
|
-
<
|
|
17622
|
-
<
|
|
17623
|
-
<
|
|
17624
|
-
<
|
|
17625
|
-
<
|
|
17626
|
-
<
|
|
17627
|
-
<
|
|
17628
|
-
<a id="__codelineno-0-
|
|
17629
|
-
<a id="__codelineno-0-
|
|
17630
|
-
<a id="__codelineno-0-
|
|
17631
|
-
<a id="__codelineno-0-
|
|
17632
|
-
<a id="__codelineno-0-
|
|
17633
|
-
<a id="__codelineno-0-
|
|
17634
|
-
<a id="__codelineno-0-
|
|
17635
|
-
<a id="__codelineno-0-
|
|
17636
|
-
<a id="__codelineno-0-
|
|
17637
|
-
<a id="__codelineno-0-
|
|
17638
|
-
<a id="__codelineno-0-
|
|
17639
|
-
<a id="__codelineno-0-
|
|
17640
|
-
<a id="__codelineno-0-
|
|
17641
|
-
<a id="__codelineno-0-
|
|
17642
|
-
<a id="__codelineno-0-
|
|
17643
|
-
<a id="__codelineno-0-
|
|
17644
|
-
<a id="__codelineno-0-
|
|
17645
|
-
<a id="__codelineno-0-
|
|
17646
|
-
<a id="__codelineno-0-
|
|
17647
|
-
<a id="__codelineno-0-
|
|
17648
|
-
<a id="__codelineno-0-
|
|
17649
|
-
<a id="__codelineno-0-
|
|
17650
|
-
<a id="__codelineno-0-
|
|
17651
|
-
<a id="__codelineno-0-
|
|
17652
|
-
<a id="__codelineno-0-
|
|
17653
|
-
<a id="__codelineno-0-
|
|
17654
|
-
<a id="__codelineno-0-
|
|
17647
|
+
<span class="normal"><a href="#__codelineno-0-244">244</a></span>
|
|
17648
|
+
<span class="normal"><a href="#__codelineno-0-245">245</a></span>
|
|
17649
|
+
<span class="normal"><a href="#__codelineno-0-246">246</a></span>
|
|
17650
|
+
<span class="normal"><a href="#__codelineno-0-247">247</a></span>
|
|
17651
|
+
<span class="normal"><a href="#__codelineno-0-248">248</a></span>
|
|
17652
|
+
<span class="normal"><a href="#__codelineno-0-249">249</a></span>
|
|
17653
|
+
<span class="normal"><a href="#__codelineno-0-250">250</a></span>
|
|
17654
|
+
<span class="normal"><a href="#__codelineno-0-251">251</a></span>
|
|
17655
|
+
<span class="normal"><a href="#__codelineno-0-252">252</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-42" name="__codelineno-0-42"></a><span class="k">class</span> <span class="nc">NautobotTestCaseMixin</span><span class="p">:</span>
|
|
17656
|
+
<a id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="w"> </span><span class="sd">"""Base class for all Nautobot-specific unit tests."""</span>
|
|
17657
|
+
<a id="__codelineno-0-44" name="__codelineno-0-44"></a>
|
|
17658
|
+
<a id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">user_permissions</span> <span class="o">=</span> <span class="p">()</span>
|
|
17659
|
+
<a id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="n">client_class</span> <span class="o">=</span> <span class="n">NautobotTestClient</span>
|
|
17660
|
+
<a id="__codelineno-0-47" name="__codelineno-0-47"></a>
|
|
17661
|
+
<a id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="k">def</span> <span class="nf">setUpNautobot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">populate_status</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
17662
|
+
<a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="w"> </span><span class="sd">"""Setup shared testuser, statuses and client."""</span>
|
|
17663
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="c1"># Re-populate status choices after database truncation by TransactionTestCase</span>
|
|
17664
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="k">if</span> <span class="n">populate_status</span><span class="p">:</span>
|
|
17665
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="n">management</span><span class="o">.</span><span class="n">populate_status_choices</span><span class="p">(</span><span class="n">apps</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
17666
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a>
|
|
17667
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="c1"># Create the test user and assign permissions</span>
|
|
17668
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_user</span><span class="p">(</span><span class="n">username</span><span class="o">=</span><span class="s2">"nautobotuser"</span><span class="p">)</span>
|
|
17669
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="bp">self</span><span class="o">.</span><span class="n">add_permissions</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">user_permissions</span><span class="p">)</span>
|
|
17670
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
17671
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">if</span> <span class="n">client</span><span class="p">:</span>
|
|
17672
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="c1"># Initialize the test client</span>
|
|
17673
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></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">"client"</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
17674
|
+
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client_class</span><span class="p">()</span>
|
|
17675
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
17676
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="c1"># Force login explicitly with the first-available backend</span>
|
|
17677
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">force_login</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
|
|
17678
|
+
<a id="__codelineno-0-65" name="__codelineno-0-65"></a>
|
|
17679
|
+
<a id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
17680
|
+
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17681
|
+
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> Clear cache after each test case.</span>
|
|
17682
|
+
<a id="__codelineno-0-69" name="__codelineno-0-69"></a>
|
|
17683
|
+
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> In theory this shouldn't be necessary as our cache **should** appropriately update and clear itself when</span>
|
|
17684
|
+
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> data changes occur, but in practice we've seen issues here. Best guess at present is that it's due to</span>
|
|
17685
|
+
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> `TransactionTestCase` truncating the database, which presumably doesn't trigger the relevant Django signals</span>
|
|
17686
|
+
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> that would otherwise refresh the cache appropriately.</span>
|
|
17687
|
+
<a id="__codelineno-0-74" name="__codelineno-0-74"></a>
|
|
17688
|
+
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> See also: https://code.djangoproject.com/ticket/11505</span>
|
|
17655
17689
|
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="sd"> """</span>
|
|
17656
|
-
<a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="
|
|
17657
|
-
<a id="__codelineno-0-78" name="__codelineno-0-78"></a>
|
|
17658
|
-
<a id="__codelineno-0-79" name="__codelineno-0-79"></a>
|
|
17659
|
-
<a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="
|
|
17660
|
-
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="
|
|
17661
|
-
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd">
|
|
17662
|
-
<a id="__codelineno-0-83" name="__codelineno-0-83"></a
|
|
17663
|
-
<a id="__codelineno-0-84" name="__codelineno-0-84"></a
|
|
17664
|
-
<a id="__codelineno-0-85" name="__codelineno-0-85"></a>
|
|
17665
|
-
<a id="__codelineno-0-86" name="__codelineno-0-86"></a>
|
|
17666
|
-
<a id="__codelineno-0-87" name="__codelineno-0-87"></a>
|
|
17667
|
-
<a id="__codelineno-0-88" name="__codelineno-0-88"></a
|
|
17668
|
-
<a id="__codelineno-0-89" name="__codelineno-0-89"></a
|
|
17669
|
-
<a id="__codelineno-0-90" name="__codelineno-0-90"></a>
|
|
17670
|
-
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="
|
|
17671
|
-
<a id="__codelineno-0-92" name="__codelineno-0-92"></a>
|
|
17672
|
-
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
17673
|
-
<a id="__codelineno-0-94" name="__codelineno-0-94"></a>
|
|
17674
|
-
<a id="__codelineno-0-95" name="__codelineno-0-95"></a>
|
|
17675
|
-
<a id="__codelineno-0-96" name="__codelineno-0-96"></a>
|
|
17676
|
-
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">
|
|
17690
|
+
<a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tearDown</span><span class="p">()</span>
|
|
17691
|
+
<a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="n">cache</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
17692
|
+
<a id="__codelineno-0-79" name="__codelineno-0-79"></a>
|
|
17693
|
+
<a id="__codelineno-0-80" name="__codelineno-0-80"></a> <span class="k">def</span> <span class="nf">prepare_instance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span>
|
|
17694
|
+
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17695
|
+
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd"> Test cases can override this method to perform any necessary manipulation of an instance prior to its evaluation</span>
|
|
17696
|
+
<a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="sd"> against test data. For example, it can be used to decrypt a Secret's plaintext attribute.</span>
|
|
17697
|
+
<a id="__codelineno-0-84" name="__codelineno-0-84"></a><span class="sd"> """</span>
|
|
17698
|
+
<a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="k">return</span> <span class="n">instance</span>
|
|
17699
|
+
<a id="__codelineno-0-86" name="__codelineno-0-86"></a>
|
|
17700
|
+
<a id="__codelineno-0-87" name="__codelineno-0-87"></a> <span class="k">def</span> <span class="nf">model_to_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">fields</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
17701
|
+
<a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17702
|
+
<a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="sd"> Return a dictionary representation of an instance.</span>
|
|
17703
|
+
<a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> """</span>
|
|
17704
|
+
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="c1"># Prepare the instance and call Django's model_to_dict() to extract all fields</span>
|
|
17705
|
+
<a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="n">model_dict</span> <span class="o">=</span> <span class="n">model_to_dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prepare_instance</span><span class="p">(</span><span class="n">instance</span><span class="p">),</span> <span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">)</span>
|
|
17706
|
+
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
17707
|
+
<a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="c1"># Map any additional (non-field) instance attributes that were specified</span>
|
|
17708
|
+
<a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
|
|
17709
|
+
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span> <span class="ow">and</span> <span class="n">attr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">model_dict</span><span class="p">:</span>
|
|
17710
|
+
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
17677
17711
|
<a id="__codelineno-0-98" name="__codelineno-0-98"></a>
|
|
17678
|
-
<a id="__codelineno-0-99" name="__codelineno-0-99"></a>
|
|
17679
|
-
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">
|
|
17680
|
-
<a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="
|
|
17681
|
-
<a id="__codelineno-0-102" name="__codelineno-0-102"></a>
|
|
17682
|
-
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
17683
|
-
<a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="c1">#
|
|
17684
|
-
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="
|
|
17685
|
-
<a id="__codelineno-0-106" name="__codelineno-0-106"></a>
|
|
17686
|
-
<a id="__codelineno-0-107" name="__codelineno-0-107"></a>
|
|
17687
|
-
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="n">
|
|
17688
|
-
<a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="c1">#
|
|
17689
|
-
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">if</span> <span class="
|
|
17690
|
-
<a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">
|
|
17691
|
-
<a id="__codelineno-0-112" name="__codelineno-0-112"></a>
|
|
17692
|
-
<a id="__codelineno-0-113" name="__codelineno-0-113"></a>
|
|
17693
|
-
<a id="__codelineno-0-114" name="__codelineno-0-114"></a>
|
|
17694
|
-
<a id="__codelineno-0-115" name="__codelineno-0-115"></a>
|
|
17695
|
-
<a id="__codelineno-0-116" name="__codelineno-0-116"></a>
|
|
17696
|
-
<a id="__codelineno-0-117" name="__codelineno-0-117"></a>
|
|
17697
|
-
<a id="__codelineno-0-118" name="__codelineno-0-118"></a>
|
|
17698
|
-
<a id="__codelineno-0-119" name="__codelineno-0-119"></a>
|
|
17699
|
-
<a id="__codelineno-0-120" name="__codelineno-0-120"></a>
|
|
17700
|
-
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
17701
|
-
<a id="__codelineno-0-122" name="__codelineno-0-122"></a>
|
|
17702
|
-
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="
|
|
17703
|
-
<a id="__codelineno-0-124" name="__codelineno-0-124"></a>
|
|
17704
|
-
<a id="__codelineno-0-125" name="__codelineno-0-125"></a>
|
|
17705
|
-
<a id="__codelineno-0-126" name="__codelineno-0-126"></a>
|
|
17706
|
-
<a id="__codelineno-0-127" name="__codelineno-0-127"></a>
|
|
17707
|
-
<a id="__codelineno-0-128" name="__codelineno-0-128"></a>
|
|
17708
|
-
<a id="__codelineno-0-129" name="__codelineno-0-129"></a>
|
|
17709
|
-
<a id="__codelineno-0-130" name="__codelineno-0-130"></a>
|
|
17710
|
-
<a id="__codelineno-0-131" name="__codelineno-0-131"></a>
|
|
17711
|
-
<a id="__codelineno-0-132" name="__codelineno-0-132"></a>
|
|
17712
|
-
<a id="__codelineno-0-133" name="__codelineno-0-133"></a>
|
|
17713
|
-
<a id="__codelineno-0-134" name="__codelineno-0-134"></a
|
|
17714
|
-
<a id="__codelineno-0-135" name="__codelineno-0-135"></a
|
|
17715
|
-
<a id="__codelineno-0-136" name="__codelineno-0-136"></a
|
|
17716
|
-
<a id="__codelineno-0-137" name="__codelineno-0-137"></a>
|
|
17717
|
-
<a id="__codelineno-0-138" name="__codelineno-0-138"></a>
|
|
17718
|
-
<a id="__codelineno-0-139" name="__codelineno-0-139"></a>
|
|
17719
|
-
<a id="__codelineno-0-140" name="__codelineno-0-140"></a>
|
|
17720
|
-
<a id="__codelineno-0-141" name="__codelineno-0-141"></a>
|
|
17721
|
-
<a id="__codelineno-0-142" name="__codelineno-0-142"></a
|
|
17722
|
-
<a id="__codelineno-0-143" name="__codelineno-0-143"></a>
|
|
17723
|
-
<a id="__codelineno-0-144" name="__codelineno-0-144"></a
|
|
17724
|
-
<a id="__codelineno-0-145" name="__codelineno-0-145"></a>
|
|
17725
|
-
<a id="__codelineno-0-146" name="__codelineno-0-146"></a>
|
|
17726
|
-
<a id="__codelineno-0-147" name="__codelineno-0-147"></a>
|
|
17727
|
-
<a id="__codelineno-0-148" name="__codelineno-0-148"></a>
|
|
17728
|
-
<a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="
|
|
17729
|
-
<a id="__codelineno-0-150" name="__codelineno-0-150"></a
|
|
17730
|
-
<a id="__codelineno-0-151" name="__codelineno-0-151"></a
|
|
17731
|
-
<a id="__codelineno-0-152" name="__codelineno-0-152"></a>
|
|
17732
|
-
<a id="__codelineno-0-153" name="__codelineno-0-153"></a>
|
|
17733
|
-
<a id="__codelineno-0-154" name="__codelineno-0-154"></a>
|
|
17734
|
-
<a id="__codelineno-0-155" name="__codelineno-0-155"></a>
|
|
17735
|
-
<a id="__codelineno-0-156" name="__codelineno-0-156"></a>
|
|
17736
|
-
<a id="__codelineno-0-157" name="__codelineno-0-157"></a
|
|
17737
|
-
<a id="__codelineno-0-158" name="__codelineno-0-158"></a
|
|
17738
|
-
<a id="__codelineno-0-159" name="__codelineno-0-159"></a
|
|
17739
|
-
<a id="__codelineno-0-160" name="__codelineno-0-160"></a>
|
|
17740
|
-
<a id="__codelineno-0-161" name="__codelineno-0-161"></a>
|
|
17741
|
-
<a id="__codelineno-0-162" name="__codelineno-0-162"></a>
|
|
17742
|
-
<a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">
|
|
17743
|
-
<a id="__codelineno-0-164" name="__codelineno-0-164"></a>
|
|
17744
|
-
<a id="__codelineno-0-165" name="__codelineno-0-165"></a>
|
|
17745
|
-
<a id="__codelineno-0-166" name="__codelineno-0-166"></a>
|
|
17746
|
-
<a id="__codelineno-0-167" name="__codelineno-0-167"></a>
|
|
17747
|
-
<a id="__codelineno-0-168" name="__codelineno-0-168"></a>
|
|
17748
|
-
<a id="__codelineno-0-169" name="__codelineno-0-169"></a
|
|
17749
|
-
<a id="__codelineno-0-170" name="__codelineno-0-170"></a
|
|
17750
|
-
<a id="__codelineno-0-171" name="__codelineno-0-171"></a><span class="
|
|
17751
|
-
<a id="__codelineno-0-172" name="__codelineno-0-172"></a>
|
|
17752
|
-
<a id="__codelineno-0-173" name="__codelineno-0-173"></a><span class="
|
|
17753
|
-
<a id="__codelineno-0-174" name="__codelineno-0-174"></a><span class="
|
|
17754
|
-
<a id="__codelineno-0-175" name="__codelineno-0-175"></a
|
|
17755
|
-
<a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="
|
|
17756
|
-
<a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="
|
|
17757
|
-
<a id="__codelineno-0-178" name="__codelineno-0-178"></a
|
|
17758
|
-
<a id="__codelineno-0-179" name="__codelineno-0-179"></a
|
|
17712
|
+
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">model_dict</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
17713
|
+
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">try</span><span class="p">:</span>
|
|
17714
|
+
<a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="n">field</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
17715
|
+
<a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
|
|
17716
|
+
<a id="__codelineno-0-103" name="__codelineno-0-103"></a> <span class="c1"># Attribute is not a model field, but may be a computed field,</span>
|
|
17717
|
+
<a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="c1"># so allow `field` checks to pass through.</span>
|
|
17718
|
+
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="n">field</span> <span class="o">=</span> <span class="kc">None</span>
|
|
17719
|
+
<a id="__codelineno-0-106" name="__codelineno-0-106"></a>
|
|
17720
|
+
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="c1"># Handle ManyToManyFields</span>
|
|
17721
|
+
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="n">core_fields</span><span class="o">.</span><span class="n">TagsField</span><span class="p">)):</span>
|
|
17722
|
+
<a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="c1"># Only convert ContentType to <app_label>.<model> for API serializers/views</span>
|
|
17723
|
+
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">if</span> <span class="n">api</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">related_model</span> <span class="ow">is</span> <span class="n">ContentType</span><span class="p">:</span>
|
|
17724
|
+
<a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">ct</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="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
|
|
17725
|
+
<a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="c1"># Otherwise always convert object instances to pk</span>
|
|
17726
|
+
<a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="k">else</span><span class="p">:</span>
|
|
17727
|
+
<a id="__codelineno-0-114" name="__codelineno-0-114"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">obj</span><span class="o">.</span><span class="n">pk</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
|
|
17728
|
+
<a id="__codelineno-0-115" name="__codelineno-0-115"></a>
|
|
17729
|
+
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="k">if</span> <span class="n">api</span><span class="p">:</span>
|
|
17730
|
+
<a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="c1"># Replace ContentType primary keys with <app_label>.<model></span>
|
|
17731
|
+
<a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">key</span><span class="p">),</span> <span class="n">ContentType</span><span class="p">):</span>
|
|
17732
|
+
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">ct</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
|
|
17733
|
+
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">ct</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="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">"</span>
|
|
17734
|
+
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
17735
|
+
<a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="c1"># Convert IPNetwork instances to strings</span>
|
|
17736
|
+
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">IPNetwork</span><span class="p">):</span>
|
|
17737
|
+
<a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
17738
|
+
<a id="__codelineno-0-125" name="__codelineno-0-125"></a>
|
|
17739
|
+
<a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="k">else</span><span class="p">:</span>
|
|
17740
|
+
<a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="c1"># Convert ArrayFields to CSV strings</span>
|
|
17741
|
+
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">core_fields</span><span class="o">.</span><span class="n">JSONArrayField</span><span class="p">):</span>
|
|
17742
|
+
<a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
|
|
17743
|
+
<a id="__codelineno-0-130" name="__codelineno-0-130"></a>
|
|
17744
|
+
<a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="c1"># Convert JSONField dict values to JSON strings</span>
|
|
17745
|
+
<a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">JSONField</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
|
|
17746
|
+
<a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
17747
|
+
<a id="__codelineno-0-134" name="__codelineno-0-134"></a>
|
|
17748
|
+
<a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="k">return</span> <span class="n">model_dict</span>
|
|
17749
|
+
<a id="__codelineno-0-136" name="__codelineno-0-136"></a>
|
|
17750
|
+
<a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="c1">#</span>
|
|
17751
|
+
<a id="__codelineno-0-138" name="__codelineno-0-138"></a> <span class="c1"># Permissions management</span>
|
|
17752
|
+
<a id="__codelineno-0-139" name="__codelineno-0-139"></a> <span class="c1">#</span>
|
|
17753
|
+
<a id="__codelineno-0-140" name="__codelineno-0-140"></a>
|
|
17754
|
+
<a id="__codelineno-0-141" name="__codelineno-0-141"></a> <span class="k">def</span> <span class="nf">add_permissions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">names</span><span class="p">):</span>
|
|
17755
|
+
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17756
|
+
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> Assign a set of permissions to the test user. Accepts permission names in the form <app>.<action>_<model>.</span>
|
|
17757
|
+
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> """</span>
|
|
17758
|
+
<a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
|
|
17759
|
+
<a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="n">ct</span><span class="p">,</span> <span class="n">action</span> <span class="o">=</span> <span class="n">permissions</span><span class="o">.</span><span class="n">resolve_permission_ct</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
|
|
17760
|
+
<a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="n">obj_perm</span> <span class="o">=</span> <span class="n">users_models</span><span class="o">.</span><span class="n">ObjectPermission</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">actions</span><span class="o">=</span><span class="p">[</span><span class="n">action</span><span class="p">])</span>
|
|
17761
|
+
<a id="__codelineno-0-148" name="__codelineno-0-148"></a> <span class="n">obj_perm</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
|
17762
|
+
<a id="__codelineno-0-149" name="__codelineno-0-149"></a> <span class="n">obj_perm</span><span class="o">.</span><span class="n">users</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
|
|
17763
|
+
<a id="__codelineno-0-150" name="__codelineno-0-150"></a> <span class="n">obj_perm</span><span class="o">.</span><span class="n">object_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ct</span><span class="p">)</span>
|
|
17764
|
+
<a id="__codelineno-0-151" name="__codelineno-0-151"></a>
|
|
17765
|
+
<a id="__codelineno-0-152" name="__codelineno-0-152"></a> <span class="c1">#</span>
|
|
17766
|
+
<a id="__codelineno-0-153" name="__codelineno-0-153"></a> <span class="c1"># Custom assertions</span>
|
|
17767
|
+
<a id="__codelineno-0-154" name="__codelineno-0-154"></a> <span class="c1">#</span>
|
|
17768
|
+
<a id="__codelineno-0-155" name="__codelineno-0-155"></a>
|
|
17769
|
+
<a id="__codelineno-0-156" name="__codelineno-0-156"></a> <span class="k">def</span> <span class="nf">assertHttpStatus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="n">expected_status</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
17770
|
+
<a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17771
|
+
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> TestCase method. Provide more detail in the event of an unexpected HTTP response.</span>
|
|
17772
|
+
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> """</span>
|
|
17773
|
+
<a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="n">err_message</span> <span class="o">=</span> <span class="kc">None</span>
|
|
17774
|
+
<a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="c1"># Construct an error message only if we know the test is going to fail</span>
|
|
17775
|
+
<a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected_status</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
|
|
17776
|
+
<a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">expected_status</span> <span class="o">=</span> <span class="p">[</span><span class="n">expected_status</span><span class="p">]</span>
|
|
17777
|
+
<a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">expected_status</span><span class="p">:</span>
|
|
17778
|
+
<a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="n">err_message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Expected HTTP status(es) </span><span class="si">{</span><span class="n">expected_status</span><span class="si">}</span><span class="s2">; received </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">:"</span>
|
|
17779
|
+
<a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="s2">"data"</span><span class="p">):</span>
|
|
17780
|
+
<a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="c1"># REST API response; pass the response data through directly</span>
|
|
17781
|
+
<a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="n">err_message</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">data</span><span class="si">}</span><span class="s2">"</span>
|
|
17782
|
+
<a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="c1"># Attempt to extract form validation errors from the response HTML</span>
|
|
17783
|
+
<a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">form_errors</span> <span class="o">=</span> <span class="n">testing</span><span class="o">.</span><span class="n">extract_form_failures</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">charset</span><span class="p">))</span>
|
|
17784
|
+
<a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">err_message</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">form_errors</span> <span class="ow">or</span> <span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">charset</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">"No data"</span><span class="p">)</span>
|
|
17785
|
+
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
|
|
17786
|
+
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">err_message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">msg</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">err_message</span><span class="si">}</span><span class="s2">"</span>
|
|
17787
|
+
<a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertIn</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">expected_status</span><span class="p">,</span> <span class="n">err_message</span><span class="p">)</span>
|
|
17788
|
+
<a id="__codelineno-0-175" name="__codelineno-0-175"></a>
|
|
17789
|
+
<a id="__codelineno-0-176" name="__codelineno-0-176"></a> <span class="k">def</span> <span class="nf">assertInstanceEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
17790
|
+
<a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17791
|
+
<a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="sd"> Compare a model instance to a dictionary, checking that its attribute values match those specified</span>
|
|
17792
|
+
<a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="sd"> in the dictionary.</span>
|
|
17759
17793
|
<a id="__codelineno-0-180" name="__codelineno-0-180"></a>
|
|
17760
|
-
<a id="__codelineno-0-181" name="__codelineno-0-181"></a
|
|
17761
|
-
<a id="__codelineno-0-182" name="__codelineno-0-182"></a
|
|
17762
|
-
<a id="__codelineno-0-183" name="__codelineno-0-183"></a>
|
|
17763
|
-
<a id="__codelineno-0-184" name="__codelineno-0-184"></a
|
|
17764
|
-
<a id="__codelineno-0-185" name="__codelineno-0-185"></a
|
|
17765
|
-
<a id="__codelineno-0-186" name="__codelineno-0-186"></a>
|
|
17766
|
-
<a id="__codelineno-0-187" name="__codelineno-0-187"></a>
|
|
17767
|
-
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
17768
|
-
<a id="__codelineno-0-189" name="__codelineno-0-189"></a>
|
|
17769
|
-
<a id="__codelineno-0-190" name="__codelineno-0-190"></a>
|
|
17770
|
-
<a id="__codelineno-0-191" name="__codelineno-0-191"></a>
|
|
17771
|
-
<a id="__codelineno-0-192" name="__codelineno-0-192"></a>
|
|
17772
|
-
<a id="__codelineno-0-193" name="__codelineno-0-193"></a>
|
|
17773
|
-
<a id="__codelineno-0-194" name="__codelineno-0-194"></a>
|
|
17774
|
-
<a id="__codelineno-0-195" name="__codelineno-0-195"></a>
|
|
17775
|
-
<a id="__codelineno-0-196" name="__codelineno-0-196"></a>
|
|
17776
|
-
<a id="__codelineno-0-197" name="__codelineno-0-197"></a>
|
|
17777
|
-
<a id="__codelineno-0-198" name="__codelineno-0-198"></a>
|
|
17778
|
-
<a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="
|
|
17779
|
-
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
|
|
17780
|
-
<a id="__codelineno-0-201" name="__codelineno-0-201"></a>
|
|
17781
|
-
<a id="__codelineno-0-202" name="__codelineno-0-202"></a>
|
|
17782
|
-
<a id="__codelineno-0-203" name="__codelineno-0-203"></a>
|
|
17783
|
-
<a id="__codelineno-0-204" name="__codelineno-0-204"></a>
|
|
17784
|
-
<a id="__codelineno-0-205" name="__codelineno-0-205"></a>
|
|
17785
|
-
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
17786
|
-
<a id="__codelineno-0-207" name="__codelineno-0-207"></a>
|
|
17787
|
-
<a id="__codelineno-0-208" name="__codelineno-0-208"></a>
|
|
17788
|
-
<a id="__codelineno-0-209" name="__codelineno-0-209"></a>
|
|
17789
|
-
<a id="__codelineno-0-210" name="__codelineno-0-210"></a>
|
|
17790
|
-
<a id="__codelineno-0-211" name="__codelineno-0-211"></a
|
|
17791
|
-
<a id="__codelineno-0-212" name="__codelineno-0-212"></a>
|
|
17792
|
-
<a id="__codelineno-0-213" name="__codelineno-0-213"></a>
|
|
17793
|
-
<a id="__codelineno-0-214" name="__codelineno-0-214"></a>
|
|
17794
|
+
<a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> :param instance: Python object instance</span>
|
|
17795
|
+
<a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> :param data: Dictionary of test data used to define the instance</span>
|
|
17796
|
+
<a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="sd"> :param exclude: List of fields to exclude from comparison (e.g. passwords, which get hashed)</span>
|
|
17797
|
+
<a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> :param api: Set to True is the data is a JSON representation of the instance</span>
|
|
17798
|
+
<a id="__codelineno-0-185" name="__codelineno-0-185"></a><span class="sd"> """</span>
|
|
17799
|
+
<a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
17800
|
+
<a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">exclude</span> <span class="o">=</span> <span class="p">[]</span>
|
|
17801
|
+
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
17802
|
+
<a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">]</span>
|
|
17803
|
+
<a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="n">model_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model_to_dict</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="n">api</span><span class="p">)</span>
|
|
17804
|
+
<a id="__codelineno-0-191" name="__codelineno-0-191"></a>
|
|
17805
|
+
<a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="n">new_model_dict</span> <span class="o">=</span> <span class="p">{}</span>
|
|
17806
|
+
<a id="__codelineno-0-193" name="__codelineno-0-193"></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">model_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
17807
|
+
<a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
|
17808
|
+
<a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="c1"># Sort lists of values. This includes items like tags, or other M2M fields</span>
|
|
17809
|
+
<a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="n">new_model_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
17810
|
+
<a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">elif</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">"data_schema"</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
17811
|
+
<a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="c1"># Standardize the data_schema JSON, since the column is JSON and MySQL/dolt do not guarantee order</span>
|
|
17812
|
+
<a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="n">new_model_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">standardize_json</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
17813
|
+
<a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="k">else</span><span class="p">:</span>
|
|
17814
|
+
<a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">new_model_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
|
17815
|
+
<a id="__codelineno-0-202" name="__codelineno-0-202"></a>
|
|
17816
|
+
<a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># Omit any dictionary keys which are not instance attributes or have been excluded</span>
|
|
17817
|
+
<a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">relevant_data</span> <span class="o">=</span> <span class="p">{}</span>
|
|
17818
|
+
<a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
17819
|
+
<a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">and</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
|
|
17820
|
+
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
|
17821
|
+
<a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="c1"># Sort lists of values. This includes items like tags, or other M2M fields</span>
|
|
17822
|
+
<a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="n">relevant_data</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
17823
|
+
<a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">elif</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">"data_schema"</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
17824
|
+
<a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="c1"># Standardize the data_schema JSON, since the column is JSON and MySQL/dolt do not guarantee order</span>
|
|
17825
|
+
<a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="n">relevant_data</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">standardize_json</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
17826
|
+
<a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="k">else</span><span class="p">:</span>
|
|
17827
|
+
<a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="n">relevant_data</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
|
17794
17828
|
<a id="__codelineno-0-215" name="__codelineno-0-215"></a>
|
|
17795
|
-
<a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="
|
|
17829
|
+
<a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">new_model_dict</span><span class="p">,</span> <span class="n">relevant_data</span><span class="p">)</span>
|
|
17796
17830
|
<a id="__codelineno-0-217" name="__codelineno-0-217"></a>
|
|
17797
|
-
<a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="
|
|
17798
|
-
<a id="__codelineno-0-219" name="__codelineno-0-219"></a>
|
|
17799
|
-
<a id="__codelineno-0-220" name="__codelineno-0-220"></a>
|
|
17800
|
-
<a id="__codelineno-0-221" name="__codelineno-0-221"></a>
|
|
17801
|
-
<a id="__codelineno-0-222" name="__codelineno-0-222"></a>
|
|
17802
|
-
<a id="__codelineno-0-223" name="__codelineno-0-223"></a
|
|
17803
|
-
<a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="
|
|
17804
|
-
<a id="__codelineno-0-225" name="__codelineno-0-225"></a>
|
|
17805
|
-
<a id="__codelineno-0-226" name="__codelineno-0-226"></a>
|
|
17806
|
-
<a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="
|
|
17807
|
-
<a id="__codelineno-0-228" name="__codelineno-0-228"></a>
|
|
17808
|
-
<a id="__codelineno-0-229" name="__codelineno-0-229"></a>
|
|
17809
|
-
<a id="__codelineno-0-230" name="__codelineno-0-230"></a>
|
|
17810
|
-
<a id="__codelineno-0-231" name="__codelineno-0-231"></a
|
|
17811
|
-
<a id="__codelineno-0-232" name="__codelineno-0-232"></a>
|
|
17812
|
-
<a id="__codelineno-0-233" name="__codelineno-0-233"></a><span class="
|
|
17813
|
-
<a id="__codelineno-0-234" name="__codelineno-0-234"></a
|
|
17814
|
-
<a id="__codelineno-0-235" name="__codelineno-0-235"></a>
|
|
17815
|
-
<a id="__codelineno-0-236" name="__codelineno-0-236"></a><span class="
|
|
17816
|
-
<a id="__codelineno-0-237" name="__codelineno-0-237"></a><span class="
|
|
17817
|
-
<a id="__codelineno-0-238" name="__codelineno-0-238"></a>
|
|
17818
|
-
<a id="__codelineno-0-239" name="__codelineno-0-239"></a>
|
|
17819
|
-
<a id="__codelineno-0-240" name="__codelineno-0-240"></a>
|
|
17820
|
-
<a id="__codelineno-0-241" name="__codelineno-0-241"></a
|
|
17821
|
-
<a id="__codelineno-0-242" name="__codelineno-0-242"></a
|
|
17822
|
-
<a id="__codelineno-0-243" name="__codelineno-0-243"></a>
|
|
17823
|
-
<a id="__codelineno-0-244" name="__codelineno-0-244"></a
|
|
17831
|
+
<a id="__codelineno-0-218" name="__codelineno-0-218"></a> <span class="k">def</span> <span class="nf">assertQuerysetEqualAndNotEmpty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">qs</span><span class="p">,</span> <span class="n">values</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>
|
|
17832
|
+
<a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="w"> </span><span class="sd">"""Wrapper for assertQuerysetEqual with additional logic to assert input queryset and values are not empty"""</span>
|
|
17833
|
+
<a id="__codelineno-0-220" name="__codelineno-0-220"></a>
|
|
17834
|
+
<a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertNotEqual</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">qs</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"Queryset cannot be empty"</span><span class="p">)</span>
|
|
17835
|
+
<a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertNotEqual</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">values</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"Values cannot be empty"</span><span class="p">)</span>
|
|
17836
|
+
<a id="__codelineno-0-223" name="__codelineno-0-223"></a>
|
|
17837
|
+
<a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertQuerysetEqual</span><span class="p">(</span><span class="n">qs</span><span class="p">,</span> <span class="n">values</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>
|
|
17838
|
+
<a id="__codelineno-0-225" name="__codelineno-0-225"></a>
|
|
17839
|
+
<a id="__codelineno-0-226" name="__codelineno-0-226"></a> <span class="c1">#</span>
|
|
17840
|
+
<a id="__codelineno-0-227" name="__codelineno-0-227"></a> <span class="c1"># Convenience methods</span>
|
|
17841
|
+
<a id="__codelineno-0-228" name="__codelineno-0-228"></a> <span class="c1">#</span>
|
|
17842
|
+
<a id="__codelineno-0-229" name="__codelineno-0-229"></a>
|
|
17843
|
+
<a id="__codelineno-0-230" name="__codelineno-0-230"></a> <span class="k">def</span> <span class="nf">absolute_api_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
17844
|
+
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="w"> </span><span class="sd">"""Get the absolute API URL ("http://nautobot.example.com/api/...") for a given object."""</span>
|
|
17845
|
+
<a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="n">request</span> <span class="o">=</span> <span class="n">APIRequestFactory</span><span class="p">(</span><span class="n">SERVER_NAME</span><span class="o">=</span><span class="s2">"nautobot.example.com"</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
|
|
17846
|
+
<a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="k">return</span> <span class="n">request</span><span class="o">.</span><span class="n">build_absolute_uri</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">(</span><span class="n">api</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
17847
|
+
<a id="__codelineno-0-234" name="__codelineno-0-234"></a>
|
|
17848
|
+
<a id="__codelineno-0-235" name="__codelineno-0-235"></a> <span class="k">def</span> <span class="nf">standardize_json</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
|
|
17849
|
+
<a id="__codelineno-0-236" name="__codelineno-0-236"></a> <span class="n">obj</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
|
|
17850
|
+
<a id="__codelineno-0-237" name="__codelineno-0-237"></a> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
17851
|
+
<a id="__codelineno-0-238" name="__codelineno-0-238"></a>
|
|
17852
|
+
<a id="__codelineno-0-239" name="__codelineno-0-239"></a> <span class="nd">@classmethod</span>
|
|
17853
|
+
<a id="__codelineno-0-240" name="__codelineno-0-240"></a> <span class="k">def</span> <span class="nf">create_tags</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">names</span><span class="p">):</span>
|
|
17854
|
+
<a id="__codelineno-0-241" name="__codelineno-0-241"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17855
|
+
<a id="__codelineno-0-242" name="__codelineno-0-242"></a><span class="sd"> Create and return a Tag instance for each name given.</span>
|
|
17856
|
+
<a id="__codelineno-0-243" name="__codelineno-0-243"></a>
|
|
17857
|
+
<a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> DEPRECATED: use TagFactory instead.</span>
|
|
17858
|
+
<a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="sd"> """</span>
|
|
17859
|
+
<a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
17860
|
+
<a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="s2">"create_tags() is deprecated and will be removed in a future Nautobot release. "</span>
|
|
17861
|
+
<a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="s2">"Use nautobot.extras.factory.TagFactory (provided in Nautobot 1.5 and later) instead."</span><span class="p">,</span>
|
|
17862
|
+
<a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="ne">DeprecationWarning</span><span class="p">,</span>
|
|
17863
|
+
<a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
|
|
17864
|
+
<a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="p">)</span>
|
|
17865
|
+
<a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">return</span> <span class="p">[</span><span class="n">extras_models</span><span class="o">.</span><span class="n">Tag</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">]</span>
|
|
17824
17866
|
</code></pre></div></td></tr></table></div>
|
|
17825
17867
|
</details>
|
|
17826
17868
|
|
|
@@ -17853,13 +17895,13 @@ This expects a field named <code>devices</code> on the model and a filter named
|
|
|
17853
17895
|
|
|
17854
17896
|
<details class="quote">
|
|
17855
17897
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
17856
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
17857
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17858
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17859
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17860
|
-
<a id="__codelineno-0-
|
|
17861
|
-
<a id="__codelineno-0-
|
|
17862
|
-
<a id="__codelineno-0-
|
|
17898
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-230">230</a></span>
|
|
17899
|
+
<span class="normal"><a href="#__codelineno-0-231">231</a></span>
|
|
17900
|
+
<span class="normal"><a href="#__codelineno-0-232">232</a></span>
|
|
17901
|
+
<span class="normal"><a href="#__codelineno-0-233">233</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-230" name="__codelineno-0-230"></a><span class="k">def</span> <span class="nf">absolute_api_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
|
|
17902
|
+
<a id="__codelineno-0-231" name="__codelineno-0-231"></a><span class="w"> </span><span class="sd">"""Get the absolute API URL ("http://nautobot.example.com/api/...") for a given object."""</span>
|
|
17903
|
+
<a id="__codelineno-0-232" name="__codelineno-0-232"></a> <span class="n">request</span> <span class="o">=</span> <span class="n">APIRequestFactory</span><span class="p">(</span><span class="n">SERVER_NAME</span><span class="o">=</span><span class="s2">"nautobot.example.com"</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
|
|
17904
|
+
<a id="__codelineno-0-233" name="__codelineno-0-233"></a> <span class="k">return</span> <span class="n">request</span><span class="o">.</span><span class="n">build_absolute_uri</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">get_absolute_url</span><span class="p">(</span><span class="n">api</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
|
|
17863
17905
|
</code></pre></div></td></tr></table></div>
|
|
17864
17906
|
</details>
|
|
17865
17907
|
</div>
|
|
@@ -17883,25 +17925,25 @@ This expects a field named <code>devices</code> on the model and a filter named
|
|
|
17883
17925
|
|
|
17884
17926
|
<details class="quote">
|
|
17885
17927
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
17886
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
17887
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17888
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17889
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17890
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17891
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17892
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17893
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17894
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17895
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
17896
|
-
<a id="__codelineno-0-
|
|
17897
|
-
<a id="__codelineno-0-
|
|
17898
|
-
<a id="__codelineno-0-
|
|
17899
|
-
<a id="__codelineno-0-
|
|
17900
|
-
<a id="__codelineno-0-
|
|
17901
|
-
<a id="__codelineno-0-
|
|
17902
|
-
<a id="__codelineno-0-
|
|
17903
|
-
<a id="__codelineno-0-
|
|
17904
|
-
<a id="__codelineno-0-
|
|
17928
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-141">141</a></span>
|
|
17929
|
+
<span class="normal"><a href="#__codelineno-0-142">142</a></span>
|
|
17930
|
+
<span class="normal"><a href="#__codelineno-0-143">143</a></span>
|
|
17931
|
+
<span class="normal"><a href="#__codelineno-0-144">144</a></span>
|
|
17932
|
+
<span class="normal"><a href="#__codelineno-0-145">145</a></span>
|
|
17933
|
+
<span class="normal"><a href="#__codelineno-0-146">146</a></span>
|
|
17934
|
+
<span class="normal"><a href="#__codelineno-0-147">147</a></span>
|
|
17935
|
+
<span class="normal"><a href="#__codelineno-0-148">148</a></span>
|
|
17936
|
+
<span class="normal"><a href="#__codelineno-0-149">149</a></span>
|
|
17937
|
+
<span class="normal"><a href="#__codelineno-0-150">150</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="k">def</span> <span class="nf">add_permissions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">names</span><span class="p">):</span>
|
|
17938
|
+
<a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17939
|
+
<a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> Assign a set of permissions to the test user. Accepts permission names in the form <app>.<action>_<model>.</span>
|
|
17940
|
+
<a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> """</span>
|
|
17941
|
+
<a id="__codelineno-0-145" name="__codelineno-0-145"></a> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
|
|
17942
|
+
<a id="__codelineno-0-146" name="__codelineno-0-146"></a> <span class="n">ct</span><span class="p">,</span> <span class="n">action</span> <span class="o">=</span> <span class="n">permissions</span><span class="o">.</span><span class="n">resolve_permission_ct</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
|
|
17943
|
+
<a id="__codelineno-0-147" name="__codelineno-0-147"></a> <span class="n">obj_perm</span> <span class="o">=</span> <span class="n">users_models</span><span class="o">.</span><span class="n">ObjectPermission</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">actions</span><span class="o">=</span><span class="p">[</span><span class="n">action</span><span class="p">])</span>
|
|
17944
|
+
<a id="__codelineno-0-148" name="__codelineno-0-148"></a> <span class="n">obj_perm</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
|
|
17945
|
+
<a id="__codelineno-0-149" name="__codelineno-0-149"></a> <span class="n">obj_perm</span><span class="o">.</span><span class="n">users</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
|
|
17946
|
+
<a id="__codelineno-0-150" name="__codelineno-0-150"></a> <span class="n">obj_perm</span><span class="o">.</span><span class="n">object_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ct</span><span class="p">)</span>
|
|
17905
17947
|
</code></pre></div></td></tr></table></div>
|
|
17906
17948
|
</details>
|
|
17907
17949
|
</div>
|
|
@@ -17925,15 +17967,7 @@ This expects a field named <code>devices</code> on the model and a filter named
|
|
|
17925
17967
|
|
|
17926
17968
|
<details class="quote">
|
|
17927
17969
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
17928
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
17929
|
-
<span class="normal"><a href="#__codelineno-0-149">149</a></span>
|
|
17930
|
-
<span class="normal"><a href="#__codelineno-0-150">150</a></span>
|
|
17931
|
-
<span class="normal"><a href="#__codelineno-0-151">151</a></span>
|
|
17932
|
-
<span class="normal"><a href="#__codelineno-0-152">152</a></span>
|
|
17933
|
-
<span class="normal"><a href="#__codelineno-0-153">153</a></span>
|
|
17934
|
-
<span class="normal"><a href="#__codelineno-0-154">154</a></span>
|
|
17935
|
-
<span class="normal"><a href="#__codelineno-0-155">155</a></span>
|
|
17936
|
-
<span class="normal"><a href="#__codelineno-0-156">156</a></span>
|
|
17970
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-156">156</a></span>
|
|
17937
17971
|
<span class="normal"><a href="#__codelineno-0-157">157</a></span>
|
|
17938
17972
|
<span class="normal"><a href="#__codelineno-0-158">158</a></span>
|
|
17939
17973
|
<span class="normal"><a href="#__codelineno-0-159">159</a></span>
|
|
@@ -17943,25 +17977,33 @@ This expects a field named <code>devices</code> on the model and a filter named
|
|
|
17943
17977
|
<span class="normal"><a href="#__codelineno-0-163">163</a></span>
|
|
17944
17978
|
<span class="normal"><a href="#__codelineno-0-164">164</a></span>
|
|
17945
17979
|
<span class="normal"><a href="#__codelineno-0-165">165</a></span>
|
|
17946
|
-
<span class="normal"><a href="#__codelineno-0-166">166</a></span
|
|
17947
|
-
<
|
|
17948
|
-
<
|
|
17949
|
-
<
|
|
17950
|
-
<
|
|
17951
|
-
<
|
|
17952
|
-
<
|
|
17953
|
-
<
|
|
17954
|
-
<a id="__codelineno-0-156" name="__codelineno-0-156"></a
|
|
17955
|
-
<a id="__codelineno-0-157" name="__codelineno-0-157"></a
|
|
17956
|
-
<a id="__codelineno-0-158" name="__codelineno-0-158"></a
|
|
17957
|
-
<a id="__codelineno-0-159" name="__codelineno-0-159"></a
|
|
17958
|
-
<a id="__codelineno-0-160" name="__codelineno-0-160"></a>
|
|
17959
|
-
<a id="__codelineno-0-161" name="__codelineno-0-161"></a>
|
|
17960
|
-
<a id="__codelineno-0-162" name="__codelineno-0-162"></a>
|
|
17961
|
-
<a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">
|
|
17962
|
-
<a id="__codelineno-0-164" name="__codelineno-0-164"></a>
|
|
17963
|
-
<a id="__codelineno-0-165" name="__codelineno-0-165"></a>
|
|
17964
|
-
<a id="__codelineno-0-166" name="__codelineno-0-166"></a>
|
|
17980
|
+
<span class="normal"><a href="#__codelineno-0-166">166</a></span>
|
|
17981
|
+
<span class="normal"><a href="#__codelineno-0-167">167</a></span>
|
|
17982
|
+
<span class="normal"><a href="#__codelineno-0-168">168</a></span>
|
|
17983
|
+
<span class="normal"><a href="#__codelineno-0-169">169</a></span>
|
|
17984
|
+
<span class="normal"><a href="#__codelineno-0-170">170</a></span>
|
|
17985
|
+
<span class="normal"><a href="#__codelineno-0-171">171</a></span>
|
|
17986
|
+
<span class="normal"><a href="#__codelineno-0-172">172</a></span>
|
|
17987
|
+
<span class="normal"><a href="#__codelineno-0-173">173</a></span>
|
|
17988
|
+
<span class="normal"><a href="#__codelineno-0-174">174</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-156" name="__codelineno-0-156"></a><span class="k">def</span> <span class="nf">assertHttpStatus</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="n">expected_status</span><span class="p">,</span> <span class="n">msg</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
17989
|
+
<a id="__codelineno-0-157" name="__codelineno-0-157"></a><span class="w"> </span><span class="sd">"""</span>
|
|
17990
|
+
<a id="__codelineno-0-158" name="__codelineno-0-158"></a><span class="sd"> TestCase method. Provide more detail in the event of an unexpected HTTP response.</span>
|
|
17991
|
+
<a id="__codelineno-0-159" name="__codelineno-0-159"></a><span class="sd"> """</span>
|
|
17992
|
+
<a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="n">err_message</span> <span class="o">=</span> <span class="kc">None</span>
|
|
17993
|
+
<a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="c1"># Construct an error message only if we know the test is going to fail</span>
|
|
17994
|
+
<a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expected_status</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
|
|
17995
|
+
<a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">expected_status</span> <span class="o">=</span> <span class="p">[</span><span class="n">expected_status</span><span class="p">]</span>
|
|
17996
|
+
<a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">expected_status</span><span class="p">:</span>
|
|
17997
|
+
<a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="n">err_message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"Expected HTTP status(es) </span><span class="si">{</span><span class="n">expected_status</span><span class="si">}</span><span class="s2">; received </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">:"</span>
|
|
17998
|
+
<a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="s2">"data"</span><span class="p">):</span>
|
|
17999
|
+
<a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="c1"># REST API response; pass the response data through directly</span>
|
|
18000
|
+
<a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="n">err_message</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">data</span><span class="si">}</span><span class="s2">"</span>
|
|
18001
|
+
<a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="c1"># Attempt to extract form validation errors from the response HTML</span>
|
|
18002
|
+
<a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="n">form_errors</span> <span class="o">=</span> <span class="n">testing</span><span class="o">.</span><span class="n">extract_form_failures</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">charset</span><span class="p">))</span>
|
|
18003
|
+
<a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">err_message</span> <span class="o">+=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">form_errors</span> <span class="ow">or</span> <span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">charset</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">"No data"</span><span class="p">)</span>
|
|
18004
|
+
<a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
|
|
18005
|
+
<a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="n">err_message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">msg</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">err_message</span><span class="si">}</span><span class="s2">"</span>
|
|
18006
|
+
<a id="__codelineno-0-174" name="__codelineno-0-174"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertIn</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">expected_status</span><span class="p">,</span> <span class="n">err_message</span><span class="p">)</span>
|
|
17965
18007
|
</code></pre></div></td></tr></table></div>
|
|
17966
18008
|
</details>
|
|
17967
18009
|
</div>
|
|
@@ -17990,15 +18032,7 @@ in the dictionary.</p>
|
|
|
17990
18032
|
|
|
17991
18033
|
<details class="quote">
|
|
17992
18034
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
17993
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
17994
|
-
<span class="normal"><a href="#__codelineno-0-169">169</a></span>
|
|
17995
|
-
<span class="normal"><a href="#__codelineno-0-170">170</a></span>
|
|
17996
|
-
<span class="normal"><a href="#__codelineno-0-171">171</a></span>
|
|
17997
|
-
<span class="normal"><a href="#__codelineno-0-172">172</a></span>
|
|
17998
|
-
<span class="normal"><a href="#__codelineno-0-173">173</a></span>
|
|
17999
|
-
<span class="normal"><a href="#__codelineno-0-174">174</a></span>
|
|
18000
|
-
<span class="normal"><a href="#__codelineno-0-175">175</a></span>
|
|
18001
|
-
<span class="normal"><a href="#__codelineno-0-176">176</a></span>
|
|
18035
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-176">176</a></span>
|
|
18002
18036
|
<span class="normal"><a href="#__codelineno-0-177">177</a></span>
|
|
18003
18037
|
<span class="normal"><a href="#__codelineno-0-178">178</a></span>
|
|
18004
18038
|
<span class="normal"><a href="#__codelineno-0-179">179</a></span>
|
|
@@ -18030,47 +18064,55 @@ in the dictionary.</p>
|
|
|
18030
18064
|
<span class="normal"><a href="#__codelineno-0-205">205</a></span>
|
|
18031
18065
|
<span class="normal"><a href="#__codelineno-0-206">206</a></span>
|
|
18032
18066
|
<span class="normal"><a href="#__codelineno-0-207">207</a></span>
|
|
18033
|
-
<span class="normal"><a href="#__codelineno-0-208">208</a></span
|
|
18034
|
-
<
|
|
18035
|
-
<
|
|
18036
|
-
<
|
|
18037
|
-
<
|
|
18038
|
-
<
|
|
18039
|
-
<
|
|
18040
|
-
<
|
|
18041
|
-
<a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="
|
|
18042
|
-
<a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="
|
|
18043
|
-
<a id="__codelineno-0-178" name="__codelineno-0-178"></a
|
|
18044
|
-
<a id="__codelineno-0-179" name="__codelineno-0-179"></a
|
|
18067
|
+
<span class="normal"><a href="#__codelineno-0-208">208</a></span>
|
|
18068
|
+
<span class="normal"><a href="#__codelineno-0-209">209</a></span>
|
|
18069
|
+
<span class="normal"><a href="#__codelineno-0-210">210</a></span>
|
|
18070
|
+
<span class="normal"><a href="#__codelineno-0-211">211</a></span>
|
|
18071
|
+
<span class="normal"><a href="#__codelineno-0-212">212</a></span>
|
|
18072
|
+
<span class="normal"><a href="#__codelineno-0-213">213</a></span>
|
|
18073
|
+
<span class="normal"><a href="#__codelineno-0-214">214</a></span>
|
|
18074
|
+
<span class="normal"><a href="#__codelineno-0-215">215</a></span>
|
|
18075
|
+
<span class="normal"><a href="#__codelineno-0-216">216</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-176" name="__codelineno-0-176"></a><span class="k">def</span> <span class="nf">assertInstanceEqual</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">exclude</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
18076
|
+
<a id="__codelineno-0-177" name="__codelineno-0-177"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18077
|
+
<a id="__codelineno-0-178" name="__codelineno-0-178"></a><span class="sd"> Compare a model instance to a dictionary, checking that its attribute values match those specified</span>
|
|
18078
|
+
<a id="__codelineno-0-179" name="__codelineno-0-179"></a><span class="sd"> in the dictionary.</span>
|
|
18045
18079
|
<a id="__codelineno-0-180" name="__codelineno-0-180"></a>
|
|
18046
|
-
<a id="__codelineno-0-181" name="__codelineno-0-181"></a
|
|
18047
|
-
<a id="__codelineno-0-182" name="__codelineno-0-182"></a
|
|
18048
|
-
<a id="__codelineno-0-183" name="__codelineno-0-183"></a>
|
|
18049
|
-
<a id="__codelineno-0-184" name="__codelineno-0-184"></a
|
|
18050
|
-
<a id="__codelineno-0-185" name="__codelineno-0-185"></a
|
|
18051
|
-
<a id="__codelineno-0-186" name="__codelineno-0-186"></a>
|
|
18052
|
-
<a id="__codelineno-0-187" name="__codelineno-0-187"></a>
|
|
18053
|
-
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
18054
|
-
<a id="__codelineno-0-189" name="__codelineno-0-189"></a>
|
|
18055
|
-
<a id="__codelineno-0-190" name="__codelineno-0-190"></a>
|
|
18056
|
-
<a id="__codelineno-0-191" name="__codelineno-0-191"></a>
|
|
18057
|
-
<a id="__codelineno-0-192" name="__codelineno-0-192"></a>
|
|
18058
|
-
<a id="__codelineno-0-193" name="__codelineno-0-193"></a>
|
|
18059
|
-
<a id="__codelineno-0-194" name="__codelineno-0-194"></a>
|
|
18060
|
-
<a id="__codelineno-0-195" name="__codelineno-0-195"></a>
|
|
18061
|
-
<a id="__codelineno-0-196" name="__codelineno-0-196"></a>
|
|
18062
|
-
<a id="__codelineno-0-197" name="__codelineno-0-197"></a>
|
|
18063
|
-
<a id="__codelineno-0-198" name="__codelineno-0-198"></a>
|
|
18064
|
-
<a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="
|
|
18065
|
-
<a id="__codelineno-0-200" name="__codelineno-0-200"></a>
|
|
18066
|
-
<a id="__codelineno-0-201" name="__codelineno-0-201"></a>
|
|
18067
|
-
<a id="__codelineno-0-202" name="__codelineno-0-202"></a>
|
|
18068
|
-
<a id="__codelineno-0-203" name="__codelineno-0-203"></a>
|
|
18069
|
-
<a id="__codelineno-0-204" name="__codelineno-0-204"></a>
|
|
18070
|
-
<a id="__codelineno-0-205" name="__codelineno-0-205"></a>
|
|
18071
|
-
<a id="__codelineno-0-206" name="__codelineno-0-206"></a>
|
|
18072
|
-
<a id="__codelineno-0-207" name="__codelineno-0-207"></a>
|
|
18073
|
-
<a id="__codelineno-0-208" name="__codelineno-0-208"></a>
|
|
18080
|
+
<a id="__codelineno-0-181" name="__codelineno-0-181"></a><span class="sd"> :param instance: Python object instance</span>
|
|
18081
|
+
<a id="__codelineno-0-182" name="__codelineno-0-182"></a><span class="sd"> :param data: Dictionary of test data used to define the instance</span>
|
|
18082
|
+
<a id="__codelineno-0-183" name="__codelineno-0-183"></a><span class="sd"> :param exclude: List of fields to exclude from comparison (e.g. passwords, which get hashed)</span>
|
|
18083
|
+
<a id="__codelineno-0-184" name="__codelineno-0-184"></a><span class="sd"> :param api: Set to True is the data is a JSON representation of the instance</span>
|
|
18084
|
+
<a id="__codelineno-0-185" name="__codelineno-0-185"></a><span class="sd"> """</span>
|
|
18085
|
+
<a id="__codelineno-0-186" name="__codelineno-0-186"></a> <span class="k">if</span> <span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
18086
|
+
<a id="__codelineno-0-187" name="__codelineno-0-187"></a> <span class="n">exclude</span> <span class="o">=</span> <span class="p">[]</span>
|
|
18087
|
+
<a id="__codelineno-0-188" name="__codelineno-0-188"></a>
|
|
18088
|
+
<a id="__codelineno-0-189" name="__codelineno-0-189"></a> <span class="n">fields</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">]</span>
|
|
18089
|
+
<a id="__codelineno-0-190" name="__codelineno-0-190"></a> <span class="n">model_dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model_to_dict</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="n">api</span><span class="p">)</span>
|
|
18090
|
+
<a id="__codelineno-0-191" name="__codelineno-0-191"></a>
|
|
18091
|
+
<a id="__codelineno-0-192" name="__codelineno-0-192"></a> <span class="n">new_model_dict</span> <span class="o">=</span> <span class="p">{}</span>
|
|
18092
|
+
<a id="__codelineno-0-193" name="__codelineno-0-193"></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">model_dict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
18093
|
+
<a id="__codelineno-0-194" name="__codelineno-0-194"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
|
18094
|
+
<a id="__codelineno-0-195" name="__codelineno-0-195"></a> <span class="c1"># Sort lists of values. This includes items like tags, or other M2M fields</span>
|
|
18095
|
+
<a id="__codelineno-0-196" name="__codelineno-0-196"></a> <span class="n">new_model_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
18096
|
+
<a id="__codelineno-0-197" name="__codelineno-0-197"></a> <span class="k">elif</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">"data_schema"</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
18097
|
+
<a id="__codelineno-0-198" name="__codelineno-0-198"></a> <span class="c1"># Standardize the data_schema JSON, since the column is JSON and MySQL/dolt do not guarantee order</span>
|
|
18098
|
+
<a id="__codelineno-0-199" name="__codelineno-0-199"></a> <span class="n">new_model_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">standardize_json</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
18099
|
+
<a id="__codelineno-0-200" name="__codelineno-0-200"></a> <span class="k">else</span><span class="p">:</span>
|
|
18100
|
+
<a id="__codelineno-0-201" name="__codelineno-0-201"></a> <span class="n">new_model_dict</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
|
18101
|
+
<a id="__codelineno-0-202" name="__codelineno-0-202"></a>
|
|
18102
|
+
<a id="__codelineno-0-203" name="__codelineno-0-203"></a> <span class="c1"># Omit any dictionary keys which are not instance attributes or have been excluded</span>
|
|
18103
|
+
<a id="__codelineno-0-204" name="__codelineno-0-204"></a> <span class="n">relevant_data</span> <span class="o">=</span> <span class="p">{}</span>
|
|
18104
|
+
<a id="__codelineno-0-205" name="__codelineno-0-205"></a> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
18105
|
+
<a id="__codelineno-0-206" name="__codelineno-0-206"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">and</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">exclude</span><span class="p">:</span>
|
|
18106
|
+
<a id="__codelineno-0-207" name="__codelineno-0-207"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
|
|
18107
|
+
<a id="__codelineno-0-208" name="__codelineno-0-208"></a> <span class="c1"># Sort lists of values. This includes items like tags, or other M2M fields</span>
|
|
18108
|
+
<a id="__codelineno-0-209" name="__codelineno-0-209"></a> <span class="n">relevant_data</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
18109
|
+
<a id="__codelineno-0-210" name="__codelineno-0-210"></a> <span class="k">elif</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">"data_schema"</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
18110
|
+
<a id="__codelineno-0-211" name="__codelineno-0-211"></a> <span class="c1"># Standardize the data_schema JSON, since the column is JSON and MySQL/dolt do not guarantee order</span>
|
|
18111
|
+
<a id="__codelineno-0-212" name="__codelineno-0-212"></a> <span class="n">relevant_data</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">standardize_json</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
|
|
18112
|
+
<a id="__codelineno-0-213" name="__codelineno-0-213"></a> <span class="k">else</span><span class="p">:</span>
|
|
18113
|
+
<a id="__codelineno-0-214" name="__codelineno-0-214"></a> <span class="n">relevant_data</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
|
18114
|
+
<a id="__codelineno-0-215" name="__codelineno-0-215"></a>
|
|
18115
|
+
<a id="__codelineno-0-216" name="__codelineno-0-216"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="n">new_model_dict</span><span class="p">,</span> <span class="n">relevant_data</span><span class="p">)</span>
|
|
18074
18116
|
</code></pre></div></td></tr></table></div>
|
|
18075
18117
|
</details>
|
|
18076
18118
|
</div>
|
|
@@ -18094,19 +18136,19 @@ in the dictionary.</p>
|
|
|
18094
18136
|
|
|
18095
18137
|
<details class="quote">
|
|
18096
18138
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18097
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18098
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18099
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18100
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18101
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18102
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18103
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18104
|
-
<a id="__codelineno-0-
|
|
18105
|
-
<a id="__codelineno-0-
|
|
18106
|
-
<a id="__codelineno-0-
|
|
18107
|
-
<a id="__codelineno-0-
|
|
18108
|
-
<a id="__codelineno-0-
|
|
18109
|
-
<a id="__codelineno-0-
|
|
18139
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-218">218</a></span>
|
|
18140
|
+
<span class="normal"><a href="#__codelineno-0-219">219</a></span>
|
|
18141
|
+
<span class="normal"><a href="#__codelineno-0-220">220</a></span>
|
|
18142
|
+
<span class="normal"><a href="#__codelineno-0-221">221</a></span>
|
|
18143
|
+
<span class="normal"><a href="#__codelineno-0-222">222</a></span>
|
|
18144
|
+
<span class="normal"><a href="#__codelineno-0-223">223</a></span>
|
|
18145
|
+
<span class="normal"><a href="#__codelineno-0-224">224</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-218" name="__codelineno-0-218"></a><span class="k">def</span> <span class="nf">assertQuerysetEqualAndNotEmpty</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">qs</span><span class="p">,</span> <span class="n">values</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>
|
|
18146
|
+
<a id="__codelineno-0-219" name="__codelineno-0-219"></a><span class="w"> </span><span class="sd">"""Wrapper for assertQuerysetEqual with additional logic to assert input queryset and values are not empty"""</span>
|
|
18147
|
+
<a id="__codelineno-0-220" name="__codelineno-0-220"></a>
|
|
18148
|
+
<a id="__codelineno-0-221" name="__codelineno-0-221"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertNotEqual</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">qs</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"Queryset cannot be empty"</span><span class="p">)</span>
|
|
18149
|
+
<a id="__codelineno-0-222" name="__codelineno-0-222"></a> <span class="bp">self</span><span class="o">.</span><span class="n">assertNotEqual</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">values</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"Values cannot be empty"</span><span class="p">)</span>
|
|
18150
|
+
<a id="__codelineno-0-223" name="__codelineno-0-223"></a>
|
|
18151
|
+
<a id="__codelineno-0-224" name="__codelineno-0-224"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">assertQuerysetEqual</span><span class="p">(</span><span class="n">qs</span><span class="p">,</span> <span class="n">values</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>
|
|
18110
18152
|
</code></pre></div></td></tr></table></div>
|
|
18111
18153
|
</details>
|
|
18112
18154
|
</div>
|
|
@@ -18135,33 +18177,33 @@ in the dictionary.</p>
|
|
|
18135
18177
|
|
|
18136
18178
|
<details class="quote">
|
|
18137
18179
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18138
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18139
|
-
<span class="normal"><a href="#__codelineno-0-232">232</a></span>
|
|
18140
|
-
<span class="normal"><a href="#__codelineno-0-233">233</a></span>
|
|
18141
|
-
<span class="normal"><a href="#__codelineno-0-234">234</a></span>
|
|
18142
|
-
<span class="normal"><a href="#__codelineno-0-235">235</a></span>
|
|
18143
|
-
<span class="normal"><a href="#__codelineno-0-236">236</a></span>
|
|
18144
|
-
<span class="normal"><a href="#__codelineno-0-237">237</a></span>
|
|
18145
|
-
<span class="normal"><a href="#__codelineno-0-238">238</a></span>
|
|
18146
|
-
<span class="normal"><a href="#__codelineno-0-239">239</a></span>
|
|
18180
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-239">239</a></span>
|
|
18147
18181
|
<span class="normal"><a href="#__codelineno-0-240">240</a></span>
|
|
18148
18182
|
<span class="normal"><a href="#__codelineno-0-241">241</a></span>
|
|
18149
18183
|
<span class="normal"><a href="#__codelineno-0-242">242</a></span>
|
|
18150
18184
|
<span class="normal"><a href="#__codelineno-0-243">243</a></span>
|
|
18151
|
-
<span class="normal"><a href="#__codelineno-0-244">244</a></span
|
|
18152
|
-
<
|
|
18153
|
-
<
|
|
18154
|
-
<
|
|
18155
|
-
<
|
|
18156
|
-
<
|
|
18157
|
-
<
|
|
18158
|
-
<
|
|
18159
|
-
<a id="__codelineno-0-239" name="__codelineno-0-239"></a
|
|
18160
|
-
<a id="__codelineno-0-240" name="__codelineno-0-240"></a>
|
|
18161
|
-
<a id="__codelineno-0-241" name="__codelineno-0-241"></a
|
|
18162
|
-
<a id="__codelineno-0-242" name="__codelineno-0-242"></a
|
|
18163
|
-
<a id="__codelineno-0-243" name="__codelineno-0-243"></a>
|
|
18164
|
-
<a id="__codelineno-0-244" name="__codelineno-0-244"></a
|
|
18185
|
+
<span class="normal"><a href="#__codelineno-0-244">244</a></span>
|
|
18186
|
+
<span class="normal"><a href="#__codelineno-0-245">245</a></span>
|
|
18187
|
+
<span class="normal"><a href="#__codelineno-0-246">246</a></span>
|
|
18188
|
+
<span class="normal"><a href="#__codelineno-0-247">247</a></span>
|
|
18189
|
+
<span class="normal"><a href="#__codelineno-0-248">248</a></span>
|
|
18190
|
+
<span class="normal"><a href="#__codelineno-0-249">249</a></span>
|
|
18191
|
+
<span class="normal"><a href="#__codelineno-0-250">250</a></span>
|
|
18192
|
+
<span class="normal"><a href="#__codelineno-0-251">251</a></span>
|
|
18193
|
+
<span class="normal"><a href="#__codelineno-0-252">252</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-239" name="__codelineno-0-239"></a><span class="nd">@classmethod</span>
|
|
18194
|
+
<a id="__codelineno-0-240" name="__codelineno-0-240"></a><span class="k">def</span> <span class="nf">create_tags</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">names</span><span class="p">):</span>
|
|
18195
|
+
<a id="__codelineno-0-241" name="__codelineno-0-241"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18196
|
+
<a id="__codelineno-0-242" name="__codelineno-0-242"></a><span class="sd"> Create and return a Tag instance for each name given.</span>
|
|
18197
|
+
<a id="__codelineno-0-243" name="__codelineno-0-243"></a>
|
|
18198
|
+
<a id="__codelineno-0-244" name="__codelineno-0-244"></a><span class="sd"> DEPRECATED: use TagFactory instead.</span>
|
|
18199
|
+
<a id="__codelineno-0-245" name="__codelineno-0-245"></a><span class="sd"> """</span>
|
|
18200
|
+
<a id="__codelineno-0-246" name="__codelineno-0-246"></a> <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
|
|
18201
|
+
<a id="__codelineno-0-247" name="__codelineno-0-247"></a> <span class="s2">"create_tags() is deprecated and will be removed in a future Nautobot release. "</span>
|
|
18202
|
+
<a id="__codelineno-0-248" name="__codelineno-0-248"></a> <span class="s2">"Use nautobot.extras.factory.TagFactory (provided in Nautobot 1.5 and later) instead."</span><span class="p">,</span>
|
|
18203
|
+
<a id="__codelineno-0-249" name="__codelineno-0-249"></a> <span class="ne">DeprecationWarning</span><span class="p">,</span>
|
|
18204
|
+
<a id="__codelineno-0-250" name="__codelineno-0-250"></a> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
|
|
18205
|
+
<a id="__codelineno-0-251" name="__codelineno-0-251"></a> <span class="p">)</span>
|
|
18206
|
+
<a id="__codelineno-0-252" name="__codelineno-0-252"></a> <span class="k">return</span> <span class="p">[</span><span class="n">extras_models</span><span class="o">.</span><span class="n">Tag</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">]</span>
|
|
18165
18207
|
</code></pre></div></td></tr></table></div>
|
|
18166
18208
|
</details>
|
|
18167
18209
|
</div>
|
|
@@ -18185,15 +18227,7 @@ in the dictionary.</p>
|
|
|
18185
18227
|
|
|
18186
18228
|
<details class="quote">
|
|
18187
18229
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18188
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18189
|
-
<span class="normal"><a href="#__codelineno-0-80"> 80</a></span>
|
|
18190
|
-
<span class="normal"><a href="#__codelineno-0-81"> 81</a></span>
|
|
18191
|
-
<span class="normal"><a href="#__codelineno-0-82"> 82</a></span>
|
|
18192
|
-
<span class="normal"><a href="#__codelineno-0-83"> 83</a></span>
|
|
18193
|
-
<span class="normal"><a href="#__codelineno-0-84"> 84</a></span>
|
|
18194
|
-
<span class="normal"><a href="#__codelineno-0-85"> 85</a></span>
|
|
18195
|
-
<span class="normal"><a href="#__codelineno-0-86"> 86</a></span>
|
|
18196
|
-
<span class="normal"><a href="#__codelineno-0-87"> 87</a></span>
|
|
18230
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-87"> 87</a></span>
|
|
18197
18231
|
<span class="normal"><a href="#__codelineno-0-88"> 88</a></span>
|
|
18198
18232
|
<span class="normal"><a href="#__codelineno-0-89"> 89</a></span>
|
|
18199
18233
|
<span class="normal"><a href="#__codelineno-0-90"> 90</a></span>
|
|
@@ -18233,55 +18267,63 @@ in the dictionary.</p>
|
|
|
18233
18267
|
<span class="normal"><a href="#__codelineno-0-124">124</a></span>
|
|
18234
18268
|
<span class="normal"><a href="#__codelineno-0-125">125</a></span>
|
|
18235
18269
|
<span class="normal"><a href="#__codelineno-0-126">126</a></span>
|
|
18236
|
-
<span class="normal"><a href="#__codelineno-0-127">127</a></span
|
|
18237
|
-
<
|
|
18238
|
-
<
|
|
18239
|
-
<
|
|
18240
|
-
<
|
|
18241
|
-
<
|
|
18242
|
-
<
|
|
18243
|
-
<
|
|
18244
|
-
<a id="__codelineno-0-87" name="__codelineno-0-87"></a>
|
|
18245
|
-
<a id="__codelineno-0-88" name="__codelineno-0-88"></a
|
|
18246
|
-
<a id="__codelineno-0-89" name="__codelineno-0-89"></a
|
|
18247
|
-
<a id="__codelineno-0-90" name="__codelineno-0-90"></a>
|
|
18248
|
-
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="
|
|
18249
|
-
<a id="__codelineno-0-92" name="__codelineno-0-92"></a>
|
|
18250
|
-
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
18251
|
-
<a id="__codelineno-0-94" name="__codelineno-0-94"></a>
|
|
18252
|
-
<a id="__codelineno-0-95" name="__codelineno-0-95"></a>
|
|
18253
|
-
<a id="__codelineno-0-96" name="__codelineno-0-96"></a>
|
|
18254
|
-
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">
|
|
18270
|
+
<span class="normal"><a href="#__codelineno-0-127">127</a></span>
|
|
18271
|
+
<span class="normal"><a href="#__codelineno-0-128">128</a></span>
|
|
18272
|
+
<span class="normal"><a href="#__codelineno-0-129">129</a></span>
|
|
18273
|
+
<span class="normal"><a href="#__codelineno-0-130">130</a></span>
|
|
18274
|
+
<span class="normal"><a href="#__codelineno-0-131">131</a></span>
|
|
18275
|
+
<span class="normal"><a href="#__codelineno-0-132">132</a></span>
|
|
18276
|
+
<span class="normal"><a href="#__codelineno-0-133">133</a></span>
|
|
18277
|
+
<span class="normal"><a href="#__codelineno-0-134">134</a></span>
|
|
18278
|
+
<span class="normal"><a href="#__codelineno-0-135">135</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-87" name="__codelineno-0-87"></a><span class="k">def</span> <span class="nf">model_to_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">fields</span><span class="p">,</span> <span class="n">api</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
18279
|
+
<a id="__codelineno-0-88" name="__codelineno-0-88"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18280
|
+
<a id="__codelineno-0-89" name="__codelineno-0-89"></a><span class="sd"> Return a dictionary representation of an instance.</span>
|
|
18281
|
+
<a id="__codelineno-0-90" name="__codelineno-0-90"></a><span class="sd"> """</span>
|
|
18282
|
+
<a id="__codelineno-0-91" name="__codelineno-0-91"></a> <span class="c1"># Prepare the instance and call Django's model_to_dict() to extract all fields</span>
|
|
18283
|
+
<a id="__codelineno-0-92" name="__codelineno-0-92"></a> <span class="n">model_dict</span> <span class="o">=</span> <span class="n">model_to_dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prepare_instance</span><span class="p">(</span><span class="n">instance</span><span class="p">),</span> <span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">)</span>
|
|
18284
|
+
<a id="__codelineno-0-93" name="__codelineno-0-93"></a>
|
|
18285
|
+
<a id="__codelineno-0-94" name="__codelineno-0-94"></a> <span class="c1"># Map any additional (non-field) instance attributes that were specified</span>
|
|
18286
|
+
<a id="__codelineno-0-95" name="__codelineno-0-95"></a> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
|
|
18287
|
+
<a id="__codelineno-0-96" name="__codelineno-0-96"></a> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span> <span class="ow">and</span> <span class="n">attr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">model_dict</span><span class="p">:</span>
|
|
18288
|
+
<a id="__codelineno-0-97" name="__codelineno-0-97"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
|
|
18255
18289
|
<a id="__codelineno-0-98" name="__codelineno-0-98"></a>
|
|
18256
|
-
<a id="__codelineno-0-99" name="__codelineno-0-99"></a>
|
|
18257
|
-
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">
|
|
18258
|
-
<a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="
|
|
18259
|
-
<a id="__codelineno-0-102" name="__codelineno-0-102"></a>
|
|
18260
|
-
<a id="__codelineno-0-103" name="__codelineno-0-103"></a>
|
|
18261
|
-
<a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="c1">#
|
|
18262
|
-
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="
|
|
18263
|
-
<a id="__codelineno-0-106" name="__codelineno-0-106"></a>
|
|
18264
|
-
<a id="__codelineno-0-107" name="__codelineno-0-107"></a>
|
|
18265
|
-
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="n">
|
|
18266
|
-
<a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="c1">#
|
|
18267
|
-
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">if</span> <span class="
|
|
18268
|
-
<a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">
|
|
18269
|
-
<a id="__codelineno-0-112" name="__codelineno-0-112"></a>
|
|
18270
|
-
<a id="__codelineno-0-113" name="__codelineno-0-113"></a>
|
|
18271
|
-
<a id="__codelineno-0-114" name="__codelineno-0-114"></a>
|
|
18272
|
-
<a id="__codelineno-0-115" name="__codelineno-0-115"></a>
|
|
18273
|
-
<a id="__codelineno-0-116" name="__codelineno-0-116"></a>
|
|
18274
|
-
<a id="__codelineno-0-117" name="__codelineno-0-117"></a>
|
|
18275
|
-
<a id="__codelineno-0-118" name="__codelineno-0-118"></a>
|
|
18276
|
-
<a id="__codelineno-0-119" name="__codelineno-0-119"></a>
|
|
18277
|
-
<a id="__codelineno-0-120" name="__codelineno-0-120"></a>
|
|
18278
|
-
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
18279
|
-
<a id="__codelineno-0-122" name="__codelineno-0-122"></a>
|
|
18280
|
-
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="
|
|
18281
|
-
<a id="__codelineno-0-124" name="__codelineno-0-124"></a>
|
|
18282
|
-
<a id="__codelineno-0-125" name="__codelineno-0-125"></a>
|
|
18283
|
-
<a id="__codelineno-0-126" name="__codelineno-0-126"></a>
|
|
18284
|
-
<a id="__codelineno-0-127" name="__codelineno-0-127"></a>
|
|
18290
|
+
<a id="__codelineno-0-99" name="__codelineno-0-99"></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">model_dict</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
18291
|
+
<a id="__codelineno-0-100" name="__codelineno-0-100"></a> <span class="k">try</span><span class="p">:</span>
|
|
18292
|
+
<a id="__codelineno-0-101" name="__codelineno-0-101"></a> <span class="n">field</span> <span class="o">=</span> <span class="n">instance</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">get_field</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
18293
|
+
<a id="__codelineno-0-102" name="__codelineno-0-102"></a> <span class="k">except</span> <span class="n">FieldDoesNotExist</span><span class="p">:</span>
|
|
18294
|
+
<a id="__codelineno-0-103" name="__codelineno-0-103"></a> <span class="c1"># Attribute is not a model field, but may be a computed field,</span>
|
|
18295
|
+
<a id="__codelineno-0-104" name="__codelineno-0-104"></a> <span class="c1"># so allow `field` checks to pass through.</span>
|
|
18296
|
+
<a id="__codelineno-0-105" name="__codelineno-0-105"></a> <span class="n">field</span> <span class="o">=</span> <span class="kc">None</span>
|
|
18297
|
+
<a id="__codelineno-0-106" name="__codelineno-0-106"></a>
|
|
18298
|
+
<a id="__codelineno-0-107" name="__codelineno-0-107"></a> <span class="c1"># Handle ManyToManyFields</span>
|
|
18299
|
+
<a id="__codelineno-0-108" name="__codelineno-0-108"></a> <span class="k">if</span> <span class="n">value</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="p">(</span><span class="n">ManyToManyField</span><span class="p">,</span> <span class="n">core_fields</span><span class="o">.</span><span class="n">TagsField</span><span class="p">)):</span>
|
|
18300
|
+
<a id="__codelineno-0-109" name="__codelineno-0-109"></a> <span class="c1"># Only convert ContentType to <app_label>.<model> for API serializers/views</span>
|
|
18301
|
+
<a id="__codelineno-0-110" name="__codelineno-0-110"></a> <span class="k">if</span> <span class="n">api</span> <span class="ow">and</span> <span class="n">field</span><span class="o">.</span><span class="n">related_model</span> <span class="ow">is</span> <span class="n">ContentType</span><span class="p">:</span>
|
|
18302
|
+
<a id="__codelineno-0-111" name="__codelineno-0-111"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">ct</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="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">ct</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
|
|
18303
|
+
<a id="__codelineno-0-112" name="__codelineno-0-112"></a> <span class="c1"># Otherwise always convert object instances to pk</span>
|
|
18304
|
+
<a id="__codelineno-0-113" name="__codelineno-0-113"></a> <span class="k">else</span><span class="p">:</span>
|
|
18305
|
+
<a id="__codelineno-0-114" name="__codelineno-0-114"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">obj</span><span class="o">.</span><span class="n">pk</span> <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
|
|
18306
|
+
<a id="__codelineno-0-115" name="__codelineno-0-115"></a>
|
|
18307
|
+
<a id="__codelineno-0-116" name="__codelineno-0-116"></a> <span class="k">if</span> <span class="n">api</span><span class="p">:</span>
|
|
18308
|
+
<a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="c1"># Replace ContentType primary keys with <app_label>.<model></span>
|
|
18309
|
+
<a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">instance</span><span class="p">,</span> <span class="n">key</span><span class="p">),</span> <span class="n">ContentType</span><span class="p">):</span>
|
|
18310
|
+
<a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">ct</span> <span class="o">=</span> <span class="n">ContentType</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">pk</span><span class="o">=</span><span class="n">value</span><span class="p">)</span>
|
|
18311
|
+
<a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">ct</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="n">ct</span><span class="o">.</span><span class="n">model</span><span class="si">}</span><span class="s2">"</span>
|
|
18312
|
+
<a id="__codelineno-0-121" name="__codelineno-0-121"></a>
|
|
18313
|
+
<a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="c1"># Convert IPNetwork instances to strings</span>
|
|
18314
|
+
<a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">IPNetwork</span><span class="p">):</span>
|
|
18315
|
+
<a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
18316
|
+
<a id="__codelineno-0-125" name="__codelineno-0-125"></a>
|
|
18317
|
+
<a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="k">else</span><span class="p">:</span>
|
|
18318
|
+
<a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="c1"># Convert ArrayFields to CSV strings</span>
|
|
18319
|
+
<a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">core_fields</span><span class="o">.</span><span class="n">JSONArrayField</span><span class="p">):</span>
|
|
18320
|
+
<a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="s2">","</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">])</span>
|
|
18321
|
+
<a id="__codelineno-0-130" name="__codelineno-0-130"></a>
|
|
18322
|
+
<a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="c1"># Convert JSONField dict values to JSON strings</span>
|
|
18323
|
+
<a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">JSONField</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
|
|
18324
|
+
<a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="n">model_dict</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
18325
|
+
<a id="__codelineno-0-134" name="__codelineno-0-134"></a>
|
|
18326
|
+
<a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="k">return</span> <span class="n">model_dict</span>
|
|
18285
18327
|
</code></pre></div></td></tr></table></div>
|
|
18286
18328
|
</details>
|
|
18287
18329
|
</div>
|
|
@@ -18306,17 +18348,17 @@ against test data. For example, it can be used to decrypt a Secret's plaintext a
|
|
|
18306
18348
|
|
|
18307
18349
|
<details class="quote">
|
|
18308
18350
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18309
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18310
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18311
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18312
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18313
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18314
|
-
<span class="normal"><a href="#__codelineno-0-
|
|
18315
|
-
<a id="__codelineno-0-
|
|
18316
|
-
<a id="__codelineno-0-
|
|
18317
|
-
<a id="__codelineno-0-
|
|
18318
|
-
<a id="__codelineno-0-
|
|
18319
|
-
<a id="__codelineno-0-
|
|
18351
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-80">80</a></span>
|
|
18352
|
+
<span class="normal"><a href="#__codelineno-0-81">81</a></span>
|
|
18353
|
+
<span class="normal"><a href="#__codelineno-0-82">82</a></span>
|
|
18354
|
+
<span class="normal"><a href="#__codelineno-0-83">83</a></span>
|
|
18355
|
+
<span class="normal"><a href="#__codelineno-0-84">84</a></span>
|
|
18356
|
+
<span class="normal"><a href="#__codelineno-0-85">85</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-80" name="__codelineno-0-80"></a><span class="k">def</span> <span class="nf">prepare_instance</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">):</span>
|
|
18357
|
+
<a id="__codelineno-0-81" name="__codelineno-0-81"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18358
|
+
<a id="__codelineno-0-82" name="__codelineno-0-82"></a><span class="sd"> Test cases can override this method to perform any necessary manipulation of an instance prior to its evaluation</span>
|
|
18359
|
+
<a id="__codelineno-0-83" name="__codelineno-0-83"></a><span class="sd"> against test data. For example, it can be used to decrypt a Secret's plaintext attribute.</span>
|
|
18360
|
+
<a id="__codelineno-0-84" name="__codelineno-0-84"></a><span class="sd"> """</span>
|
|
18361
|
+
<a id="__codelineno-0-85" name="__codelineno-0-85"></a> <span class="k">return</span> <span class="n">instance</span>
|
|
18320
18362
|
</code></pre></div></td></tr></table></div>
|
|
18321
18363
|
</details>
|
|
18322
18364
|
</div>
|
|
@@ -18340,8 +18382,7 @@ against test data. For example, it can be used to decrypt a Secret's plaintext a
|
|
|
18340
18382
|
|
|
18341
18383
|
<details class="quote">
|
|
18342
18384
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18343
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18344
|
-
<span class="normal"><a href="#__codelineno-0-48">48</a></span>
|
|
18385
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-48">48</a></span>
|
|
18345
18386
|
<span class="normal"><a href="#__codelineno-0-49">49</a></span>
|
|
18346
18387
|
<span class="normal"><a href="#__codelineno-0-50">50</a></span>
|
|
18347
18388
|
<span class="normal"><a href="#__codelineno-0-51">51</a></span>
|
|
@@ -18356,23 +18397,24 @@ against test data. For example, it can be used to decrypt a Secret's plaintext a
|
|
|
18356
18397
|
<span class="normal"><a href="#__codelineno-0-60">60</a></span>
|
|
18357
18398
|
<span class="normal"><a href="#__codelineno-0-61">61</a></span>
|
|
18358
18399
|
<span class="normal"><a href="#__codelineno-0-62">62</a></span>
|
|
18359
|
-
<span class="normal"><a href="#__codelineno-0-63">63</a></span
|
|
18360
|
-
<a id="__codelineno-0-48" name="__codelineno-0-48"></a><span class="
|
|
18361
|
-
<a id="__codelineno-0-49" name="__codelineno-0-49"></a>
|
|
18362
|
-
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="
|
|
18363
|
-
<a id="__codelineno-0-51" name="__codelineno-0-51"></a>
|
|
18364
|
-
<a id="__codelineno-0-52" name="__codelineno-0-52"></a>
|
|
18365
|
-
<a id="__codelineno-0-53" name="__codelineno-0-53"></a>
|
|
18366
|
-
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="
|
|
18367
|
-
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="bp">self</span><span class="o">.</span><span class="n">
|
|
18368
|
-
<a id="__codelineno-0-56" name="__codelineno-0-56"></a>
|
|
18369
|
-
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
18370
|
-
<a id="__codelineno-0-58" name="__codelineno-0-58"></a>
|
|
18371
|
-
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="
|
|
18372
|
-
<a id="__codelineno-0-60" name="__codelineno-0-60"></a>
|
|
18373
|
-
<a id="__codelineno-0-61" name="__codelineno-0-61"></a>
|
|
18374
|
-
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
18375
|
-
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="
|
|
18400
|
+
<span class="normal"><a href="#__codelineno-0-63">63</a></span>
|
|
18401
|
+
<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-48" name="__codelineno-0-48"></a><span class="k">def</span> <span class="nf">setUpNautobot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">populate_status</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
18402
|
+
<a id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="w"> </span><span class="sd">"""Setup shared testuser, statuses and client."""</span>
|
|
18403
|
+
<a id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="c1"># Re-populate status choices after database truncation by TransactionTestCase</span>
|
|
18404
|
+
<a id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="k">if</span> <span class="n">populate_status</span><span class="p">:</span>
|
|
18405
|
+
<a id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="n">management</span><span class="o">.</span><span class="n">populate_status_choices</span><span class="p">(</span><span class="n">apps</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
18406
|
+
<a id="__codelineno-0-53" name="__codelineno-0-53"></a>
|
|
18407
|
+
<a id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="c1"># Create the test user and assign permissions</span>
|
|
18408
|
+
<a id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">User</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create_user</span><span class="p">(</span><span class="n">username</span><span class="o">=</span><span class="s2">"nautobotuser"</span><span class="p">)</span>
|
|
18409
|
+
<a id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="bp">self</span><span class="o">.</span><span class="n">add_permissions</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">user_permissions</span><span class="p">)</span>
|
|
18410
|
+
<a id="__codelineno-0-57" name="__codelineno-0-57"></a>
|
|
18411
|
+
<a id="__codelineno-0-58" name="__codelineno-0-58"></a> <span class="k">if</span> <span class="n">client</span><span class="p">:</span>
|
|
18412
|
+
<a id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="c1"># Initialize the test client</span>
|
|
18413
|
+
<a id="__codelineno-0-60" name="__codelineno-0-60"></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">"client"</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
18414
|
+
<a id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client_class</span><span class="p">()</span>
|
|
18415
|
+
<a id="__codelineno-0-62" name="__codelineno-0-62"></a>
|
|
18416
|
+
<a id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="c1"># Force login explicitly with the first-available backend</span>
|
|
18417
|
+
<a id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">force_login</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
|
|
18376
18418
|
</code></pre></div></td></tr></table></div>
|
|
18377
18419
|
</details>
|
|
18378
18420
|
</div>
|
|
@@ -18392,21 +18434,40 @@ against test data. For example, it can be used to decrypt a Secret's plaintext a
|
|
|
18392
18434
|
|
|
18393
18435
|
<div class="doc doc-contents ">
|
|
18394
18436
|
|
|
18395
|
-
<p>Clear
|
|
18437
|
+
<p>Clear cache after each test case.</p>
|
|
18438
|
+
<p>In theory this shouldn't be necessary as our cache <strong>should</strong> appropriately update and clear itself when
|
|
18439
|
+
data changes occur, but in practice we've seen issues here. Best guess at present is that it's due to
|
|
18440
|
+
<code>TransactionTestCase</code> truncating the database, which presumably doesn't trigger the relevant Django signals
|
|
18441
|
+
that would otherwise refresh the cache appropriately.</p>
|
|
18442
|
+
<p>See also: https://code.djangoproject.com/ticket/11505</p>
|
|
18396
18443
|
|
|
18397
18444
|
<details class="quote">
|
|
18398
18445
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18399
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18400
|
-
<span class="normal"><a href="#__codelineno-0-66">66</a></span>
|
|
18446
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-66">66</a></span>
|
|
18401
18447
|
<span class="normal"><a href="#__codelineno-0-67">67</a></span>
|
|
18402
18448
|
<span class="normal"><a href="#__codelineno-0-68">68</a></span>
|
|
18403
18449
|
<span class="normal"><a href="#__codelineno-0-69">69</a></span>
|
|
18404
|
-
<span class="normal"><a href="#__codelineno-0-70">70</a></span
|
|
18405
|
-
<
|
|
18406
|
-
<
|
|
18407
|
-
<
|
|
18408
|
-
<
|
|
18409
|
-
<
|
|
18450
|
+
<span class="normal"><a href="#__codelineno-0-70">70</a></span>
|
|
18451
|
+
<span class="normal"><a href="#__codelineno-0-71">71</a></span>
|
|
18452
|
+
<span class="normal"><a href="#__codelineno-0-72">72</a></span>
|
|
18453
|
+
<span class="normal"><a href="#__codelineno-0-73">73</a></span>
|
|
18454
|
+
<span class="normal"><a href="#__codelineno-0-74">74</a></span>
|
|
18455
|
+
<span class="normal"><a href="#__codelineno-0-75">75</a></span>
|
|
18456
|
+
<span class="normal"><a href="#__codelineno-0-76">76</a></span>
|
|
18457
|
+
<span class="normal"><a href="#__codelineno-0-77">77</a></span>
|
|
18458
|
+
<span class="normal"><a href="#__codelineno-0-78">78</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-66" name="__codelineno-0-66"></a><span class="k">def</span> <span class="nf">tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
18459
|
+
<a id="__codelineno-0-67" name="__codelineno-0-67"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18460
|
+
<a id="__codelineno-0-68" name="__codelineno-0-68"></a><span class="sd"> Clear cache after each test case.</span>
|
|
18461
|
+
<a id="__codelineno-0-69" name="__codelineno-0-69"></a>
|
|
18462
|
+
<a id="__codelineno-0-70" name="__codelineno-0-70"></a><span class="sd"> In theory this shouldn't be necessary as our cache **should** appropriately update and clear itself when</span>
|
|
18463
|
+
<a id="__codelineno-0-71" name="__codelineno-0-71"></a><span class="sd"> data changes occur, but in practice we've seen issues here. Best guess at present is that it's due to</span>
|
|
18464
|
+
<a id="__codelineno-0-72" name="__codelineno-0-72"></a><span class="sd"> `TransactionTestCase` truncating the database, which presumably doesn't trigger the relevant Django signals</span>
|
|
18465
|
+
<a id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="sd"> that would otherwise refresh the cache appropriately.</span>
|
|
18466
|
+
<a id="__codelineno-0-74" name="__codelineno-0-74"></a>
|
|
18467
|
+
<a id="__codelineno-0-75" name="__codelineno-0-75"></a><span class="sd"> See also: https://code.djangoproject.com/ticket/11505</span>
|
|
18468
|
+
<a id="__codelineno-0-76" name="__codelineno-0-76"></a><span class="sd"> """</span>
|
|
18469
|
+
<a id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">tearDown</span><span class="p">()</span>
|
|
18470
|
+
<a id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="n">cache</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
18410
18471
|
</code></pre></div></td></tr></table></div>
|
|
18411
18472
|
</details>
|
|
18412
18473
|
</div>
|
|
@@ -18442,8 +18503,7 @@ against test data. For example, it can be used to decrypt a Secret's plaintext a
|
|
|
18442
18503
|
|
|
18443
18504
|
<details class="quote">
|
|
18444
18505
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18445
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18446
|
-
<span class="normal"><a href="#__codelineno-0-24">24</a></span>
|
|
18506
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-24">24</a></span>
|
|
18447
18507
|
<span class="normal"><a href="#__codelineno-0-25">25</a></span>
|
|
18448
18508
|
<span class="normal"><a href="#__codelineno-0-26">26</a></span>
|
|
18449
18509
|
<span class="normal"><a href="#__codelineno-0-27">27</a></span>
|
|
@@ -18457,22 +18517,23 @@ against test data. For example, it can be used to decrypt a Secret's plaintext a
|
|
|
18457
18517
|
<span class="normal"><a href="#__codelineno-0-35">35</a></span>
|
|
18458
18518
|
<span class="normal"><a href="#__codelineno-0-36">36</a></span>
|
|
18459
18519
|
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
|
|
18460
|
-
<span class="normal"><a href="#__codelineno-0-38">38</a></span
|
|
18461
|
-
<a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="
|
|
18462
|
-
<a id="__codelineno-0-25" name="__codelineno-0-25"></a><span class="
|
|
18463
|
-
<a id="__codelineno-0-26" name="__codelineno-0-26"></a>
|
|
18464
|
-
<a id="__codelineno-0-27" name="__codelineno-0-27"></a
|
|
18465
|
-
<a id="__codelineno-0-28" name="__codelineno-0-28"></a><span class="sd">
|
|
18466
|
-
<a id="__codelineno-0-29" name="__codelineno-0-29"></a>
|
|
18467
|
-
<a id="__codelineno-0-30" name="__codelineno-0-30"></a>
|
|
18468
|
-
<a id="__codelineno-0-31" name="__codelineno-0-31"></a><span class="
|
|
18469
|
-
<a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="
|
|
18470
|
-
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
18471
|
-
<a id="__codelineno-0-34" name="__codelineno-0-34"></a
|
|
18472
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd">
|
|
18473
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd">
|
|
18474
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a
|
|
18475
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="
|
|
18520
|
+
<span class="normal"><a href="#__codelineno-0-38">38</a></span>
|
|
18521
|
+
<span class="normal"><a href="#__codelineno-0-39">39</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-24" name="__codelineno-0-24"></a><span class="k">class</span> <span class="nc">NautobotTestClient</span><span class="p">(</span><span class="n">APIClient</span><span class="p">):</span>
|
|
18522
|
+
<a id="__codelineno-0-25" name="__codelineno-0-25"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18523
|
+
<a id="__codelineno-0-26" name="__codelineno-0-26"></a><span class="sd"> Base client class for Nautobot testing.</span>
|
|
18524
|
+
<a id="__codelineno-0-27" name="__codelineno-0-27"></a>
|
|
18525
|
+
<a id="__codelineno-0-28" name="__codelineno-0-28"></a><span class="sd"> DO NOT USE THIS IN PRODUCTION NAUTOBOT CODE.</span>
|
|
18526
|
+
<a id="__codelineno-0-29" name="__codelineno-0-29"></a><span class="sd"> """</span>
|
|
18527
|
+
<a id="__codelineno-0-30" name="__codelineno-0-30"></a>
|
|
18528
|
+
<a id="__codelineno-0-31" name="__codelineno-0-31"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
18529
|
+
<a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18530
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="sd"> Default the SERVER_NAME to "nautobot.example.com" rather than Django's default "testserver".</span>
|
|
18531
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a>
|
|
18532
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd"> This matches the ALLOWED_HOSTS set in nautobot/core/tests/nautobot_config.py and</span>
|
|
18533
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> helps to protect us against issues like https://github.com/nautobot/nautobot/issues/3065.</span>
|
|
18534
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> """</span>
|
|
18535
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"SERVER_NAME"</span><span class="p">,</span> <span class="s2">"nautobot.example.com"</span><span class="p">)</span>
|
|
18536
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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>
|
|
18476
18537
|
</code></pre></div></td></tr></table></div>
|
|
18477
18538
|
</details>
|
|
18478
18539
|
|
|
@@ -18507,23 +18568,23 @@ helps to protect us against issues like https://github.com/nautobot/nautobot/iss
|
|
|
18507
18568
|
|
|
18508
18569
|
<details class="quote">
|
|
18509
18570
|
<summary>Source code in <code>nautobot/core/testing/mixins.py</code></summary>
|
|
18510
|
-
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-
|
|
18511
|
-
<span class="normal"><a href="#__codelineno-0-31">31</a></span>
|
|
18571
|
+
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-31">31</a></span>
|
|
18512
18572
|
<span class="normal"><a href="#__codelineno-0-32">32</a></span>
|
|
18513
18573
|
<span class="normal"><a href="#__codelineno-0-33">33</a></span>
|
|
18514
18574
|
<span class="normal"><a href="#__codelineno-0-34">34</a></span>
|
|
18515
18575
|
<span class="normal"><a href="#__codelineno-0-35">35</a></span>
|
|
18516
18576
|
<span class="normal"><a href="#__codelineno-0-36">36</a></span>
|
|
18517
18577
|
<span class="normal"><a href="#__codelineno-0-37">37</a></span>
|
|
18518
|
-
<span class="normal"><a href="#__codelineno-0-38">38</a></span
|
|
18519
|
-
<a id="__codelineno-0-31" name="__codelineno-0-31"></a><span class="
|
|
18520
|
-
<a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="
|
|
18521
|
-
<a id="__codelineno-0-33" name="__codelineno-0-33"></a>
|
|
18522
|
-
<a id="__codelineno-0-34" name="__codelineno-0-34"></a
|
|
18523
|
-
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd">
|
|
18524
|
-
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd">
|
|
18525
|
-
<a id="__codelineno-0-37" name="__codelineno-0-37"></a
|
|
18526
|
-
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="
|
|
18578
|
+
<span class="normal"><a href="#__codelineno-0-38">38</a></span>
|
|
18579
|
+
<span class="normal"><a href="#__codelineno-0-39">39</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-31" name="__codelineno-0-31"></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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
18580
|
+
<a id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="w"> </span><span class="sd">"""</span>
|
|
18581
|
+
<a id="__codelineno-0-33" name="__codelineno-0-33"></a><span class="sd"> Default the SERVER_NAME to "nautobot.example.com" rather than Django's default "testserver".</span>
|
|
18582
|
+
<a id="__codelineno-0-34" name="__codelineno-0-34"></a>
|
|
18583
|
+
<a id="__codelineno-0-35" name="__codelineno-0-35"></a><span class="sd"> This matches the ALLOWED_HOSTS set in nautobot/core/tests/nautobot_config.py and</span>
|
|
18584
|
+
<a id="__codelineno-0-36" name="__codelineno-0-36"></a><span class="sd"> helps to protect us against issues like https://github.com/nautobot/nautobot/issues/3065.</span>
|
|
18585
|
+
<a id="__codelineno-0-37" name="__codelineno-0-37"></a><span class="sd"> """</span>
|
|
18586
|
+
<a id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">"SERVER_NAME"</span><span class="p">,</span> <span class="s2">"nautobot.example.com"</span><span class="p">)</span>
|
|
18587
|
+
<a id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</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>
|
|
18527
18588
|
</code></pre></div></td></tr></table></div>
|
|
18528
18589
|
</details>
|
|
18529
18590
|
</div>
|