nautobot 2.3.9__py3-none-any.whl → 2.3.10__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/core/models/query_functions.py +147 -1
- nautobot/core/tests/test_models_query_functions.py +108 -0
- nautobot/dcim/templates/dcim/modulebay_create.html +39 -0
- nautobot/dcim/templates/dcim/modulebay_update.html +39 -0
- nautobot/dcim/views.py +1 -1
- nautobot/extras/api/customfields.py +3 -10
- nautobot/extras/context_managers.py +23 -3
- nautobot/extras/jobs.py +20 -14
- nautobot/extras/models/customfields.py +12 -0
- nautobot/extras/signals.py +2 -0
- nautobot/extras/tasks.py +88 -69
- nautobot/extras/tests/test_context_managers.py +9 -4
- nautobot/extras/tests/test_webhooks.py +1 -1
- nautobot/extras/webhooks.py +16 -7
- nautobot/project-static/docs/404.html +1 -1
- nautobot/project-static/docs/apps/index.html +1 -1
- nautobot/project-static/docs/apps/nautobot-apps.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +62 -5
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1 -1
- nautobot/project-static/docs/development/apps/api/configuration-view.html +1 -1
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +1 -1
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +1 -1
- nautobot/project-static/docs/development/apps/api/models/global-search.html +1 -1
- nautobot/project-static/docs/development/apps/api/models/graphql.html +1 -1
- nautobot/project-static/docs/development/apps/api/models/index.html +1 -1
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +1 -1
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +1 -1
- nautobot/project-static/docs/development/apps/api/prometheus.html +1 -1
- nautobot/project-static/docs/development/apps/api/setup.html +1 -1
- nautobot/project-static/docs/development/apps/api/testing.html +1 -1
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +1 -1
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +1 -1
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +1 -1
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +1 -1
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/base-template.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/index.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/notes.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +1 -1
- nautobot/project-static/docs/development/apps/api/views/urls.html +1 -1
- nautobot/project-static/docs/development/apps/index.html +1 -1
- nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -1
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -1
- nautobot/project-static/docs/development/apps/migration/from-v1.html +1 -1
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +1 -1
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +1 -1
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +1 -1
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +1 -1
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +1 -1
- nautobot/project-static/docs/development/core/application-registry.html +1 -1
- nautobot/project-static/docs/development/core/best-practices.html +1 -1
- nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -1
- nautobot/project-static/docs/development/core/caching.html +1 -1
- nautobot/project-static/docs/development/core/controllers.html +1 -1
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +1 -1
- nautobot/project-static/docs/development/core/generic-views.html +1 -1
- nautobot/project-static/docs/development/core/getting-started.html +1 -1
- nautobot/project-static/docs/development/core/homepage.html +1 -1
- nautobot/project-static/docs/development/core/index.html +1 -1
- nautobot/project-static/docs/development/core/model-checklist.html +1 -1
- nautobot/project-static/docs/development/core/model-features.html +1 -1
- nautobot/project-static/docs/development/core/natural-keys.html +1 -1
- nautobot/project-static/docs/development/core/navigation-menu.html +1 -1
- nautobot/project-static/docs/development/core/release-checklist.html +1 -1
- nautobot/project-static/docs/development/core/role-internals.html +1 -1
- nautobot/project-static/docs/development/core/settings.html +1 -1
- nautobot/project-static/docs/development/core/style-guide.html +1 -1
- nautobot/project-static/docs/development/core/templates.html +1 -1
- nautobot/project-static/docs/development/core/testing.html +1 -1
- nautobot/project-static/docs/development/core/user-preferences.html +1 -1
- nautobot/project-static/docs/development/index.html +1 -1
- nautobot/project-static/docs/development/jobs/index.html +1 -1
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +1 -1
- nautobot/project-static/docs/index.html +1 -1
- nautobot/project-static/docs/overview/application_stack.html +1 -1
- nautobot/project-static/docs/overview/design_philosophy.html +1 -1
- nautobot/project-static/docs/release-notes/index.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.0.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.1.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.2.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.3.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.4.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.5.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.6.html +1 -1
- nautobot/project-static/docs/release-notes/version-2.0.html +1 -1
- nautobot/project-static/docs/release-notes/version-2.1.html +1 -1
- nautobot/project-static/docs/release-notes/version-2.2.html +1 -1
- nautobot/project-static/docs/release-notes/version-2.3.html +268 -123
- nautobot/project-static/docs/requirements.txt +1 -1
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +270 -270
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/index.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -1
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +1 -1
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +1 -1
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +1 -1
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +1 -1
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +1 -1
- nautobot/project-static/docs/user-guide/index.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +1 -1
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +1 -1
- nautobot/project-static/js/forms.js +0 -38
- {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/METADATA +2 -2
- {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/RECORD +296 -293
- {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/NOTICE +0 -0
- {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/WHEEL +0 -0
- {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/entry_points.txt +0 -0
nautobot/extras/tasks.py
CHANGED
|
@@ -2,18 +2,42 @@ from logging import getLogger
|
|
|
2
2
|
|
|
3
3
|
from django.conf import settings
|
|
4
4
|
from django.contrib.contenttypes.models import ContentType
|
|
5
|
-
from django.db import transaction
|
|
6
5
|
from jinja2.exceptions import TemplateError
|
|
7
6
|
import requests
|
|
8
7
|
|
|
9
8
|
from nautobot.core.celery import nautobot_task
|
|
9
|
+
from nautobot.core.models.query_functions import JSONRemove, JSONSet
|
|
10
10
|
from nautobot.extras.choices import CustomFieldTypeChoices, ObjectChangeActionChoices
|
|
11
11
|
from nautobot.extras.utils import generate_signature
|
|
12
12
|
|
|
13
13
|
logger = getLogger("nautobot.extras.tasks")
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
def _generate_bulk_object_changes(context, queryset, task_logger):
|
|
17
|
+
# Circular import
|
|
18
|
+
from nautobot.extras.context_managers import (
|
|
19
|
+
change_logging,
|
|
20
|
+
ChangeContext,
|
|
21
|
+
deferred_change_logging_for_bulk_operation,
|
|
22
|
+
)
|
|
23
|
+
from nautobot.extras.signals import _handle_changed_object
|
|
24
|
+
|
|
25
|
+
task_logger.info("Creating deferred ObjectChange records for bulk operation...")
|
|
26
|
+
|
|
27
|
+
# Note: we use change_logging() here instead of web_request_context() because we don't want these change records to
|
|
28
|
+
# trigger jobhooks and webhooks.
|
|
29
|
+
# TODO: this could be made much faster if we ensure the queryset has appropriate select_related/prefetch_related?
|
|
30
|
+
change_context = ChangeContext(**context)
|
|
31
|
+
i = 0
|
|
32
|
+
with change_logging(change_context):
|
|
33
|
+
with deferred_change_logging_for_bulk_operation():
|
|
34
|
+
for i, instance in enumerate(queryset.iterator(), start=1):
|
|
35
|
+
_handle_changed_object(queryset.model, instance, created=False)
|
|
36
|
+
|
|
37
|
+
task_logger.info("Created %d ObjectChange records", i)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@nautobot_task(soft_time_limit=1800, time_limit=2000)
|
|
17
41
|
def update_custom_field_choice_data(field_id, old_value, new_value, change_context=None):
|
|
18
42
|
"""
|
|
19
43
|
Update the values for a custom field choice used in objects' _custom_field_data for the given field.
|
|
@@ -22,47 +46,48 @@ def update_custom_field_choice_data(field_id, old_value, new_value, change_conte
|
|
|
22
46
|
field_id (uuid4): The PK of the custom field to which this choice value relates
|
|
23
47
|
old_value (str): The existing value of the choice
|
|
24
48
|
new_value (str): The value which will be used as replacement
|
|
49
|
+
change_context (dict): Optional dict representation of change context for ObjectChange creation
|
|
25
50
|
"""
|
|
26
51
|
# Circular Import
|
|
27
52
|
from nautobot.extras.context_managers import web_request_context
|
|
28
53
|
from nautobot.extras.models import CustomField
|
|
29
54
|
|
|
55
|
+
task_logger = getLogger("celery.task.update_custom_field_choice_data")
|
|
56
|
+
|
|
30
57
|
try:
|
|
31
58
|
field = CustomField.objects.get(pk=field_id)
|
|
32
59
|
except CustomField.DoesNotExist:
|
|
33
|
-
|
|
34
|
-
|
|
60
|
+
task_logger.error("Custom field with ID %s not found, failing to act on choice data.", field_id)
|
|
61
|
+
raise
|
|
35
62
|
|
|
36
63
|
if field.type == CustomFieldTypeChoices.TYPE_SELECT:
|
|
37
64
|
# Loop through all field content types and search for values to update
|
|
38
65
|
for ct in field.content_types.all():
|
|
39
66
|
model = ct.model_class()
|
|
67
|
+
queryset = model.objects.filter(**{f"_custom_field_data__{field.key}": old_value})
|
|
40
68
|
if change_context is not None:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
69
|
+
pk_list = list(queryset.values_list("pk", flat=True))
|
|
70
|
+
task_logger.info(
|
|
71
|
+
"Updating selection for custom field `%s` from `%s` to `%s` on %s records...",
|
|
72
|
+
field.key,
|
|
73
|
+
old_value,
|
|
74
|
+
new_value,
|
|
75
|
+
ct.model,
|
|
76
|
+
extra={"object": field},
|
|
77
|
+
)
|
|
78
|
+
count = queryset.update(_custom_field_data=JSONSet("_custom_field_data", field.key, new_value))
|
|
79
|
+
task_logger.info("Updated %d records", count)
|
|
80
|
+
if change_context is not None:
|
|
81
|
+
# Since we used update() above, we bypassed ObjectChange automatic creation via signals. Create them now
|
|
82
|
+
_generate_bulk_object_changes(change_context, model.objects.filter(pk__in=pk_list), task_logger)
|
|
54
83
|
|
|
55
84
|
elif field.type == CustomFieldTypeChoices.TYPE_MULTISELECT:
|
|
56
85
|
# Loop through all field content types and search for values to update
|
|
86
|
+
# TODO: can we implement a bulk operator for this?
|
|
57
87
|
for ct in field.content_types.all():
|
|
58
88
|
model = ct.model_class()
|
|
59
89
|
if change_context is not None:
|
|
60
|
-
with web_request_context(
|
|
61
|
-
user=change_context.get("user"),
|
|
62
|
-
change_id=change_context.get("change_id"),
|
|
63
|
-
context_detail=change_context.get("context_detail"),
|
|
64
|
-
context=change_context.get("context"),
|
|
65
|
-
):
|
|
90
|
+
with web_request_context(**change_context):
|
|
66
91
|
for obj in model.objects.filter(**{f"_custom_field_data__{field.key}__contains": old_value}):
|
|
67
92
|
old_list = obj._custom_field_data[field.key]
|
|
68
93
|
new_list = [new_value if e == old_value else e for e in old_list]
|
|
@@ -76,13 +101,13 @@ def update_custom_field_choice_data(field_id, old_value, new_value, change_conte
|
|
|
76
101
|
obj.save()
|
|
77
102
|
|
|
78
103
|
else:
|
|
79
|
-
|
|
80
|
-
|
|
104
|
+
task_logger.error(f"Unknown field type, failing to act on choice data for this field {field.key}.")
|
|
105
|
+
raise ValueError
|
|
81
106
|
|
|
82
107
|
return True
|
|
83
108
|
|
|
84
109
|
|
|
85
|
-
@nautobot_task
|
|
110
|
+
@nautobot_task(soft_time_limit=1800, time_limit=2000)
|
|
86
111
|
def delete_custom_field_data(field_key, content_type_pk_set, change_context=None):
|
|
87
112
|
"""
|
|
88
113
|
Delete the values for a custom field
|
|
@@ -90,30 +115,23 @@ def delete_custom_field_data(field_key, content_type_pk_set, change_context=None
|
|
|
90
115
|
Args:
|
|
91
116
|
field_key (str): The key of the custom field which is being deleted
|
|
92
117
|
content_type_pk_set (list): List of PKs for content types to act upon
|
|
118
|
+
change_context (dict): Optional change context for ObjectChange creation
|
|
93
119
|
"""
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
obj.save()
|
|
110
|
-
else:
|
|
111
|
-
for obj in model.objects.filter(**{f"_custom_field_data__{field_key}__isnull": False}):
|
|
112
|
-
del obj._custom_field_data[field_key]
|
|
113
|
-
obj.save()
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
@nautobot_task
|
|
120
|
+
task_logger = getLogger("celery.task.delete_custom_field_data")
|
|
121
|
+
for ct in ContentType.objects.filter(pk__in=content_type_pk_set):
|
|
122
|
+
model = ct.model_class()
|
|
123
|
+
queryset = model.objects.filter(**{f"_custom_field_data__{field_key}__isnull": False})
|
|
124
|
+
if change_context is not None:
|
|
125
|
+
pk_list = list(queryset.values_list("pk", flat=True))
|
|
126
|
+
task_logger.info("Deleting existing values for custom field `%s` from %s records...", field_key, ct.model)
|
|
127
|
+
count = queryset.update(_custom_field_data=JSONRemove("_custom_field_data", field_key))
|
|
128
|
+
task_logger.info("Updated %d records", count)
|
|
129
|
+
if change_context is not None:
|
|
130
|
+
# Since we used update() above, we bypassed ObjectChange automatic creation via signals. Create them now
|
|
131
|
+
_generate_bulk_object_changes(change_context, model.objects.filter(pk__in=pk_list), task_logger)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@nautobot_task(soft_time_limit=1800, time_limit=2000)
|
|
117
135
|
def provision_field(field_id, content_type_pk_set, change_context=None):
|
|
118
136
|
"""
|
|
119
137
|
Provision a new custom field on all relevant content type object instances.
|
|
@@ -121,34 +139,35 @@ def provision_field(field_id, content_type_pk_set, change_context=None):
|
|
|
121
139
|
Args:
|
|
122
140
|
field_id (uuid4): The PK of the custom field being provisioned
|
|
123
141
|
content_type_pk_set (list): List of PKs for content types to act upon
|
|
142
|
+
change_context (dict): Optional change context for ObjectChange creation.
|
|
124
143
|
"""
|
|
125
144
|
# Circular Import
|
|
126
|
-
from nautobot.extras.context_managers import web_request_context
|
|
127
145
|
from nautobot.extras.models import CustomField
|
|
128
146
|
|
|
147
|
+
task_logger = getLogger("celery.task.provision_field")
|
|
148
|
+
|
|
129
149
|
try:
|
|
130
150
|
field = CustomField.objects.get(pk=field_id)
|
|
131
151
|
except CustomField.DoesNotExist:
|
|
132
|
-
|
|
133
|
-
|
|
152
|
+
task_logger.error(f"Custom field with ID {field_id} not found, failing to provision.")
|
|
153
|
+
raise
|
|
134
154
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
obj.save()
|
|
155
|
+
for ct in ContentType.objects.filter(pk__in=content_type_pk_set):
|
|
156
|
+
model = ct.model_class()
|
|
157
|
+
queryset = model.objects.filter(**{f"_custom_field_data__{field.key}__isnull": True})
|
|
158
|
+
if change_context is not None:
|
|
159
|
+
pk_list = list(queryset.values_list("pk", flat=True))
|
|
160
|
+
task_logger.info(
|
|
161
|
+
"Adding data for custom field `%s` to %s records...",
|
|
162
|
+
field.key,
|
|
163
|
+
ct.model,
|
|
164
|
+
extra={"object": field},
|
|
165
|
+
)
|
|
166
|
+
count = queryset.update(_custom_field_data=JSONSet("_custom_field_data", field.key, field.default))
|
|
167
|
+
task_logger.info("Updated %d records.", count)
|
|
168
|
+
if change_context is not None:
|
|
169
|
+
# Since we used update() above, we bypassed ObjectChange automatic creation via signals. Create them now
|
|
170
|
+
_generate_bulk_object_changes(change_context, model.objects.filter(pk__in=pk_list), task_logger)
|
|
152
171
|
|
|
153
172
|
return True
|
|
154
173
|
|
|
@@ -74,8 +74,8 @@ class WebRequestContextTestCase(TestCase):
|
|
|
74
74
|
self.assertEqual(oc_list[0].changed_object, location)
|
|
75
75
|
self.assertEqual(oc_list[0].action, ObjectChangeActionChoices.ACTION_CREATE)
|
|
76
76
|
|
|
77
|
-
@mock.patch("nautobot.extras.jobs.enqueue_job_hooks", return_value=True)
|
|
78
|
-
@mock.patch("nautobot.extras.context_managers.enqueue_webhooks")
|
|
77
|
+
@mock.patch("nautobot.extras.jobs.enqueue_job_hooks", return_value=(True, None))
|
|
78
|
+
@mock.patch("nautobot.extras.context_managers.enqueue_webhooks", return_value=None)
|
|
79
79
|
def test_create_then_delete(self, mock_enqueue_webhooks, mock_enqueue_job_hooks):
|
|
80
80
|
"""Test that a create followed by a delete is logged as two changes"""
|
|
81
81
|
location_type = LocationType.objects.get(name="Campus")
|
|
@@ -93,9 +93,14 @@ class WebRequestContextTestCase(TestCase):
|
|
|
93
93
|
self.assertEqual(oc_list[0].action, ObjectChangeActionChoices.ACTION_CREATE)
|
|
94
94
|
self.assertEqual(oc_list[1].action, ObjectChangeActionChoices.ACTION_DELETE)
|
|
95
95
|
mock_enqueue_job_hooks.assert_has_calls(
|
|
96
|
-
[
|
|
96
|
+
[
|
|
97
|
+
mock.call(oc_list[0], may_reload_jobs=True, jobhook_queryset=None),
|
|
98
|
+
mock.call(oc_list[1], may_reload_jobs=False, jobhook_queryset=None),
|
|
99
|
+
],
|
|
100
|
+
)
|
|
101
|
+
mock_enqueue_webhooks.assert_has_calls(
|
|
102
|
+
[mock.call(oc_list[0], webhook_queryset=None), mock.call(oc_list[1], webhook_queryset=None)]
|
|
97
103
|
)
|
|
98
|
-
mock_enqueue_webhooks.assert_has_calls([mock.call(oc_list[0]), mock.call(oc_list[1])])
|
|
99
104
|
|
|
100
105
|
def test_update_then_delete(self):
|
|
101
106
|
"""Test that an update followed by a delete is logged as a single delete"""
|
|
@@ -345,7 +345,7 @@ class WebhookTest(APITestCase):
|
|
|
345
345
|
|
|
346
346
|
all_changes = get_changes_for_model(location)
|
|
347
347
|
self.assertEqual(all_changes.count(), 1)
|
|
348
|
-
mock_enqueue_webhooks.assert_called_once_with(all_changes.first())
|
|
348
|
+
mock_enqueue_webhooks.assert_called_once_with(all_changes.first(), webhook_queryset=None)
|
|
349
349
|
|
|
350
350
|
def test_all_webhook_supported_models(self):
|
|
351
351
|
"""
|
nautobot/extras/webhooks.py
CHANGED
|
@@ -6,16 +6,22 @@ from nautobot.extras.registry import registry
|
|
|
6
6
|
from nautobot.extras.tasks import process_webhook
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def enqueue_webhooks(object_change):
|
|
9
|
+
def enqueue_webhooks(object_change, webhook_queryset=None):
|
|
10
10
|
"""
|
|
11
|
-
Find Webhook(s) assigned to this instance + action and enqueue them
|
|
12
|
-
|
|
11
|
+
Find Webhook(s) assigned to this instance + action and enqueue them to be processed.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
object_change (ObjectChange): The change that may trigger Webhooks to be sent.
|
|
15
|
+
webhook_queryset (QuerySet): Previously retrieved set of Webhooks to potentially send.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
webhook_queryset (QuerySet): for reuse when processing multiple ObjectChange with the same content-type+action.
|
|
13
19
|
"""
|
|
14
20
|
# Determine whether this type of object supports webhooks
|
|
15
21
|
app_label = object_change.changed_object_type.app_label
|
|
16
22
|
model_name = object_change.changed_object_type.model
|
|
17
23
|
if model_name not in registry["model_features"]["webhooks"].get(app_label, []):
|
|
18
|
-
return
|
|
24
|
+
return webhook_queryset
|
|
19
25
|
|
|
20
26
|
# Retrieve any applicable Webhooks
|
|
21
27
|
content_type = object_change.changed_object_type
|
|
@@ -24,16 +30,17 @@ def enqueue_webhooks(object_change):
|
|
|
24
30
|
ObjectChangeActionChoices.ACTION_UPDATE: "type_update",
|
|
25
31
|
ObjectChangeActionChoices.ACTION_DELETE: "type_delete",
|
|
26
32
|
}[object_change.action]
|
|
27
|
-
|
|
33
|
+
if webhook_queryset is None:
|
|
34
|
+
webhook_queryset = Webhook.objects.filter(content_types=content_type, enabled=True, **{action_flag: True})
|
|
28
35
|
|
|
29
|
-
if
|
|
36
|
+
if webhook_queryset: # not .exists() as we *want* to populate the queryset cache
|
|
30
37
|
# fall back to object_data if object_data_v2 is not available
|
|
31
38
|
serialized_data = object_change.object_data_v2
|
|
32
39
|
if serialized_data is None:
|
|
33
40
|
serialized_data = object_change.object_data
|
|
34
41
|
|
|
35
42
|
# Enqueue the webhooks
|
|
36
|
-
for webhook in
|
|
43
|
+
for webhook in webhook_queryset:
|
|
37
44
|
args = [
|
|
38
45
|
webhook.pk,
|
|
39
46
|
serialized_data,
|
|
@@ -45,3 +52,5 @@ def enqueue_webhooks(object_change):
|
|
|
45
52
|
object_change.get_snapshots(),
|
|
46
53
|
]
|
|
47
54
|
process_webhook.apply_async(args=args)
|
|
55
|
+
|
|
56
|
+
return webhook_queryset
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
<link rel="icon" href="../../../assets/favicon.ico">
|
|
21
|
-
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.
|
|
21
|
+
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
|
|
@@ -11922,7 +11922,7 @@ an actual instance of the class.</p>
|
|
|
11922
11922
|
|
|
11923
11923
|
|
|
11924
11924
|
<h2 id="nautobot.apps.jobs.enqueue_job_hooks" class="doc doc-heading">
|
|
11925
|
-
<code class="highlight language-python"><span class="n">nautobot</span><span class="o">.</span><span class="n">apps</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">enqueue_job_hooks</span><span class="p">(</span><span class="n">object_change</span><span class="p">,</span> <span class="n">may_reload_jobs</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></code>
|
|
11925
|
+
<code class="highlight language-python"><span class="n">nautobot</span><span class="o">.</span><span class="n">apps</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">enqueue_job_hooks</span><span class="p">(</span><span class="n">object_change</span><span class="p">,</span> <span class="n">may_reload_jobs</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">jobhook_queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
|
|
11926
11926
|
|
|
11927
11927
|
<a href="#nautobot.apps.jobs.enqueue_job_hooks" class="headerlink" title="Permanent link">¶</a></h2>
|
|
11928
11928
|
|
|
@@ -11932,6 +11932,63 @@ an actual instance of the class.</p>
|
|
|
11932
11932
|
<p>Find job hook(s) assigned to this changed object type + action and enqueue them to be processed.</p>
|
|
11933
11933
|
|
|
11934
11934
|
|
|
11935
|
+
<p><span class="doc-section-title">Parameters:</span></p>
|
|
11936
|
+
<table>
|
|
11937
|
+
<thead>
|
|
11938
|
+
<tr>
|
|
11939
|
+
<th>Name</th>
|
|
11940
|
+
<th>Type</th>
|
|
11941
|
+
<th>Description</th>
|
|
11942
|
+
<th>Default</th>
|
|
11943
|
+
</tr>
|
|
11944
|
+
</thead>
|
|
11945
|
+
<tbody>
|
|
11946
|
+
<tr class="doc-section-item">
|
|
11947
|
+
<td><code>object_change</code></td>
|
|
11948
|
+
<td>
|
|
11949
|
+
<code><autoref identifier="nautobot.extras.models.ObjectChange" optional hover>ObjectChange</autoref></code>
|
|
11950
|
+
</td>
|
|
11951
|
+
<td>
|
|
11952
|
+
<div class="doc-md-description">
|
|
11953
|
+
<p>The change that may trigger JobHooks to execute.</p>
|
|
11954
|
+
</div>
|
|
11955
|
+
</td>
|
|
11956
|
+
<td>
|
|
11957
|
+
<em>required</em>
|
|
11958
|
+
</td>
|
|
11959
|
+
</tr>
|
|
11960
|
+
<tr class="doc-section-item">
|
|
11961
|
+
<td><code>may_reload_jobs</code></td>
|
|
11962
|
+
<td>
|
|
11963
|
+
<code><autoref identifier="bool" optional>bool</autoref></code>
|
|
11964
|
+
</td>
|
|
11965
|
+
<td>
|
|
11966
|
+
<div class="doc-md-description">
|
|
11967
|
+
<p>Whether to reload JobHook source code from disk to guarantee up-to-date code.</p>
|
|
11968
|
+
</div>
|
|
11969
|
+
</td>
|
|
11970
|
+
<td>
|
|
11971
|
+
<code>True</code>
|
|
11972
|
+
</td>
|
|
11973
|
+
</tr>
|
|
11974
|
+
<tr class="doc-section-item">
|
|
11975
|
+
<td><code>jobhook_queryset</code></td>
|
|
11976
|
+
<td>
|
|
11977
|
+
<code><autoref identifier="django.db.models.query.QuerySet" optional hover>QuerySet</autoref></code>
|
|
11978
|
+
</td>
|
|
11979
|
+
<td>
|
|
11980
|
+
<div class="doc-md-description">
|
|
11981
|
+
<p>Previously retrieved set of JobHooks to potentially enqueue</p>
|
|
11982
|
+
</div>
|
|
11983
|
+
</td>
|
|
11984
|
+
<td>
|
|
11985
|
+
<code>None</code>
|
|
11986
|
+
</td>
|
|
11987
|
+
</tr>
|
|
11988
|
+
</tbody>
|
|
11989
|
+
</table>
|
|
11990
|
+
|
|
11991
|
+
|
|
11935
11992
|
<p><span class="doc-section-title">Returns:</span></p>
|
|
11936
11993
|
<table>
|
|
11937
11994
|
<thead>
|
|
@@ -11942,12 +11999,12 @@ an actual instance of the class.</p>
|
|
|
11942
11999
|
</thead>
|
|
11943
12000
|
<tbody>
|
|
11944
12001
|
<tr class="doc-section-item">
|
|
11945
|
-
<td><code>
|
|
11946
|
-
<code><autoref identifier="bool" optional>bool</autoref
|
|
12002
|
+
<td><code>result</code></td> <td>
|
|
12003
|
+
<code><autoref identifier="tuple" optional>tuple</autoref>[<autoref identifier="bool" optional>bool</autoref>, <autoref identifier="django.db.models.query.QuerySet" optional hover>QuerySet</autoref>]</code>
|
|
11947
12004
|
</td>
|
|
11948
12005
|
<td>
|
|
11949
12006
|
<div class="doc-md-description">
|
|
11950
|
-
<p>whether Jobs were reloaded
|
|
12007
|
+
<p>whether Jobs were reloaded here, and the jobhooks that were considered</p>
|
|
11951
12008
|
</div>
|
|
11952
12009
|
</td>
|
|
11953
12010
|
</tr>
|