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.

Files changed (296) hide show
  1. nautobot/core/models/query_functions.py +147 -1
  2. nautobot/core/tests/test_models_query_functions.py +108 -0
  3. nautobot/dcim/templates/dcim/modulebay_create.html +39 -0
  4. nautobot/dcim/templates/dcim/modulebay_update.html +39 -0
  5. nautobot/dcim/views.py +1 -1
  6. nautobot/extras/api/customfields.py +3 -10
  7. nautobot/extras/context_managers.py +23 -3
  8. nautobot/extras/jobs.py +20 -14
  9. nautobot/extras/models/customfields.py +12 -0
  10. nautobot/extras/signals.py +2 -0
  11. nautobot/extras/tasks.py +88 -69
  12. nautobot/extras/tests/test_context_managers.py +9 -4
  13. nautobot/extras/tests/test_webhooks.py +1 -1
  14. nautobot/extras/webhooks.py +16 -7
  15. nautobot/project-static/docs/404.html +1 -1
  16. nautobot/project-static/docs/apps/index.html +1 -1
  17. nautobot/project-static/docs/apps/nautobot-apps.html +1 -1
  18. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +1 -1
  19. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +1 -1
  20. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1 -1
  21. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +1 -1
  22. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +1 -1
  23. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1 -1
  24. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +1 -1
  25. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1 -1
  26. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +1 -1
  27. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1 -1
  28. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1 -1
  29. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1 -1
  30. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1 -1
  31. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +62 -5
  32. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1 -1
  33. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +1 -1
  34. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1 -1
  35. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1 -1
  36. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1 -1
  37. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1 -1
  38. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1 -1
  39. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1 -1
  40. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1 -1
  41. nautobot/project-static/docs/development/apps/api/configuration-view.html +1 -1
  42. nautobot/project-static/docs/development/apps/api/database-backend-config.html +1 -1
  43. nautobot/project-static/docs/development/apps/api/models/django-admin.html +1 -1
  44. nautobot/project-static/docs/development/apps/api/models/global-search.html +1 -1
  45. nautobot/project-static/docs/development/apps/api/models/graphql.html +1 -1
  46. nautobot/project-static/docs/development/apps/api/models/index.html +1 -1
  47. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -1
  48. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +1 -1
  49. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +1 -1
  50. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +1 -1
  51. nautobot/project-static/docs/development/apps/api/platform-features/index.html +1 -1
  52. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +1 -1
  53. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +1 -1
  54. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +1 -1
  55. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +1 -1
  56. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +1 -1
  57. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +1 -1
  58. nautobot/project-static/docs/development/apps/api/prometheus.html +1 -1
  59. nautobot/project-static/docs/development/apps/api/setup.html +1 -1
  60. nautobot/project-static/docs/development/apps/api/testing.html +1 -1
  61. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +1 -1
  62. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +1 -1
  63. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +1 -1
  64. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +1 -1
  65. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +1 -1
  66. nautobot/project-static/docs/development/apps/api/views/base-template.html +1 -1
  67. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +1 -1
  68. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +1 -1
  69. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +1 -1
  70. nautobot/project-static/docs/development/apps/api/views/index.html +1 -1
  71. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -1
  72. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +1 -1
  73. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +1 -1
  74. nautobot/project-static/docs/development/apps/api/views/notes.html +1 -1
  75. nautobot/project-static/docs/development/apps/api/views/rest-api.html +1 -1
  76. nautobot/project-static/docs/development/apps/api/views/urls.html +1 -1
  77. nautobot/project-static/docs/development/apps/index.html +1 -1
  78. nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -1
  79. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -1
  80. nautobot/project-static/docs/development/apps/migration/from-v1.html +1 -1
  81. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +1 -1
  82. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +1 -1
  83. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +1 -1
  84. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +1 -1
  85. nautobot/project-static/docs/development/apps/porting-from-netbox.html +1 -1
  86. nautobot/project-static/docs/development/core/application-registry.html +1 -1
  87. nautobot/project-static/docs/development/core/best-practices.html +1 -1
  88. nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -1
  89. nautobot/project-static/docs/development/core/caching.html +1 -1
  90. nautobot/project-static/docs/development/core/controllers.html +1 -1
  91. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +1 -1
  92. nautobot/project-static/docs/development/core/generic-views.html +1 -1
  93. nautobot/project-static/docs/development/core/getting-started.html +1 -1
  94. nautobot/project-static/docs/development/core/homepage.html +1 -1
  95. nautobot/project-static/docs/development/core/index.html +1 -1
  96. nautobot/project-static/docs/development/core/model-checklist.html +1 -1
  97. nautobot/project-static/docs/development/core/model-features.html +1 -1
  98. nautobot/project-static/docs/development/core/natural-keys.html +1 -1
  99. nautobot/project-static/docs/development/core/navigation-menu.html +1 -1
  100. nautobot/project-static/docs/development/core/release-checklist.html +1 -1
  101. nautobot/project-static/docs/development/core/role-internals.html +1 -1
  102. nautobot/project-static/docs/development/core/settings.html +1 -1
  103. nautobot/project-static/docs/development/core/style-guide.html +1 -1
  104. nautobot/project-static/docs/development/core/templates.html +1 -1
  105. nautobot/project-static/docs/development/core/testing.html +1 -1
  106. nautobot/project-static/docs/development/core/user-preferences.html +1 -1
  107. nautobot/project-static/docs/development/index.html +1 -1
  108. nautobot/project-static/docs/development/jobs/index.html +1 -1
  109. nautobot/project-static/docs/development/jobs/migration/from-v1.html +1 -1
  110. nautobot/project-static/docs/index.html +1 -1
  111. nautobot/project-static/docs/overview/application_stack.html +1 -1
  112. nautobot/project-static/docs/overview/design_philosophy.html +1 -1
  113. nautobot/project-static/docs/release-notes/index.html +1 -1
  114. nautobot/project-static/docs/release-notes/version-1.0.html +1 -1
  115. nautobot/project-static/docs/release-notes/version-1.1.html +1 -1
  116. nautobot/project-static/docs/release-notes/version-1.2.html +1 -1
  117. nautobot/project-static/docs/release-notes/version-1.3.html +1 -1
  118. nautobot/project-static/docs/release-notes/version-1.4.html +1 -1
  119. nautobot/project-static/docs/release-notes/version-1.5.html +1 -1
  120. nautobot/project-static/docs/release-notes/version-1.6.html +1 -1
  121. nautobot/project-static/docs/release-notes/version-2.0.html +1 -1
  122. nautobot/project-static/docs/release-notes/version-2.1.html +1 -1
  123. nautobot/project-static/docs/release-notes/version-2.2.html +1 -1
  124. nautobot/project-static/docs/release-notes/version-2.3.html +268 -123
  125. nautobot/project-static/docs/requirements.txt +1 -1
  126. nautobot/project-static/docs/search/search_index.json +1 -1
  127. nautobot/project-static/docs/sitemap.xml +270 -270
  128. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  129. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +1 -1
  130. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +1 -1
  131. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +1 -1
  132. nautobot/project-static/docs/user-guide/administration/configuration/index.html +1 -1
  133. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +1 -1
  134. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +1 -1
  135. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +1 -1
  136. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +1 -1
  137. nautobot/project-static/docs/user-guide/administration/guides/docker.html +1 -1
  138. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +1 -1
  139. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +1 -1
  140. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +1 -1
  141. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +1 -1
  142. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +1 -1
  143. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +1 -1
  144. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +1 -1
  145. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -1
  146. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +1 -1
  147. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +1 -1
  148. nautobot/project-static/docs/user-guide/administration/installation/index.html +1 -1
  149. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +1 -1
  150. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +1 -1
  151. nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -1
  152. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +1 -1
  153. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +1 -1
  154. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +1 -1
  155. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -1
  156. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +1 -1
  157. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +1 -1
  158. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +1 -1
  159. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +1 -1
  160. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +1 -1
  161. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +1 -1
  162. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +1 -1
  163. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -1
  164. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +1 -1
  165. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +1 -1
  166. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +1 -1
  167. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +1 -1
  168. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +1 -1
  169. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +1 -1
  170. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +1 -1
  171. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +1 -1
  172. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +1 -1
  173. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +1 -1
  174. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +1 -1
  175. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +1 -1
  176. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +1 -1
  177. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +1 -1
  178. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +1 -1
  179. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +1 -1
  180. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +1 -1
  181. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +1 -1
  182. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +1 -1
  183. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +1 -1
  184. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +1 -1
  185. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +1 -1
  186. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +1 -1
  187. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +1 -1
  188. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +1 -1
  189. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +1 -1
  190. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +1 -1
  191. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +1 -1
  192. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -1
  193. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +1 -1
  194. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +1 -1
  195. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +1 -1
  196. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +1 -1
  197. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -1
  198. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +1 -1
  199. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +1 -1
  200. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +1 -1
  201. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +1 -1
  202. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +1 -1
  203. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +1 -1
  204. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +1 -1
  205. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +1 -1
  206. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +1 -1
  207. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +1 -1
  208. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +1 -1
  209. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +1 -1
  210. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +1 -1
  211. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +1 -1
  212. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +1 -1
  213. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +1 -1
  214. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +1 -1
  215. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +1 -1
  216. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +1 -1
  217. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +1 -1
  218. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +1 -1
  219. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +1 -1
  220. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +1 -1
  221. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +1 -1
  222. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +1 -1
  223. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +1 -1
  224. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +1 -1
  225. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +1 -1
  226. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +1 -1
  227. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +1 -1
  228. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +1 -1
  229. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +1 -1
  230. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +1 -1
  231. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +1 -1
  232. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +1 -1
  233. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +1 -1
  234. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +1 -1
  235. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +1 -1
  236. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +1 -1
  237. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +1 -1
  238. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +1 -1
  239. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +1 -1
  240. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +1 -1
  241. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +1 -1
  242. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -1
  243. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +1 -1
  244. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +1 -1
  245. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +1 -1
  246. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -1
  247. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +1 -1
  248. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -1
  249. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +1 -1
  250. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -1
  251. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +1 -1
  252. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +1 -1
  253. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +1 -1
  254. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +1 -1
  255. nautobot/project-static/docs/user-guide/index.html +1 -1
  256. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +1 -1
  257. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +1 -1
  258. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +1 -1
  259. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +1 -1
  260. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -1
  261. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +1 -1
  262. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +1 -1
  263. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +1 -1
  264. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +1 -1
  265. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +1 -1
  266. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +1 -1
  267. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +1 -1
  268. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +1 -1
  269. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +1 -1
  270. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +1 -1
  271. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +1 -1
  272. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +1 -1
  273. nautobot/project-static/docs/user-guide/platform-functionality/note.html +1 -1
  274. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +1 -1
  275. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -1
  276. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +1 -1
  277. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +1 -1
  278. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +1 -1
  279. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +1 -1
  280. nautobot/project-static/docs/user-guide/platform-functionality/role.html +1 -1
  281. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +1 -1
  282. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +1 -1
  283. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +1 -1
  284. nautobot/project-static/docs/user-guide/platform-functionality/status.html +1 -1
  285. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +1 -1
  286. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -1
  287. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +1 -1
  288. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +1 -1
  289. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +1 -1
  290. nautobot/project-static/js/forms.js +0 -38
  291. {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/METADATA +2 -2
  292. {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/RECORD +296 -293
  293. {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/LICENSE.txt +0 -0
  294. {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/NOTICE +0 -0
  295. {nautobot-2.3.9.dist-info → nautobot-2.3.10.dist-info}/WHEEL +0 -0
  296. {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
- @nautobot_task
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
- logger.error(f"Custom field with ID {field_id} not found, failing to act on choice data.")
34
- return False
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
- with web_request_context(
42
- user=change_context.get("user"),
43
- change_id=change_context.get("change_id"),
44
- context_detail=change_context.get("context_detail"),
45
- context=change_context.get("context"),
46
- ):
47
- for obj in model.objects.filter(**{f"_custom_field_data__{field.key}": old_value}):
48
- obj._custom_field_data[field.key] = new_value
49
- obj.save()
50
- else:
51
- for obj in model.objects.filter(**{f"_custom_field_data__{field.key}": old_value}):
52
- obj._custom_field_data[field.key] = new_value
53
- obj.save()
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
- logger.error(f"Unknown field type, failing to act on choice data for this field {field.key}.")
80
- return False
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
- # Circular Import
95
- from nautobot.extras.context_managers import web_request_context
96
-
97
- with transaction.atomic():
98
- for ct in ContentType.objects.filter(pk__in=content_type_pk_set):
99
- model = ct.model_class()
100
- if change_context is not None:
101
- with web_request_context(
102
- user=change_context.get("user"),
103
- change_id=change_context.get("change_id"),
104
- context_detail=change_context.get("context_detail"),
105
- context=change_context.get("context"),
106
- ):
107
- for obj in model.objects.filter(**{f"_custom_field_data__{field_key}__isnull": False}):
108
- del obj._custom_field_data[field_key]
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
- logger.error(f"Custom field with ID {field_id} not found, failing to provision.")
133
- return False
152
+ task_logger.error(f"Custom field with ID {field_id} not found, failing to provision.")
153
+ raise
134
154
 
135
- with transaction.atomic():
136
- for ct in ContentType.objects.filter(pk__in=content_type_pk_set):
137
- model = ct.model_class()
138
- if change_context is not None:
139
- with web_request_context(
140
- user=change_context.get("user"),
141
- change_id=change_context.get("change_id"),
142
- context_detail=change_context.get("context_detail"),
143
- context=change_context.get("context"),
144
- ):
145
- for obj in model.objects.all():
146
- obj._custom_field_data.setdefault(field.key, field.default)
147
- obj.save()
148
- else:
149
- for obj in model.objects.all():
150
- obj._custom_field_data.setdefault(field.key, field.default)
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
- [mock.call(oc_list[0], may_reload_jobs=True), mock.call(oc_list[1], may_reload_jobs=False)],
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
  """
@@ -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
- to be processed
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
- webhooks = Webhook.objects.filter(content_types=content_type, enabled=True, **{action_flag: True})
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 webhooks.exists():
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 webhooks:
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
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
  <link rel="icon" href="/projects/core/en/stable/assets/favicon.ico">
15
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.41">
15
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
16
16
 
17
17
 
18
18
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  <link rel="icon" href="../assets/favicon.ico">
19
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.41">
19
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
20
20
 
21
21
 
22
22
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
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">&para;</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>jobs_reloaded</code></td> <td>
11946
- <code><autoref identifier="bool" optional>bool</autoref></code>
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 to make this happen</p>
12007
+ <p>whether Jobs were reloaded here, and the jobhooks that were considered</p>
11951
12008
  </div>
11952
12009
  </td>
11953
12010
  </tr>
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24
 
@@ -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.41">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.42">
22
22
 
23
23
 
24
24