nautobot 2.4.8__py3-none-any.whl → 2.4.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (364) hide show
  1. nautobot/circuits/templates/circuits/circuittype.html +1 -1
  2. nautobot/circuits/templates/circuits/circuittype_retrieve.html +1 -39
  3. nautobot/circuits/views.py +18 -23
  4. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +4 -111
  5. nautobot/cloud/views.py +56 -25
  6. nautobot/core/celery/schedulers.py +1 -0
  7. nautobot/core/filters.py +1 -1
  8. nautobot/core/graphql/schema.py +1 -0
  9. nautobot/core/jobs/__init__.py +14 -3
  10. nautobot/core/tables.py +13 -6
  11. nautobot/core/testing/views.py +27 -2
  12. nautobot/core/tests/test_jobs.py +113 -0
  13. nautobot/core/tests/test_ui.py +53 -1
  14. nautobot/core/tests/test_utils.py +11 -0
  15. nautobot/core/ui/object_detail.py +19 -12
  16. nautobot/core/utils/filtering.py +3 -0
  17. nautobot/core/views/renderers.py +1 -1
  18. nautobot/dcim/forms.py +10 -0
  19. nautobot/dcim/templates/dcim/devicefamily_retrieve.html +1 -43
  20. nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +1 -59
  21. nautobot/dcim/templates/dcim/devicetype.html +2 -217
  22. nautobot/dcim/templates/dcim/devicetype_edit.html +2 -32
  23. nautobot/dcim/templates/dcim/devicetype_retrieve.html +217 -0
  24. nautobot/dcim/templates/dcim/devicetype_update.html +32 -0
  25. nautobot/dcim/templates/dcim/inc/rack_elevation.html +1 -1
  26. nautobot/dcim/templates/dcim/modulebay_retrieve.html +1 -84
  27. nautobot/dcim/templates/dcim/rack_elevation.html +14 -0
  28. nautobot/dcim/templates/dcim/rackreservation_retrieve.html +0 -68
  29. nautobot/dcim/tests/integration/test_fileinputpicker.py +1 -1
  30. nautobot/dcim/urls.py +1 -36
  31. nautobot/dcim/views.py +133 -81
  32. nautobot/extras/api/views.py +4 -6
  33. nautobot/extras/migrations/0024_job_data_migration.py +1 -1
  34. nautobot/extras/models/jobs.py +78 -62
  35. nautobot/extras/tables.py +11 -1
  36. nautobot/extras/templates/extras/computedfield_retrieve.html +1 -55
  37. nautobot/extras/templates/extras/inc/job_tiles.html +1 -1
  38. nautobot/extras/templates/extras/jobresult.html +1 -1
  39. nautobot/extras/templates/extras/metadatatype_retrieve.html +1 -66
  40. nautobot/extras/templates/extras/scheduledjob.html +25 -9
  41. nautobot/extras/tests/test_api.py +1 -1
  42. nautobot/extras/tests/test_views.py +15 -2
  43. nautobot/extras/utils.py +18 -16
  44. nautobot/extras/views.py +65 -26
  45. nautobot/ipam/tables.py +3 -4
  46. nautobot/project-static/docs/404.html +4 -4
  47. nautobot/project-static/docs/apps/index.html +4 -4
  48. nautobot/project-static/docs/apps/nautobot-apps.html +4 -4
  49. nautobot/project-static/docs/assets/javascripts/{bundle.c8b220af.min.js → bundle.13a4f30d.min.js} +4 -4
  50. nautobot/project-static/docs/assets/javascripts/{bundle.c8b220af.min.js.map → bundle.13a4f30d.min.js.map} +2 -2
  51. nautobot/project-static/docs/assets/javascripts/workers/{search.f8cc74c7.min.js → search.d50fe291.min.js} +2 -2
  52. nautobot/project-static/docs/assets/javascripts/workers/{search.f8cc74c7.min.js.map → search.d50fe291.min.js.map} +1 -1
  53. nautobot/project-static/docs/assets/stylesheets/{main.2afb09e1.min.css → main.342714a4.min.css} +1 -1
  54. nautobot/project-static/docs/assets/stylesheets/{main.2afb09e1.min.css.map → main.342714a4.min.css.map} +1 -1
  55. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +4 -4
  56. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +4 -4
  57. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +4 -4
  58. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +4 -4
  59. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +4 -4
  60. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +4 -4
  61. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +4 -4
  62. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +4 -4
  63. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +4 -4
  64. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +4 -4
  65. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +4 -4
  66. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +4 -4
  67. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +4 -4
  68. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +4 -4
  69. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +4 -4
  70. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +4 -4
  71. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +4 -4
  72. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +4 -4
  73. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +4 -4
  74. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +4 -4
  75. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +6 -8
  76. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +4 -4
  77. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +36 -6
  78. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +4 -4
  79. nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -4
  80. nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -4
  81. nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -4
  82. nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -4
  83. nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -4
  84. nautobot/project-static/docs/development/apps/api/models/index.html +4 -4
  85. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -4
  86. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -4
  87. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -4
  88. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -4
  89. nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -4
  90. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -4
  91. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -4
  92. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -4
  93. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -4
  94. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +4 -4
  95. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -4
  96. nautobot/project-static/docs/development/apps/api/prometheus.html +4 -4
  97. nautobot/project-static/docs/development/apps/api/setup.html +4 -4
  98. nautobot/project-static/docs/development/apps/api/testing.html +4 -4
  99. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -4
  100. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -4
  101. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -4
  102. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -4
  103. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -4
  104. nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -4
  105. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -4
  106. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -4
  107. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -4
  108. nautobot/project-static/docs/development/apps/api/views/index.html +4 -4
  109. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -4
  110. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -4
  111. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -4
  112. nautobot/project-static/docs/development/apps/api/views/notes.html +4 -4
  113. nautobot/project-static/docs/development/apps/api/views/rest-api.html +4 -4
  114. nautobot/project-static/docs/development/apps/api/views/urls.html +4 -4
  115. nautobot/project-static/docs/development/apps/index.html +4 -4
  116. nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -4
  117. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -4
  118. nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -4
  119. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -4
  120. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -4
  121. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -4
  122. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -4
  123. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +4 -4
  124. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -4
  125. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +4 -4
  126. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -4
  127. nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -4
  128. nautobot/project-static/docs/development/core/application-registry.html +4 -4
  129. nautobot/project-static/docs/development/core/best-practices.html +4 -4
  130. nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -4
  131. nautobot/project-static/docs/development/core/caching.html +4 -4
  132. nautobot/project-static/docs/development/core/controllers.html +4 -4
  133. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +41 -55
  134. nautobot/project-static/docs/development/core/generic-views.html +4 -4
  135. nautobot/project-static/docs/development/core/getting-started.html +4 -4
  136. nautobot/project-static/docs/development/core/homepage.html +4 -4
  137. nautobot/project-static/docs/development/core/index.html +4 -4
  138. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +4 -4
  139. nautobot/project-static/docs/development/core/model-checklist.html +4 -4
  140. nautobot/project-static/docs/development/core/model-features.html +4 -4
  141. nautobot/project-static/docs/development/core/natural-keys.html +4 -4
  142. nautobot/project-static/docs/development/core/navigation-menu.html +4 -4
  143. nautobot/project-static/docs/development/core/release-checklist.html +4 -4
  144. nautobot/project-static/docs/development/core/role-internals.html +4 -4
  145. nautobot/project-static/docs/development/core/settings.html +4 -4
  146. nautobot/project-static/docs/development/core/style-guide.html +4 -4
  147. nautobot/project-static/docs/development/core/templates.html +4 -4
  148. nautobot/project-static/docs/development/core/testing.html +4 -4
  149. nautobot/project-static/docs/development/core/ui-component-framework.html +4 -4
  150. nautobot/project-static/docs/development/core/user-preferences.html +4 -4
  151. nautobot/project-static/docs/development/index.html +4 -4
  152. nautobot/project-static/docs/development/jobs/getting-started.html +4 -4
  153. nautobot/project-static/docs/development/jobs/index.html +4 -4
  154. nautobot/project-static/docs/development/jobs/installation.html +4 -4
  155. nautobot/project-static/docs/development/jobs/job-extensions.html +4 -4
  156. nautobot/project-static/docs/development/jobs/job-logging.html +4 -4
  157. nautobot/project-static/docs/development/jobs/job-patterns.html +4 -4
  158. nautobot/project-static/docs/development/jobs/job-structure.html +4 -4
  159. nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -4
  160. nautobot/project-static/docs/development/jobs/testing.html +4 -4
  161. nautobot/project-static/docs/index.html +4 -4
  162. nautobot/project-static/docs/overview/application_stack.html +4 -4
  163. nautobot/project-static/docs/overview/design_philosophy.html +4 -4
  164. nautobot/project-static/docs/release-notes/index.html +4 -4
  165. nautobot/project-static/docs/release-notes/version-1.0.html +4 -4
  166. nautobot/project-static/docs/release-notes/version-1.1.html +4 -4
  167. nautobot/project-static/docs/release-notes/version-1.2.html +4 -4
  168. nautobot/project-static/docs/release-notes/version-1.3.html +4 -4
  169. nautobot/project-static/docs/release-notes/version-1.4.html +4 -4
  170. nautobot/project-static/docs/release-notes/version-1.5.html +4 -4
  171. nautobot/project-static/docs/release-notes/version-1.6.html +4 -4
  172. nautobot/project-static/docs/release-notes/version-2.0.html +4 -4
  173. nautobot/project-static/docs/release-notes/version-2.1.html +4 -4
  174. nautobot/project-static/docs/release-notes/version-2.2.html +4 -4
  175. nautobot/project-static/docs/release-notes/version-2.3.html +4 -4
  176. nautobot/project-static/docs/release-notes/version-2.4.html +190 -4
  177. nautobot/project-static/docs/requirements.txt +1 -1
  178. nautobot/project-static/docs/search/search_index.json +1 -1
  179. nautobot/project-static/docs/sitemap.xml +298 -298
  180. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  181. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -4
  182. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -4
  183. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +4 -4
  184. nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -4
  185. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -4
  186. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +4 -4
  187. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -4
  188. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -4
  189. nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -4
  190. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -4
  191. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -4
  192. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -4
  193. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -4
  194. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -4
  195. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +4 -4
  196. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -4
  197. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -4
  198. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -4
  199. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +4 -4
  200. nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -4
  201. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +4 -4
  202. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -4
  203. nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -4
  204. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -4
  205. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -4
  206. nautobot/project-static/docs/user-guide/administration/security/index.html +4 -4
  207. nautobot/project-static/docs/user-guide/administration/security/notices.html +4 -4
  208. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -4
  209. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -4
  210. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -4
  211. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -4
  212. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -4
  213. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -4
  214. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -4
  215. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +4 -4
  216. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -4
  217. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -4
  218. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -4
  219. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -4
  220. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -4
  221. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -4
  222. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -4
  223. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -4
  224. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -4
  225. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -4
  226. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -4
  227. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -4
  228. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -4
  229. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -4
  230. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -4
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -4
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -4
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -4
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -4
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -4
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -4
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -4
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -4
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -4
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -4
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -4
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -4
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -4
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -4
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -4
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -4
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -4
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -4
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -4
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -4
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -4
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -4
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -4
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -4
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -4
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -4
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -4
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -4
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -4
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -4
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -4
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -4
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -4
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -4
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -4
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -4
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -4
  268. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -4
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -4
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -4
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -4
  272. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -4
  273. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +4 -4
  274. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -4
  275. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -4
  276. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -4
  277. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -4
  278. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -4
  279. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -4
  280. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -4
  281. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -4
  282. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -4
  283. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -4
  284. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -4
  285. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -4
  286. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +4 -4
  287. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -4
  288. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -4
  289. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -4
  290. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -4
  291. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -4
  292. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -4
  293. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -4
  294. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -4
  295. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -4
  296. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -4
  297. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -4
  298. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -4
  299. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -4
  300. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -4
  301. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -4
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -4
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -4
  304. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -4
  305. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -4
  306. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -4
  307. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -4
  308. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -4
  309. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +4 -4
  310. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -4
  311. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -4
  312. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -4
  313. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +4 -4
  314. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +4 -4
  315. nautobot/project-static/docs/user-guide/index.html +4 -4
  316. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -4
  317. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +4 -4
  318. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -4
  319. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -4
  320. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -4
  321. nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -4
  322. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -4
  323. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -4
  324. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -4
  325. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -4
  326. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -4
  327. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -4
  328. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +4 -4
  329. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -4
  330. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +4 -4
  331. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -4
  332. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -4
  333. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +4 -4
  334. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +4 -4
  335. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -4
  336. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -4
  337. nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -4
  338. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -4
  339. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +4 -4
  340. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -4
  341. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -4
  342. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +4 -4
  343. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +4 -4
  344. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -4
  345. nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -4
  346. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -4
  347. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -4
  348. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -4
  349. nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -4
  350. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -4
  351. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -4
  352. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -4
  353. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -4
  354. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -4
  355. nautobot/project-static/js/forms.js +0 -14
  356. nautobot/wireless/tables.py +1 -0
  357. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +1 -55
  358. nautobot/wireless/views.py +33 -28
  359. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/METADATA +3 -3
  360. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/RECORD +364 -361
  361. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/LICENSE.txt +0 -0
  362. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/NOTICE +0 -0
  363. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/WHEEL +0 -0
  364. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/entry_points.txt +0 -0
@@ -58,7 +58,7 @@
58
58
  <div style="flex: 1;">
59
59
  Last run:
60
60
  {% if row.record.latest_result %}
61
- <a href="{{ row.record.latest_result.get_absolute_url }}">{{ row.record.latest_result.date_created }} by {{ row.record.latest_result.user }}</a>
61
+ <a href="{{ row.record.latest_result.get_absolute_url }}">{{ row.record.latest_result.date_created|date:settings.DATETIME_FORMAT }} by {{ row.record.latest_result.user }}</a>
62
62
  {% else %}
63
63
  <span class="text-muted">Never</span>
64
64
  {% endif %}
@@ -115,7 +115,7 @@
115
115
  <td>{{ result.worker }}</td>
116
116
  </tr>
117
117
  <tr>
118
- <td>Queue</td>
118
+ <td>Queue Name</td>
119
119
  <td>{{ result.celery_kwargs.queue}}</td>
120
120
  </tr>
121
121
  <tr>
@@ -1,67 +1,2 @@
1
1
  {% extends 'generic/object_retrieve.html' %}
2
- {% load helpers %}
3
-
4
- {% block content_left_page %}
5
- <div class="panel panel-default">
6
- <div class="panel-heading">
7
- <strong>Metadata Type</strong>
8
- </div>
9
- <table class="table table-hover panel-body attr-table">
10
- <tr>
11
- <td>Name</td>
12
- <td>{{ object.name }}</td>
13
- </tr>
14
- <tr>
15
- <td>Description</td>
16
- <td>{{ object.description|placeholder }}</td>
17
- </tr>
18
- <tr>
19
- <td>Data Type</td>
20
- <td>{{ object.get_data_type_display }}</td>
21
- </tr>
22
- </table>
23
- </div>
24
- {% if object.choices.exists %}
25
- <div class="panel panel-default">
26
- <div class="panel-heading">
27
- <strong>Choices</strong>
28
- </div>
29
- <table class="table table-hover panel-body attr-table">
30
- <thead>
31
- <tr>
32
- <th>Value</th>
33
- <th>Weight</th>
34
- </tr>
35
- </thead>
36
- <tbody>
37
- {% for choice in object.choices.all %}
38
- <tr>
39
- <td>{{ choice.value }}</td>
40
- <td>{{ choice.weight }}</td>
41
- </tr>
42
- {% endfor %}
43
- </tbody>
44
- </table>
45
- </div>
46
- {% endif %}
47
- {% endblock content_left_page %}
48
-
49
- {% block content_right_page %}
50
- <div class="panel panel-default">
51
- <div class="panel-heading">
52
- <strong>Assignment</strong>
53
- </div>
54
- <table class="table table-hover panel-body attr-table">
55
- <tr>
56
- <td>Content Types</td>
57
- <td>
58
- <ul>
59
- {% for ct in object.content_types.all %}
60
- <li>{{ ct }}</li>
61
- {% endfor %}
62
- </ul>
63
- </td>
64
- </tr>
65
- </table>
66
- </div>
67
- {% endblock content_right_page %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -48,22 +48,26 @@
48
48
  <code>{{ object.task }}</code>
49
49
  </td>
50
50
  </tr>
51
+ <tr>
52
+ <td>Job</td>
53
+ <td>{{ object.job_model|hyperlinked_object }}</td>
54
+ </tr>
51
55
  <tr>
52
56
  <td>Requester</td>
53
57
  <td>
54
- {{ object.user }}
58
+ {{ object.user|placeholder }}
55
59
  </td>
56
60
  </tr>
61
+ <tr>
62
+ <td>Approval Required?</td>
63
+ <td>{{ object.approval_required | render_boolean }}</td>
64
+ </tr>
57
65
  <tr>
58
66
  <td>Approver</td>
59
67
  <td>
60
68
  {{ object.approved_by_user | placeholder }}
61
69
  </td>
62
70
  </tr>
63
- <tr>
64
- <td>Approval Required?</td>
65
- <td>{{ object.approval_required | render_boolean }}</td>
66
- </tr>
67
71
  <tr>
68
72
  <td>Approved At</td>
69
73
  <td>
@@ -81,6 +85,10 @@
81
85
  <td>Enabled?</td>
82
86
  <td>{{ object.enabled | render_boolean }}</td>
83
87
  </tr>
88
+ <tr>
89
+ <td>Job Queue</td>
90
+ <td>{{ object.job_queue | hyperlinked_object }}</td>
91
+ </tr>
84
92
  <tr>
85
93
  <td>Interval</td>
86
94
  <td>
@@ -95,9 +103,9 @@
95
103
  <tr>
96
104
  <td>Start Time</td>
97
105
  <td>
98
- {{ object.start_time|timezone:object.time_zone|date:'Y-m-d H:i:s T' }}
106
+ {{ object.start_time|timezone:object.time_zone|date:settings.SHORT_DATETIME_FORMAT }}
99
107
  {% if default_time_zone != object.time_zone %}
100
- <br>{{ object.start_time|timezone:default_time_zone|date:'Y-m-d H:i:s T' }}
108
+ <br>{{ object.start_time|timezone:default_time_zone|date:settings.SHORT_DATETIME_FORMAT }}
101
109
  {% endif %}
102
110
  </td>
103
111
  </tr>
@@ -105,9 +113,9 @@
105
113
  <td>Last Run At</td>
106
114
  <td>
107
115
  {% if object.last_run_at %}
108
- {{ object.last_run_at|timezone:object.time_zone|date:'Y-m-d H:i:s T' }}
116
+ {{ object.last_run_at|timezone:object.time_zone|date:settings.SHORT_DATETIME_FORMAT }}
109
117
  {% if default_time_zone != object.time_zone %}
110
- <br>{{ object.last_run_at|timezone:default_time_zone|date:'Y-m-d H:i:s T' }}
118
+ <br>{{ object.last_run_at|timezone:default_time_zone|date:SHORT_DATETIME_FORMAT }}
111
119
  {% endif %}
112
120
  {% else %}
113
121
  {{ object.last_run_at|placeholder }}
@@ -141,4 +149,12 @@
141
149
  </table>
142
150
  </div>
143
151
  {% endif %}
152
+ <div class="panel panel-default">
153
+ <div class="panel-heading">
154
+ <strong>Celery Keyword Arguments</strong>
155
+ </div>
156
+ <div class="panel-body">
157
+ {% include 'extras/inc/json_data.html' with data=object.celery_kwargs format="json" %}
158
+ </div>
159
+ </div>
144
160
  {% endblock %}
@@ -1739,7 +1739,7 @@ class JobTest(
1739
1739
  # Ensure the enqueue_job args deserialize to the same as originally inputted
1740
1740
  expected_enqueue_job_args = (self.job_model, self.user)
1741
1741
  expected_enqueue_job_kwargs = {
1742
- "task_queue": self.job_model.default_job_queue.name,
1742
+ "job_queue": self.job_model.default_job_queue,
1743
1743
  **self.job_class.serialize_data(deserialized_data),
1744
1744
  }
1745
1745
  mock_enqueue_job.assert_called_with(*expected_enqueue_job_args, **expected_enqueue_job_kwargs)
@@ -1162,6 +1162,15 @@ class GitRepositoryTestCase(
1162
1162
  ):
1163
1163
  model = GitRepository
1164
1164
  slugify_function = staticmethod(slugify_dashes_to_underscores)
1165
+ expected_edit_form_buttons = [
1166
+ '<button type="submit" name="_dryrun_update" class="btn btn-warning">Update & Dry Run</button>',
1167
+ '<button type="submit" name="_update" class="btn btn-primary">Update & Sync</button>',
1168
+ ]
1169
+ expected_create_form_buttons = [
1170
+ '<button type="submit" name="_dryrun_create" class="btn btn-info">Create & Dry Run</button>',
1171
+ '<button type="submit" name="_create" class="btn btn-primary">Create & Sync</button>',
1172
+ '<button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button>',
1173
+ ]
1165
1174
 
1166
1175
  @classmethod
1167
1176
  def setUpTestData(cls):
@@ -2773,10 +2782,14 @@ class JobTestCase(
2773
2782
  @mock.patch("nautobot.extras.views.get_worker_count", return_value=0)
2774
2783
  def test_run_now_no_worker(self, _):
2775
2784
  self.add_permissions("extras.run_job")
2785
+ self.add_permissions("extras.view_jobresult")
2776
2786
 
2777
2787
  for run_url in self.run_urls:
2778
- response = self.client.post(run_url, self.data_run_immediately)
2779
- self.assertBodyContains(response, "Celery worker process not running.")
2788
+ response = self.client.post(run_url, self.data_run_immediately, follow=True)
2789
+
2790
+ result = JobResult.objects.latest()
2791
+ self.assertRedirects(response, reverse("extras:jobresult", kwargs={"pk": result.pk}))
2792
+ self.assertBodyContains(response, "No celery workers found")
2780
2793
 
2781
2794
  @mock.patch("nautobot.extras.views.get_worker_count", return_value=1)
2782
2795
  def test_run_now(self, _):
nautobot/extras/utils.py CHANGED
@@ -6,7 +6,7 @@ import hmac
6
6
  import logging
7
7
  import re
8
8
  import sys
9
- from typing import Optional
9
+ from typing import Optional, TYPE_CHECKING, Union
10
10
 
11
11
  from django.apps import apps
12
12
  from django.conf import settings
@@ -37,6 +37,9 @@ from nautobot.extras.constants import (
37
37
  )
38
38
  from nautobot.extras.registry import registry
39
39
 
40
+ if TYPE_CHECKING:
41
+ from nautobot.extras.models import JobQueue
42
+
40
43
  logger = logging.getLogger(__name__)
41
44
 
42
45
 
@@ -409,10 +412,12 @@ def get_celery_queues():
409
412
  return celery_queues
410
413
 
411
414
 
412
- def get_worker_count(request=None, queue=None):
415
+ def get_worker_count(request=None, queue: Optional[Union[str, "JobQueue"]] = None) -> int:
413
416
  """
414
- Return a count of the active Celery workers in a specified queue (Could be a JobQueue instance, instance pk or instance name).
415
- Defaults to the `CELERY_TASK_DEFAULT_QUEUE` setting.
417
+ Return a count of the active Celery workers in a specified queue.
418
+
419
+ Args:
420
+ queue (str, JobQueue, None): queue name or JobQueue to check; if unset, defaults to CELERY_TASK_DEFAULT_QUEUE.
416
421
  """
417
422
  from nautobot.extras.models import JobQueue
418
423
 
@@ -434,7 +439,7 @@ def get_worker_count(request=None, queue=None):
434
439
  return celery_queues.get(queue, 0)
435
440
 
436
441
 
437
- def get_job_queue_worker_count(request=None, job_queue=None):
442
+ def get_job_queue_worker_count(request=None, job_queue: Optional["JobQueue"] = None) -> int:
438
443
  """
439
444
  Return a count of the active Celery workers in a specified queue. Defaults to the `CELERY_TASK_DEFAULT_QUEUE` setting.
440
445
  Same as get_worker_count() method above, but job_queue is an actual JobQueue model instance.
@@ -449,27 +454,24 @@ def get_job_queue_worker_count(request=None, job_queue=None):
449
454
  return celery_queues.get(queue, 0)
450
455
 
451
456
 
452
- def get_job_queue(job_queue):
457
+ def get_job_queue(job_queue: str) -> Optional["JobQueue"]:
453
458
  """
454
459
  Search for a JobQueue instance based on the str job_queue.
455
460
  If no existing Job Queue not found, return None
456
461
  """
457
462
  from nautobot.extras.models import JobQueue
458
463
 
459
- queue = None
460
464
  if is_uuid(job_queue):
461
465
  try:
462
466
  # check if the string passed in is a valid UUID
463
- queue = JobQueue.objects.get(pk=job_queue)
467
+ return JobQueue.objects.get(pk=job_queue)
464
468
  except JobQueue.DoesNotExist:
465
- queue = None
466
- else:
467
- try:
468
- # check if the string passed in is a valid name
469
- queue = JobQueue.objects.get(name=job_queue)
470
- except JobQueue.DoesNotExist:
471
- queue = None
472
- return queue
469
+ return None
470
+ try:
471
+ # check if the string passed in is a valid name
472
+ return JobQueue.objects.get(name=job_queue)
473
+ except JobQueue.DoesNotExist:
474
+ return None
473
475
 
474
476
 
475
477
  def task_queues_as_choices(task_queues):
nautobot/extras/views.py CHANGED
@@ -73,7 +73,7 @@ from nautobot.dcim.tables import (
73
73
  VirtualDeviceContextTable,
74
74
  )
75
75
  from nautobot.extras.context_managers import deferred_change_logging_for_bulk_operation
76
- from nautobot.extras.utils import fixup_filterset_query_params, get_base_template, get_job_queue, get_worker_count
76
+ from nautobot.extras.utils import fixup_filterset_query_params, get_base_template, get_worker_count
77
77
  from nautobot.ipam.models import IPAddress, Prefix, VLAN
78
78
  from nautobot.ipam.tables import IPAddressTable, PrefixTable, VLANTable
79
79
  from nautobot.virtualization.models import VirtualMachine, VMInterface
@@ -153,6 +153,23 @@ class ComputedFieldUIViewSet(NautobotUIViewSet):
153
153
  table_class = tables.ComputedFieldTable
154
154
  queryset = ComputedField.objects.all()
155
155
  action_buttons = ("add",)
156
+ object_detail_content = object_detail.ObjectDetailContent(
157
+ panels=(
158
+ object_detail.ObjectFieldsPanel(
159
+ section=SectionChoices.LEFT_HALF,
160
+ weight=100,
161
+ fields="__all__",
162
+ exclude_fields=["template"],
163
+ ),
164
+ ObjectTextPanel(
165
+ label="Template",
166
+ section=SectionChoices.FULL_WIDTH,
167
+ weight=100,
168
+ object_field="template",
169
+ render_as=ObjectTextPanel.RenderOptions.CODE,
170
+ ),
171
+ ),
172
+ )
156
173
 
157
174
 
158
175
  #
@@ -1359,14 +1376,16 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
1359
1376
  # for example "?kwargs_from_job_result=<UUID>&integervar=22"
1360
1377
  explicit_initial = initial
1361
1378
  initial = job_result.task_kwargs.copy()
1362
- job_queue = job_result.celery_kwargs.get("queue", None)
1363
- jq = None
1364
- if job_queue is not None:
1379
+ task_queue = job_result.celery_kwargs.get("queue", None)
1380
+ job_queue = None
1381
+ if task_queue is not None:
1365
1382
  try:
1366
- jq = JobQueue.objects.get(name=job_queue, queue_type=JobQueueTypeChoices.TYPE_CELERY)
1383
+ job_queue = JobQueue.objects.get(
1384
+ name=task_queue, queue_type=JobQueueTypeChoices.TYPE_CELERY
1385
+ )
1367
1386
  except JobQueue.DoesNotExist:
1368
1387
  pass
1369
- initial["_job_queue"] = jq
1388
+ initial["_job_queue"] = job_queue
1370
1389
  initial["_profile"] = job_result.celery_kwargs.get("nautobot_job_profile", False)
1371
1390
  initial["_ignore_singleton_lock"] = job_result.celery_kwargs.get(
1372
1391
  "nautobot_job_ignore_singleton_lock", False
@@ -1410,7 +1429,6 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
1410
1429
  job_class = get_job(job_model.class_path, reload=True)
1411
1430
  job_form = job_class.as_form(request.POST, request.FILES) if job_class is not None else None
1412
1431
  schedule_form = forms.JobScheduleForm(request.POST)
1413
- job_queue = request.POST.get("_job_queue")
1414
1432
 
1415
1433
  return_url = request.POST.get("_return_url")
1416
1434
  if return_url is not None and url_has_allowed_host_and_scheme(url=return_url, allowed_hosts=request.get_host()):
@@ -1418,13 +1436,8 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
1418
1436
  else:
1419
1437
  return_url = None
1420
1438
 
1421
- queue = get_job_queue(job_queue)
1422
- if queue is None:
1423
- queue = job_model.default_job_queue
1424
- # Allow execution only if a worker process is running on a celery queue and the job is runnable.
1425
- if queue.queue_type == JobQueueTypeChoices.TYPE_CELERY and not get_worker_count(queue=job_queue):
1426
- messages.error(request, "Unable to run or schedule job: Celery worker process not running.")
1427
- elif not job_model.installed or job_class is None:
1439
+ # Allow execution only if the job is runnable.
1440
+ if not job_model.installed or job_class is None:
1428
1441
  messages.error(request, "Unable to run or schedule job: Job is not presently installed.")
1429
1442
  elif not job_model.enabled:
1430
1443
  messages.error(request, "Unable to run or schedule job: Job is not enabled to be run.")
@@ -1442,15 +1455,17 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
1442
1455
  )
1443
1456
  elif job_form is not None and job_form.is_valid() and schedule_form.is_valid():
1444
1457
  job_queue = job_form.cleaned_data.pop("_job_queue", None)
1445
- jq = None
1446
- if job_queue is not None:
1447
- try:
1448
- jq = JobQueue.objects.get(pk=job_queue)
1449
- except (ValidationError, JobQueue.DoesNotExist):
1450
- try:
1451
- jq = JobQueue.objects.get(name=job_queue)
1452
- except JobQueue.DoesNotExist:
1453
- pass
1458
+ if job_queue is None:
1459
+ job_queue = job_model.default_job_queue
1460
+
1461
+ if job_queue.queue_type == JobQueueTypeChoices.TYPE_CELERY and not get_worker_count(queue=job_queue):
1462
+ messages.warning(
1463
+ request,
1464
+ format_html(
1465
+ "No celery workers found for queue {}, job may never run unless a worker is started.",
1466
+ job_queue,
1467
+ ),
1468
+ )
1454
1469
 
1455
1470
  dryrun = job_form.cleaned_data.get("dryrun", False)
1456
1471
  # Run the job. A new JobResult is created.
@@ -1467,7 +1482,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
1467
1482
  interval=schedule_type,
1468
1483
  crontab=schedule_form.cleaned_data.get("_recurrence_custom_time"),
1469
1484
  approval_required=job_model.approval_required,
1470
- task_queue=jq.name if jq else None,
1485
+ job_queue=job_queue,
1471
1486
  profile=profile,
1472
1487
  ignore_singleton_lock=ignore_singleton_lock,
1473
1488
  **job_class.serialize_data(job_form.cleaned_data),
@@ -1488,7 +1503,7 @@ class JobRunView(ObjectPermissionRequiredMixin, View):
1488
1503
  request.user,
1489
1504
  profile=profile,
1490
1505
  ignore_singleton_lock=ignore_singleton_lock,
1491
- task_queue=jq.name if jq else None,
1506
+ job_queue=job_queue,
1492
1507
  **job_class.serialize_data(job_kwargs),
1493
1508
  )
1494
1509
 
@@ -1585,7 +1600,7 @@ class JobApprovalRequestView(generic.ObjectView):
1585
1600
  if job_class is not None:
1586
1601
  # Render the form with all fields disabled
1587
1602
  initial = instance.kwargs
1588
- initial["_job_queue"] = instance.queue
1603
+ initial["_job_queue"] = instance.job_queue
1589
1604
  initial["_profile"] = instance.celery_kwargs.get("profile", False)
1590
1605
  job_form = job_class().as_form(initial=initial, approval_view=True)
1591
1606
  else:
@@ -2312,6 +2327,28 @@ class MetadataTypeUIViewSet(NautobotUIViewSet):
2312
2327
  serializer_class = serializers.MetadataTypeSerializer
2313
2328
  table_class = tables.MetadataTypeTable
2314
2329
 
2330
+ object_detail_content = object_detail.ObjectDetailContent(
2331
+ panels=(
2332
+ object_detail.ObjectFieldsPanel(
2333
+ section=SectionChoices.LEFT_HALF,
2334
+ weight=100,
2335
+ exclude_fields=("content_types",),
2336
+ ),
2337
+ object_detail.ObjectsTablePanel(
2338
+ section=SectionChoices.LEFT_HALF,
2339
+ weight=200,
2340
+ context_table_key="choices",
2341
+ table_title="Choices",
2342
+ ),
2343
+ object_detail.ObjectFieldsPanel(
2344
+ section=SectionChoices.RIGHT_HALF,
2345
+ weight=100,
2346
+ fields=["content_types"],
2347
+ label="Assignment",
2348
+ ),
2349
+ ),
2350
+ )
2351
+
2315
2352
  def get_extra_context(self, request, instance):
2316
2353
  context = super().get_extra_context(request, instance)
2317
2354
 
@@ -2320,6 +2357,8 @@ class MetadataTypeUIViewSet(NautobotUIViewSet):
2320
2357
  context["choices"] = forms.MetadataChoiceFormSet(data=request.POST, instance=instance)
2321
2358
  else:
2322
2359
  context["choices"] = forms.MetadataChoiceFormSet(instance=instance)
2360
+ elif self.action == "retrieve":
2361
+ context["choices"] = tables.MetadataChoiceTable(instance.choices.all())
2323
2362
 
2324
2363
  return context
2325
2364
 
nautobot/ipam/tables.py CHANGED
@@ -214,7 +214,7 @@ class NamespaceTable(BaseTable):
214
214
  class VRFTable(StatusTableMixin, BaseTable):
215
215
  pk = ToggleColumn()
216
216
  name = tables.LinkColumn()
217
- # rd = tables.Column(verbose_name="RD")
217
+ rd = tables.Column(verbose_name="RD")
218
218
  tenant = TenantColumn()
219
219
  import_targets = tables.TemplateColumn(template_code=VRF_TARGETS, orderable=False)
220
220
  export_targets = tables.TemplateColumn(template_code=VRF_TARGETS, orderable=False)
@@ -225,7 +225,7 @@ class VRFTable(StatusTableMixin, BaseTable):
225
225
  fields = (
226
226
  "pk",
227
227
  "name",
228
- # "rd",
228
+ "rd",
229
229
  "status",
230
230
  "namespace",
231
231
  "tenant",
@@ -234,8 +234,7 @@ class VRFTable(StatusTableMixin, BaseTable):
234
234
  "export_targets",
235
235
  "tags",
236
236
  )
237
- # default_columns = ("pk", "name", "rd", "namespace", "tenant", "description")
238
- default_columns = ("pk", "name", "status", "namespace", "tenant", "description")
237
+ default_columns = ("pk", "name", "rd", "status", "namespace", "tenant", "description")
239
238
 
240
239
 
241
240
  class VRFDeviceAssignmentTable(BaseTable):
@@ -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.6.12">
15
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
16
16
 
17
17
 
18
18
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.2afb09e1.min.css">
23
+ <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.342714a4.min.css">
24
24
 
25
25
 
26
26
  <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/palette.06af60db.min.css">
@@ -10122,10 +10122,10 @@
10122
10122
 
10123
10123
 
10124
10124
 
10125
- <script id="__config" type="application/json">{"base": "/projects/core/en/stable/", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "/projects/core/en/stable/assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10125
+ <script id="__config" type="application/json">{"base": "/projects/core/en/stable/", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "/projects/core/en/stable/assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10126
10126
 
10127
10127
 
10128
- <script src="/projects/core/en/stable/assets/javascripts/bundle.c8b220af.min.js"></script>
10128
+ <script src="/projects/core/en/stable/assets/javascripts/bundle.13a4f30d.min.js"></script>
10129
10129
 
10130
10130
 
10131
10131
  </body>
@@ -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.6.12">
21
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
22
22
 
23
23
 
24
24
 
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css">
29
+ <link rel="stylesheet" href="../assets/stylesheets/main.342714a4.min.css">
30
30
 
31
31
 
32
32
  <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
@@ -10290,10 +10290,10 @@
10290
10290
 
10291
10291
 
10292
10292
 
10293
- <script id="__config" type="application/json">{"base": "..", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10293
+ <script id="__config" type="application/json">{"base": "..", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10294
10294
 
10295
10295
 
10296
- <script src="../assets/javascripts/bundle.c8b220af.min.js"></script>
10296
+ <script src="../assets/javascripts/bundle.13a4f30d.min.js"></script>
10297
10297
 
10298
10298
 
10299
10299
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
@@ -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.6.12">
19
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
20
20
 
21
21
 
22
22
 
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- <link rel="stylesheet" href="../assets/stylesheets/main.2afb09e1.min.css">
27
+ <link rel="stylesheet" href="../assets/stylesheets/main.342714a4.min.css">
28
28
 
29
29
 
30
30
  <link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
@@ -10223,10 +10223,10 @@
10223
10223
 
10224
10224
 
10225
10225
 
10226
- <script id="__config" type="application/json">{"base": "..", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10226
+ <script id="__config" type="application/json">{"base": "..", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10227
10227
 
10228
10228
 
10229
- <script src="../assets/javascripts/bundle.c8b220af.min.js"></script>
10229
+ <script src="../assets/javascripts/bundle.13a4f30d.min.js"></script>
10230
10230
 
10231
10231
 
10232
10232
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});