nautobot 2.4.10__py3-none-any.whl → 2.4.11__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 (416) hide show
  1. nautobot/cloud/tests/test_views.py +13 -1
  2. nautobot/cloud/views.py +39 -9
  3. nautobot/core/celery/__init__.py +21 -0
  4. nautobot/core/celery/encoders.py +3 -0
  5. nautobot/core/forms/forms.py +4 -1
  6. nautobot/core/jobs/bulk_actions.py +8 -8
  7. nautobot/core/jobs/cleanup.py +11 -0
  8. nautobot/core/management/commands/generate_test_data.py +2 -1
  9. nautobot/core/templates/generic/object_retrieve.html +1 -1
  10. nautobot/core/testing/mixins.py +19 -1
  11. nautobot/core/testing/views.py +104 -8
  12. nautobot/core/tests/test_jobs.py +20 -4
  13. nautobot/core/tests/test_utils.py +193 -0
  14. nautobot/core/tests/test_views_utils.py +53 -2
  15. nautobot/core/ui/object_detail.py +4 -0
  16. nautobot/core/utils/lookup.py +4 -2
  17. nautobot/core/utils/module_loading.py +86 -58
  18. nautobot/core/views/generic.py +2 -12
  19. nautobot/core/views/mixins.py +19 -1
  20. nautobot/core/views/renderers.py +4 -13
  21. nautobot/core/views/utils.py +16 -0
  22. nautobot/dcim/api/serializers.py +13 -0
  23. nautobot/dcim/api/urls.py +1 -0
  24. nautobot/dcim/api/views.py +20 -0
  25. nautobot/dcim/apps.py +1 -0
  26. nautobot/dcim/factory.py +11 -0
  27. nautobot/dcim/filters/__init__.py +110 -0
  28. nautobot/dcim/forms.py +205 -19
  29. nautobot/dcim/migrations/0070_modulefamily_models.py +92 -0
  30. nautobot/dcim/models/__init__.py +2 -0
  31. nautobot/dcim/models/device_component_templates.py +14 -0
  32. nautobot/dcim/models/device_components.py +13 -1
  33. nautobot/dcim/models/devices.py +62 -0
  34. nautobot/dcim/navigation.py +16 -0
  35. nautobot/dcim/tables/__init__.py +2 -0
  36. nautobot/dcim/tables/devices.py +48 -0
  37. nautobot/dcim/tables/devicetypes.py +35 -1
  38. nautobot/dcim/tables/template_code.py +2 -0
  39. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +1 -90
  40. nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +1 -1
  41. nautobot/dcim/templates/dcim/interfaceredundancygroup_retrieve.html +1 -63
  42. nautobot/dcim/templates/dcim/location.html +2 -249
  43. nautobot/dcim/templates/dcim/location_edit.html +2 -38
  44. nautobot/dcim/templates/dcim/location_retrieve.html +249 -0
  45. nautobot/dcim/templates/dcim/location_update.html +38 -0
  46. nautobot/dcim/templates/dcim/module_update.html +1 -0
  47. nautobot/dcim/templates/dcim/modulebay_retrieve.html +93 -1
  48. nautobot/dcim/templates/dcim/modulefamily_retrieve.html +31 -0
  49. nautobot/dcim/templates/dcim/moduletype_retrieve.html +6 -0
  50. nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -160
  51. nautobot/dcim/tests/test_api.py +35 -0
  52. nautobot/dcim/tests/test_filters.py +102 -3
  53. nautobot/dcim/tests/test_models.py +146 -0
  54. nautobot/dcim/tests/test_views.py +70 -97
  55. nautobot/dcim/urls.py +4 -22
  56. nautobot/dcim/views.py +439 -153
  57. nautobot/extras/api/views.py +9 -2
  58. nautobot/extras/datasources/git.py +11 -3
  59. nautobot/extras/forms/forms.py +9 -5
  60. nautobot/extras/jobs.py +4 -2
  61. nautobot/extras/models/datasources.py +5 -8
  62. nautobot/extras/models/jobs.py +5 -0
  63. nautobot/extras/plugins/__init__.py +3 -0
  64. nautobot/extras/tables.py +40 -3
  65. nautobot/extras/templates/extras/configcontext.html +2 -220
  66. nautobot/extras/templates/extras/configcontext_edit.html +2 -50
  67. nautobot/extras/templates/extras/configcontext_retrieve.html +2 -0
  68. nautobot/extras/templates/extras/configcontext_update.html +50 -0
  69. nautobot/extras/templates/extras/configcontextschema.html +2 -48
  70. nautobot/extras/templates/extras/configcontextschema_edit.html +2 -19
  71. nautobot/extras/templates/extras/configcontextschema_retrieve.html +48 -0
  72. nautobot/extras/templates/extras/configcontextschema_update.html +19 -0
  73. nautobot/extras/templates/extras/inc/configcontext_data.html +1 -0
  74. nautobot/extras/templates/extras/inc/json_data.html +1 -1
  75. nautobot/extras/templates/extras/inc/json_format.html +2 -2
  76. nautobot/extras/templates/extras/job_edit.html +12 -6
  77. nautobot/extras/templates/extras/tag.html +2 -52
  78. nautobot/extras/templates/extras/tag_edit.html +2 -15
  79. nautobot/extras/templates/extras/tag_retrieve.html +52 -0
  80. nautobot/extras/templates/extras/tag_update.html +15 -0
  81. nautobot/extras/templates/extras/team_retrieve.html +2 -2
  82. nautobot/extras/tests/test_api.py +15 -15
  83. nautobot/extras/tests/test_filters.py +4 -4
  84. nautobot/extras/tests/test_jobs.py +23 -10
  85. nautobot/extras/tests/test_models.py +19 -8
  86. nautobot/extras/tests/test_plugins.py +6 -3
  87. nautobot/extras/tests/test_views.py +66 -11
  88. nautobot/extras/urls.py +4 -134
  89. nautobot/extras/views.py +113 -158
  90. nautobot/ipam/models.py +19 -4
  91. nautobot/ipam/tables.py +19 -0
  92. nautobot/ipam/templates/ipam/vlan.html +2 -84
  93. nautobot/ipam/templates/ipam/vlan_edit.html +2 -24
  94. nautobot/ipam/templates/ipam/vlan_retrieve.html +84 -0
  95. nautobot/ipam/templates/ipam/vlan_update.html +24 -0
  96. nautobot/ipam/tests/test_views.py +5 -0
  97. nautobot/ipam/urls.py +1 -21
  98. nautobot/ipam/views.py +45 -70
  99. nautobot/project-static/docs/404.html +31 -8
  100. nautobot/project-static/docs/apps/index.html +31 -8
  101. nautobot/project-static/docs/apps/nautobot-apps.html +31 -8
  102. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +31 -8
  103. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +31 -8
  104. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +31 -8
  105. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +31 -8
  106. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +31 -8
  107. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +31 -8
  108. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +31 -8
  109. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +31 -8
  110. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +31 -8
  111. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +31 -8
  112. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +31 -8
  113. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +31 -8
  114. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +31 -8
  115. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +31 -8
  116. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +31 -8
  117. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +31 -8
  118. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +31 -8
  119. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +31 -8
  120. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +31 -8
  121. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +120 -8
  122. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +31 -8
  123. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +31 -8
  124. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +31 -8
  125. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +31 -8
  126. nautobot/project-static/docs/development/apps/api/configuration-view.html +31 -8
  127. nautobot/project-static/docs/development/apps/api/database-backend-config.html +31 -8
  128. nautobot/project-static/docs/development/apps/api/models/django-admin.html +31 -8
  129. nautobot/project-static/docs/development/apps/api/models/global-search.html +31 -8
  130. nautobot/project-static/docs/development/apps/api/models/graphql.html +31 -8
  131. nautobot/project-static/docs/development/apps/api/models/index.html +31 -8
  132. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +40 -8
  133. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +31 -8
  134. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +31 -8
  135. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +31 -8
  136. nautobot/project-static/docs/development/apps/api/platform-features/index.html +31 -8
  137. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +31 -8
  138. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +31 -8
  139. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +31 -8
  140. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +32 -9
  141. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +31 -8
  142. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +31 -8
  143. nautobot/project-static/docs/development/apps/api/prometheus.html +31 -8
  144. nautobot/project-static/docs/development/apps/api/setup.html +31 -8
  145. nautobot/project-static/docs/development/apps/api/testing.html +31 -8
  146. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +31 -8
  147. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +31 -8
  148. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +31 -8
  149. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +31 -8
  150. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +31 -8
  151. nautobot/project-static/docs/development/apps/api/views/base-template.html +31 -8
  152. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +31 -8
  153. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +31 -8
  154. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +31 -8
  155. nautobot/project-static/docs/development/apps/api/views/index.html +31 -8
  156. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +31 -8
  157. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +31 -8
  158. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +31 -8
  159. nautobot/project-static/docs/development/apps/api/views/notes.html +31 -8
  160. nautobot/project-static/docs/development/apps/api/views/rest-api.html +31 -8
  161. nautobot/project-static/docs/development/apps/api/views/urls.html +31 -8
  162. nautobot/project-static/docs/development/apps/index.html +31 -8
  163. nautobot/project-static/docs/development/apps/migration/code-updates.html +31 -8
  164. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +31 -8
  165. nautobot/project-static/docs/development/apps/migration/from-v1.html +31 -8
  166. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +31 -8
  167. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +31 -8
  168. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +31 -8
  169. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +31 -8
  170. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +31 -8
  171. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +31 -8
  172. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +31 -8
  173. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +31 -8
  174. nautobot/project-static/docs/development/apps/porting-from-netbox.html +31 -8
  175. nautobot/project-static/docs/development/core/application-registry.html +31 -8
  176. nautobot/project-static/docs/development/core/best-practices.html +31 -8
  177. nautobot/project-static/docs/development/core/bootstrap-ui.html +31 -8
  178. nautobot/project-static/docs/development/core/caching.html +31 -8
  179. nautobot/project-static/docs/development/core/controllers.html +31 -8
  180. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +31 -8
  181. nautobot/project-static/docs/development/core/generic-views.html +31 -8
  182. nautobot/project-static/docs/development/core/getting-started.html +31 -8
  183. nautobot/project-static/docs/development/core/homepage.html +31 -8
  184. nautobot/project-static/docs/development/core/index.html +31 -8
  185. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +31 -8
  186. nautobot/project-static/docs/development/core/model-checklist.html +31 -8
  187. nautobot/project-static/docs/development/core/model-features.html +31 -8
  188. nautobot/project-static/docs/development/core/natural-keys.html +31 -8
  189. nautobot/project-static/docs/development/core/navigation-menu.html +31 -8
  190. nautobot/project-static/docs/development/core/release-checklist.html +31 -8
  191. nautobot/project-static/docs/development/core/role-internals.html +31 -8
  192. nautobot/project-static/docs/development/core/settings.html +31 -8
  193. nautobot/project-static/docs/development/core/style-guide.html +31 -8
  194. nautobot/project-static/docs/development/core/templates.html +31 -8
  195. nautobot/project-static/docs/development/core/testing.html +31 -8
  196. nautobot/project-static/docs/development/core/ui-component-framework.html +31 -8
  197. nautobot/project-static/docs/development/core/user-preferences.html +31 -8
  198. nautobot/project-static/docs/development/index.html +31 -8
  199. nautobot/project-static/docs/development/jobs/getting-started.html +35 -8
  200. nautobot/project-static/docs/development/jobs/index.html +31 -8
  201. nautobot/project-static/docs/development/jobs/installation.html +31 -8
  202. nautobot/project-static/docs/development/jobs/job-extensions.html +31 -8
  203. nautobot/project-static/docs/development/jobs/job-logging.html +31 -8
  204. nautobot/project-static/docs/development/jobs/job-patterns.html +31 -8
  205. nautobot/project-static/docs/development/jobs/job-structure.html +31 -8
  206. nautobot/project-static/docs/development/jobs/migration/from-v1.html +31 -8
  207. nautobot/project-static/docs/development/jobs/testing.html +31 -8
  208. nautobot/project-static/docs/index.html +31 -8
  209. nautobot/project-static/docs/insert-analytics.sh +36 -0
  210. nautobot/project-static/docs/objects.inv +0 -0
  211. nautobot/project-static/docs/overview/application_stack.html +31 -8
  212. nautobot/project-static/docs/overview/design_philosophy.html +31 -8
  213. nautobot/project-static/docs/release-notes/index.html +31 -8
  214. nautobot/project-static/docs/release-notes/version-1.0.html +31 -8
  215. nautobot/project-static/docs/release-notes/version-1.1.html +31 -8
  216. nautobot/project-static/docs/release-notes/version-1.2.html +31 -8
  217. nautobot/project-static/docs/release-notes/version-1.3.html +31 -8
  218. nautobot/project-static/docs/release-notes/version-1.4.html +31 -8
  219. nautobot/project-static/docs/release-notes/version-1.5.html +31 -8
  220. nautobot/project-static/docs/release-notes/version-1.6.html +31 -8
  221. nautobot/project-static/docs/release-notes/version-2.0.html +31 -8
  222. nautobot/project-static/docs/release-notes/version-2.1.html +31 -8
  223. nautobot/project-static/docs/release-notes/version-2.2.html +31 -8
  224. nautobot/project-static/docs/release-notes/version-2.3.html +31 -8
  225. nautobot/project-static/docs/release-notes/version-2.4.html +252 -8
  226. nautobot/project-static/docs/search/search_index.json +1 -1
  227. nautobot/project-static/docs/sitemap.xml +302 -298
  228. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  229. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +31 -8
  230. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +31 -8
  231. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +31 -8
  232. nautobot/project-static/docs/user-guide/administration/configuration/index.html +31 -8
  233. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +31 -8
  234. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +31 -8
  235. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +31 -8
  236. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +31 -8
  237. nautobot/project-static/docs/user-guide/administration/guides/docker.html +31 -8
  238. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +31 -8
  239. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +31 -8
  240. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +31 -8
  241. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +31 -8
  242. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +31 -8
  243. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +31 -8
  244. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +31 -8
  245. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +31 -8
  246. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +31 -8
  247. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +31 -8
  248. nautobot/project-static/docs/user-guide/administration/installation/index.html +31 -8
  249. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +31 -8
  250. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +31 -8
  251. nautobot/project-static/docs/user-guide/administration/installation/services.html +31 -8
  252. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +31 -8
  253. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +31 -8
  254. nautobot/project-static/docs/user-guide/administration/security/index.html +31 -8
  255. nautobot/project-static/docs/user-guide/administration/security/notices.html +31 -8
  256. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +31 -8
  257. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +31 -8
  258. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +31 -8
  259. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +31 -8
  260. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +31 -8
  261. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +31 -8
  262. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +31 -8
  263. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +31 -8
  264. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +31 -8
  265. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +31 -8
  266. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +31 -8
  267. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +31 -8
  268. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +31 -8
  269. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +31 -8
  270. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +31 -8
  271. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +31 -8
  272. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +31 -8
  273. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +31 -8
  274. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +31 -8
  275. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +31 -8
  276. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +31 -8
  277. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +31 -8
  278. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +31 -8
  279. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +31 -8
  280. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +31 -8
  281. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +31 -8
  282. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +31 -8
  283. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +31 -8
  284. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +31 -8
  285. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +31 -8
  286. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +31 -8
  287. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +31 -8
  288. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +31 -8
  289. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +31 -8
  290. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +43 -20
  291. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +31 -8
  292. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +31 -8
  293. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +31 -8
  294. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +31 -8
  295. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +31 -8
  296. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +31 -8
  297. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +31 -8
  298. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +31 -8
  299. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +31 -8
  300. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +31 -8
  301. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +35 -8
  302. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +35 -8
  303. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +35 -8
  304. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +10261 -0
  305. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +34 -11
  306. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +31 -8
  307. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +31 -8
  308. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +31 -8
  309. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +31 -8
  310. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +31 -8
  311. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +31 -8
  312. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +31 -8
  313. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +31 -8
  314. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +31 -8
  315. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +31 -8
  316. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +31 -8
  317. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +31 -8
  318. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +31 -8
  319. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +31 -8
  320. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +31 -8
  321. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +31 -8
  322. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +31 -8
  323. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +31 -8
  324. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +31 -8
  325. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +31 -8
  326. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +31 -8
  327. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +31 -8
  328. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +31 -8
  329. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +31 -8
  330. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +31 -8
  331. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +31 -8
  332. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +31 -8
  333. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +31 -8
  334. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +31 -8
  335. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +31 -8
  336. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +31 -8
  337. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +31 -8
  338. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +31 -8
  339. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +31 -8
  340. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +31 -8
  341. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +31 -8
  342. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +31 -8
  343. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +31 -8
  344. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +31 -8
  345. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +31 -8
  346. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +31 -8
  347. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +31 -8
  348. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +31 -8
  349. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +31 -8
  350. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +31 -8
  351. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +31 -8
  352. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +31 -8
  353. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +31 -8
  354. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +31 -8
  355. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +31 -8
  356. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +31 -8
  357. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +31 -8
  358. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +41 -15
  359. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +31 -8
  360. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +31 -8
  361. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +31 -8
  362. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +31 -8
  363. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +31 -8
  364. nautobot/project-static/docs/user-guide/index.html +31 -8
  365. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +31 -8
  366. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +31 -8
  367. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +31 -8
  368. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +31 -8
  369. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +31 -8
  370. nautobot/project-static/docs/user-guide/platform-functionality/events.html +31 -8
  371. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +31 -8
  372. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +31 -8
  373. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +37 -9
  374. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +31 -8
  375. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +31 -8
  376. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +31 -8
  377. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +31 -8
  378. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +31 -8
  379. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +31 -8
  380. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +31 -8
  381. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +31 -8
  382. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +31 -8
  383. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +31 -8
  384. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +31 -8
  385. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +31 -8
  386. nautobot/project-static/docs/user-guide/platform-functionality/note.html +31 -8
  387. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +31 -8
  388. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +31 -8
  389. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +31 -8
  390. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +31 -8
  391. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +31 -8
  392. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +31 -8
  393. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +31 -8
  394. nautobot/project-static/docs/user-guide/platform-functionality/role.html +31 -8
  395. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +31 -8
  396. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +31 -8
  397. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +31 -8
  398. nautobot/project-static/docs/user-guide/platform-functionality/status.html +31 -8
  399. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +31 -8
  400. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +31 -8
  401. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +31 -8
  402. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +31 -8
  403. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +31 -8
  404. nautobot/tenancy/tables.py +2 -0
  405. nautobot/virtualization/tests/test_views.py +1 -1
  406. nautobot/wireless/forms.py +0 -1
  407. nautobot/wireless/models.py +1 -1
  408. nautobot/wireless/tables.py +7 -0
  409. {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/METADATA +4 -4
  410. {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/RECORD +416 -401
  411. /nautobot/dcim/templates/dcim/{platform_edit.html → platform_create.html} +0 -0
  412. /nautobot/extras/test_jobs/{pass.py → pass_job.py} +0 -0
  413. {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/LICENSE.txt +0 -0
  414. {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/NOTICE +0 -0
  415. {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/WHEEL +0 -0
  416. {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/entry_points.txt +0 -0
@@ -1,19 +1,2 @@
1
- {% extends 'generic/object_create.html' %}
2
- {% load form_helpers %}
3
-
4
- {% block form %}
5
- <div class="panel panel-default">
6
- <div class="panel-heading"><strong>Config Context Schema</strong></div>
7
- <div class="panel-body">
8
- {% render_field form.name %}
9
- {% render_field form.description %}
10
- </div>
11
- </div>
12
- <div class="panel panel-default">
13
- <div class="panel-heading"><strong>Data Schema</strong></div>
14
- <div class="panel-body">
15
- {% render_field form.data_schema %}
16
- </div>
17
- </div>
18
- {% include 'inc/extras_features_edit_form_fields.html' %}
19
- {% endblock %}
1
+ {% extends 'extras/configcontextschema_update.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -0,0 +1,48 @@
1
+ {% extends 'generic/object_retrieve.html' %}
2
+ {% load buttons %}
3
+ {% load plugins %}
4
+ {% load helpers %}
5
+
6
+ {% block extra_nav_tabs %}
7
+ <li role="presentation"{% if active_tab == 'validation' %} class="active"{% endif %}>
8
+ <a href="{% url 'extras:configcontextschema_object_validation' pk=object.pk %}">Validation</a>
9
+ </li>
10
+ {% endblock extra_nav_tabs %}
11
+
12
+ {% block content_left_page %}
13
+ <div class="panel panel-default">
14
+ <div class="panel-heading">
15
+ <strong>Config Context Schema</strong>
16
+ </div>
17
+ <table class="table table-hover panel-body attr-table">
18
+ <tr>
19
+ <td>Name</td>
20
+ <td>
21
+ {{ object.name }}
22
+ </td>
23
+ </tr>
24
+ {% if object.owner %}
25
+ <tr>
26
+ <td>Owner</td>
27
+ <td>{{ object.owner|hyperlinked_object }}</td>
28
+ </tr>
29
+ {% endif %}
30
+ <tr>
31
+ <td>Description</td>
32
+ <td>{{ object.description|placeholder }}</td>
33
+ </tr>
34
+ </table>
35
+ </div>
36
+ {% endblock content_left_page %}
37
+
38
+ {% block content_right_page %}
39
+ <div class="panel panel-default">
40
+ <div class="panel-heading">
41
+ <strong>Data Schema</strong>
42
+ {% include 'extras/inc/json_format.html' %}
43
+ </div>
44
+ <div class="panel-body">
45
+ {% include 'extras/inc/json_data.html' with data=object.data_schema format=format %}
46
+ </div>
47
+ </div>
48
+ {% endblock content_right_page %}
@@ -0,0 +1,19 @@
1
+ {% extends 'generic/object_create.html' %}
2
+ {% load form_helpers %}
3
+
4
+ {% block form %}
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading"><strong>Config Context Schema</strong></div>
7
+ <div class="panel-body">
8
+ {% render_field form.name %}
9
+ {% render_field form.description %}
10
+ </div>
11
+ </div>
12
+ <div class="panel panel-default">
13
+ <div class="panel-heading"><strong>Data Schema</strong></div>
14
+ <div class="panel-body">
15
+ {% render_field form.data_schema %}
16
+ </div>
17
+ </div>
18
+ {% include 'inc/extras_features_edit_form_fields.html' %}
19
+ {% endblock %}
@@ -0,0 +1 @@
1
+ {% include 'extras/inc/json_data.html' with data=object.data format=format %}
@@ -1,5 +1,5 @@
1
1
  {% load helpers %}
2
2
 
3
3
  <div class="rendered-json-data">
4
- <pre>{% if format == 'json' %}{{ data|render_json }}{% elif format == 'yaml' %}{{ data|render_yaml }}{% else %}{{ data }}{% endif %}</pre>
4
+ <pre>{% if data_format == 'json' %}{{ data|render_json }}{% elif data_format == 'yaml' %}{{ data|render_yaml }}{% else %}{{ data }}{% endif %}</pre>
5
5
  </div>
@@ -1,6 +1,6 @@
1
1
  <div class="pull-right">
2
2
  <div class="btn-group btn-group-xs" role="group">
3
- <a href="?format=json" class="btn btn-default{% if format == 'json' %} active{% endif %}">JSON</a>
4
- <a href="?format=yaml" class="btn btn-default{% if format == 'yaml' %} active{% endif %}">YAML</a>
3
+ <a href="?data_format=json" class="btn btn-default{% if data_format == 'json' %} active{% endif %}">JSON</a>
4
+ <a href="?data_format=yaml" class="btn btn-default{% if data_format == 'yaml' %} active{% endif %}">YAML</a>
5
5
  </div>
6
6
  </div>
@@ -115,7 +115,7 @@
115
115
  const field_name = field_id.slice(3);
116
116
  if ($(this).prop("checked")) {
117
117
  field.attr("readonly", null);
118
- field.attr("disabled", null);
118
+ field.prop("disabled", false);
119
119
  } else {
120
120
  /* Revert the field to its default value */
121
121
  if (field.attr("type") == "checkbox") {
@@ -131,11 +131,11 @@
131
131
  * Note that "disabled" fields aren't included in form submission, so we have to be sure to
132
132
  * re-enable them at form submission time.
133
133
  */
134
- field.attr("disabled", "disabled");
134
+ field.prop("disabled", true);
135
135
  } else {
136
136
  /* Do we have a job class object to derive properties from? */
137
137
  if (job_class_properties != "") {
138
- if (field_name != "job_queues") {
138
+ if (field_name != "job_queues" && field_name != "default_job_queue") {
139
139
  field.val(job_class_properties[field_name]);
140
140
  }
141
141
  } else if (field_name != "description") {
@@ -145,17 +145,23 @@
145
145
  /* Textarea fields don't have a "value" attribute */
146
146
  field.val(description_default);
147
147
  }
148
- field.attr("readonly", "readonly");
148
+ if (field_name == "job_queues" || field_name == "default_job_queue") {
149
+ field.prop("disabled", true);
150
+ } else {
151
+ field.attr("readonly", "readonly");
152
+ }
149
153
  }
150
154
  }
151
155
  });
152
156
  $("[id^=id_][id$=_override]").change();
153
157
 
154
- /* As mentioned above, we need to re-enable all checkboxes on form submission so they get included */
158
+ /* As mentioned above, we need to re-enable all checkboxes, job_queues and default_job_queue fields on form submission so they get included */
155
159
  $("form").submit(function() {
156
160
  $('input[type="checkbox"]:disabled').each(function() {
157
- $(this).attr("disabled", null);
161
+ $(this).prop("disabled", false);
158
162
  });
163
+ $('#id_job_queues').prop("disabled", false);
164
+ $('#id_default_job_queues').prop("disabled", false);
159
165
  });
160
166
  </script>
161
167
  {% endblock javascript %}
@@ -1,52 +1,2 @@
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>Tag</strong>
8
- </div>
9
- <table class="table table-hover panel-body attr-table">
10
- <tr>
11
- <td>Name</td>
12
- <td>
13
- {{ object.name }}
14
- </td>
15
- </tr>
16
- <tr>
17
- <td>Tagged Items</td>
18
- <td>
19
- {{ items_count }}
20
- </td>
21
- </tr>
22
- <tr>
23
- <td>Color</td>
24
- <td>
25
- <span class="label color-block" style="background-color: #{{ object.color }}">&nbsp;</span>
26
- </td>
27
- </tr>
28
- <tr>
29
- <td>Content Type(s)</td>
30
- <td>
31
- <ul class="list-unstyled">
32
- {% for ct in content_types %}
33
- <li>{{ ct }}</li>
34
- {% endfor %}
35
- </ul>
36
- </td>
37
- </tr>
38
- <tr>
39
- <td>Description</td>
40
- <td>
41
- {{ object.description|placeholder }}
42
- </td>
43
- </tr>
44
- </table>
45
- </div>
46
- {% endblock content_left_page %}
47
-
48
- {% block content_right_page %}
49
- {% include 'panel_table.html' with table=items_table heading='Tagged Objects' %}
50
- {% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %}
51
- <div class="row"></div>
52
- {% endblock content_right_page %}
1
+ {% extends 'extras/tag_retrieve.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,15 +1,2 @@
1
- {% extends 'generic/object_create.html' %}
2
- {% load form_helpers %}
3
-
4
- {% block form %}
5
- <div class="panel panel-default">
6
- <div class="panel-heading"><strong>Tag</strong></div>
7
- <div class="panel-body">
8
- {% render_field form.name %}
9
- {% render_field form.color %}
10
- {% render_field form.description %}
11
- {% render_field form.content_types %}
12
- </div>
13
- </div>
14
- {% include 'inc/extras_features_edit_form_fields.html' %}
15
- {% endblock %}
1
+ {% extends 'extras/tag_update.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -0,0 +1,52 @@
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>Tag</strong>
8
+ </div>
9
+ <table class="table table-hover panel-body attr-table">
10
+ <tr>
11
+ <td>Name</td>
12
+ <td>
13
+ {{ object.name }}
14
+ </td>
15
+ </tr>
16
+ <tr>
17
+ <td>Tagged Items</td>
18
+ <td>
19
+ {{ items_count }}
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td>Color</td>
24
+ <td>
25
+ <span class="label color-block" style="background-color: #{{ object.color }}">&nbsp;</span>
26
+ </td>
27
+ </tr>
28
+ <tr>
29
+ <td>Content Type(s)</td>
30
+ <td>
31
+ <ul class="list-unstyled">
32
+ {% for ct in content_types %}
33
+ <li>{{ ct }}</li>
34
+ {% endfor %}
35
+ </ul>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td>Description</td>
40
+ <td>
41
+ {{ object.description|placeholder }}
42
+ </td>
43
+ </tr>
44
+ </table>
45
+ </div>
46
+ {% endblock content_left_page %}
47
+
48
+ {% block content_right_page %}
49
+ {% include 'panel_table.html' with table=items_table heading='Tagged Objects' %}
50
+ {% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %}
51
+ <div class="row"></div>
52
+ {% endblock content_right_page %}
@@ -0,0 +1,15 @@
1
+ {% extends 'generic/object_create.html' %}
2
+ {% load form_helpers %}
3
+
4
+ {% block form %}
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading"><strong>Tag</strong></div>
7
+ <div class="panel-body">
8
+ {% render_field form.name %}
9
+ {% render_field form.color %}
10
+ {% render_field form.description %}
11
+ {% render_field form.content_types %}
12
+ </div>
13
+ </div>
14
+ {% include 'inc/extras_features_edit_form_fields.html' %}
15
+ {% endblock %}
@@ -1,2 +1,2 @@
1
- {% extends 'generic/object_retrieve.html' %}
2
- {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1529,7 +1529,7 @@ class JobTest(
1529
1529
  mock_get_worker_count.return_value = 1
1530
1530
  obj_perm = ObjectPermission(
1531
1531
  name="Test permission",
1532
- constraints={"module_name__in": ["pass", "fail"]},
1532
+ constraints={"module_name__in": ["pass_job", "fail"]},
1533
1533
  actions=["run"],
1534
1534
  )
1535
1535
  obj_perm.save()
@@ -1543,10 +1543,10 @@ class JobTest(
1543
1543
  self.assertHttpStatus(response, status.HTTP_404_NOT_FOUND)
1544
1544
 
1545
1545
  # Try post to permitted job
1546
- job_model = Job.objects.get_for_class_path("pass.TestPassJob")
1546
+ job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
1547
1547
  job_model.enabled = True
1548
1548
  job_model.validated_save()
1549
- url = self.get_run_url("pass.TestPassJob")
1549
+ url = self.get_run_url("pass_job.TestPassJob")
1550
1550
  response = self.client.post(url, **self.header)
1551
1551
  self.assertHttpStatus(response, self.run_success_response_status)
1552
1552
 
@@ -1702,7 +1702,7 @@ class JobTest(
1702
1702
  # Assert that we have an immediate ScheduledJob and that it matches the job_model.
1703
1703
  schedule = ScheduledJob.objects.last()
1704
1704
  self.assertIsNotNone(schedule)
1705
- self.assertEqual(schedule.interval, JobExecutionType.TYPE_IMMEDIATELY)
1705
+ self.assertEqual(schedule.interval, JobExecutionType.TYPE_FUTURE)
1706
1706
  self.assertEqual(schedule.approval_required, self.job_model.approval_required)
1707
1707
  self.assertEqual(schedule.kwargs["var4"], str(device_role.pk))
1708
1708
 
@@ -2136,7 +2136,7 @@ class JobTest(
2136
2136
  @mock.patch("nautobot.extras.api.views.get_worker_count", return_value=1)
2137
2137
  def test_run_job_with_default_queue_with_empty_job_model_job_queues(self, _):
2138
2138
  self.add_permissions("extras.run_job")
2139
- job_model = Job.objects.get_for_class_path("pass.TestPassJob")
2139
+ job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
2140
2140
  data = {
2141
2141
  "task_queue": job_model.default_job_queue.name,
2142
2142
  }
@@ -2144,7 +2144,7 @@ class JobTest(
2144
2144
  job_model.job_queues.set([])
2145
2145
  job_model.enabled = True
2146
2146
  job_model.validated_save()
2147
- url = self.get_run_url("pass.TestPassJob")
2147
+ url = self.get_run_url("pass_job.TestPassJob")
2148
2148
  response = self.client.post(url, data, format="json", **self.header)
2149
2149
  self.assertHttpStatus(response, self.run_success_response_status)
2150
2150
 
@@ -2571,10 +2571,10 @@ class ScheduledJobTest(
2571
2571
  @classmethod
2572
2572
  def setUpTestData(cls):
2573
2573
  user = User.objects.create(username="user1", is_active=True)
2574
- job_model = Job.objects.get_for_class_path("pass.TestPassJob")
2574
+ job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
2575
2575
  ScheduledJob.objects.create(
2576
2576
  name="test1",
2577
- task="pass.TestPassJob",
2577
+ task="pass_job.TestPassJob",
2578
2578
  job_model=job_model,
2579
2579
  interval=JobExecutionType.TYPE_IMMEDIATELY,
2580
2580
  user=user,
@@ -2583,7 +2583,7 @@ class ScheduledJobTest(
2583
2583
  )
2584
2584
  ScheduledJob.objects.create(
2585
2585
  name="test2",
2586
- task="pass.TestPassJob",
2586
+ task="pass_job.TestPassJob",
2587
2587
  job_model=job_model,
2588
2588
  interval=JobExecutionType.TYPE_DAILY,
2589
2589
  user=user,
@@ -2593,7 +2593,7 @@ class ScheduledJobTest(
2593
2593
  )
2594
2594
  ScheduledJob.objects.create(
2595
2595
  name="test3",
2596
- task="pass.TestPassJob",
2596
+ task="pass_job.TestPassJob",
2597
2597
  job_model=job_model,
2598
2598
  interval=JobExecutionType.TYPE_CUSTOM,
2599
2599
  crontab="34 12 * * *",
@@ -2608,12 +2608,12 @@ class JobApprovalTest(APITestCase):
2608
2608
  @classmethod
2609
2609
  def setUpTestData(cls):
2610
2610
  cls.additional_user = User.objects.create(username="user1", is_active=True)
2611
- cls.job_model = Job.objects.get_for_class_path("pass.TestPassJob")
2611
+ cls.job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
2612
2612
  cls.job_model.enabled = True
2613
2613
  cls.job_model.save()
2614
2614
  cls.scheduled_job = ScheduledJob.objects.create(
2615
2615
  name="test pass",
2616
- task="pass.TestPassJob",
2616
+ task="pass_job.TestPassJob",
2617
2617
  job_model=cls.job_model,
2618
2618
  interval=JobExecutionType.TYPE_IMMEDIATELY,
2619
2619
  user=cls.additional_user,
@@ -2666,7 +2666,7 @@ class JobApprovalTest(APITestCase):
2666
2666
  self.add_permissions("extras.approve_job", "extras.view_scheduledjob", "extras.change_scheduledjob")
2667
2667
  scheduled_job = ScheduledJob.objects.create(
2668
2668
  name="test",
2669
- task="pass.TestPassJob",
2669
+ task="pass_job.TestPassJob",
2670
2670
  job_model=self.job_model,
2671
2671
  interval=JobExecutionType.TYPE_IMMEDIATELY,
2672
2672
  user=self.user,
@@ -2689,7 +2689,7 @@ class JobApprovalTest(APITestCase):
2689
2689
  self.add_permissions("extras.approve_job", "extras.view_scheduledjob", "extras.change_scheduledjob")
2690
2690
  scheduled_job = ScheduledJob.objects.create(
2691
2691
  name="test",
2692
- task="pass.TestPassJob",
2692
+ task="pass_job.TestPassJob",
2693
2693
  job_model=self.job_model,
2694
2694
  interval=JobExecutionType.TYPE_FUTURE,
2695
2695
  one_off=True,
@@ -2706,7 +2706,7 @@ class JobApprovalTest(APITestCase):
2706
2706
  self.add_permissions("extras.approve_job", "extras.view_scheduledjob", "extras.change_scheduledjob")
2707
2707
  scheduled_job = ScheduledJob.objects.create(
2708
2708
  name="test",
2709
- task="pass.TestPassJob",
2709
+ task="pass_job.TestPassJob",
2710
2710
  job_model=self.job_model,
2711
2711
  interval=JobExecutionType.TYPE_FUTURE,
2712
2712
  one_off=True,
@@ -994,11 +994,11 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
994
994
  jobs = Job.objects.all()[:3]
995
995
  cls.jobs = jobs
996
996
  user = User.objects.create(username="user1", is_active=True)
997
- job_model = Job.objects.get_for_class_path("pass.TestPassJob")
997
+ job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
998
998
  scheduled_jobs = [
999
999
  ScheduledJob.objects.create(
1000
1000
  name="test1",
1001
- task="pass.TestPassJob",
1001
+ task="pass_job.TestPassJob",
1002
1002
  job_model=job_model,
1003
1003
  interval=JobExecutionType.TYPE_IMMEDIATELY,
1004
1004
  user=user,
@@ -1007,7 +1007,7 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
1007
1007
  ),
1008
1008
  ScheduledJob.objects.create(
1009
1009
  name="test2",
1010
- task="pass.TestPassJob",
1010
+ task="pass_job.TestPassJob",
1011
1011
  job_model=job_model,
1012
1012
  interval=JobExecutionType.TYPE_DAILY,
1013
1013
  user=user,
@@ -1017,7 +1017,7 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
1017
1017
  ),
1018
1018
  ScheduledJob.objects.create(
1019
1019
  name="test3",
1020
- task="pass.TestPassJob",
1020
+ task="pass_job.TestPassJob",
1021
1021
  job_model=job_model,
1022
1022
  interval=JobExecutionType.TYPE_CUSTOM,
1023
1023
  crontab="34 12 * * *",
@@ -167,7 +167,7 @@ class JobTest(TestCase):
167
167
  self.assertTrue(job_class.supports_dryrun)
168
168
  self.assertTrue(job_model.supports_dryrun)
169
169
 
170
- module = "pass"
170
+ module = "pass_job"
171
171
  name = "TestPassJob"
172
172
  job_class, job_model = get_job_class_and_model(module, name)
173
173
  self.assertFalse(job_class.supports_dryrun)
@@ -212,7 +212,7 @@ register_jobs(MyJob)
212
212
  self.assertIsNotNone(get_job("my_jobs.MyJob"))
213
213
  # Also make sure some representative previous JOBS_ROOT jobs aren't still around:
214
214
  self.assertNotIn("dry_run.TestDryRun", jobs_data.keys())
215
- self.assertNotIn("pass.TestPassJob", jobs_data.keys())
215
+ self.assertNotIn("pass_job.TestPassJob", jobs_data.keys())
216
216
 
217
217
  # Create a second Job in the same module
218
218
  with open(os.path.join(temp_dir, "my_jobs.py"), "a") as fd:
@@ -286,6 +286,19 @@ register_jobs(BadJob)
286
286
  # Clean up back to normal behavior
287
287
  get_jobs(reload=True)
288
288
 
289
+ def test_app_dynamic_jobs(self):
290
+ """
291
+ Test that get_job() correctly reloads dynamic jobs when `NautobotAppConfig.provides_dynamic_jobs` is True.
292
+ """
293
+ with mock.patch("nautobot.extras.jobs.get_jobs", autospec=True) as mock_get_jobs:
294
+ # example_app_with_view_override provides dynamic jobs
295
+ get_job("example_app_with_view_override.jobs.ExampleHiddenJob", reload=True)
296
+ mock_get_jobs.assert_called_once_with(reload=True)
297
+ mock_get_jobs.reset_mock()
298
+ # example_app does NOT provide dynamic jobs
299
+ get_job("example_app.jobs.ExampleEverythingJob", reload=True)
300
+ mock_get_jobs.assert_called_once_with(reload=False)
301
+
289
302
 
290
303
  class JobTransactionTest(TransactionTestCase):
291
304
  """
@@ -423,7 +436,7 @@ class JobTransactionTest(TransactionTestCase):
423
436
  """
424
437
  Job test with pass result.
425
438
  """
426
- module = "pass"
439
+ module = "pass_job"
427
440
  name = "TestPassJob"
428
441
  job_result = create_job_result_and_run_job(module, name)
429
442
  self.assertJobResultStatus(job_result)
@@ -693,7 +706,7 @@ class JobTransactionTest(TransactionTestCase):
693
706
  """
694
707
  Job test to see if the latest_result property is indeed returning the most recent job result
695
708
  """
696
- module = "pass"
709
+ module = "pass_job"
697
710
  name = "TestPassJob"
698
711
  job_result_1 = create_job_result_and_run_job(module, name)
699
712
  self.assertJobResultStatus(job_result_1)
@@ -946,7 +959,7 @@ class RunJobManagementCommandTest(TransactionTestCase):
946
959
 
947
960
  def test_runjob_nochange_successful(self):
948
961
  """Basic success-path test for Jobs that don't modify the Nautobot database."""
949
- module = "pass"
962
+ module = "pass_job"
950
963
  name = "TestPassJob"
951
964
  _job_class, job_model = get_job_class_and_model(module, name)
952
965
 
@@ -1044,7 +1057,7 @@ class JobButtonReceiverTest(TestCase):
1044
1057
 
1045
1058
  def test_is_job_button(self):
1046
1059
  with self.subTest(expected=False):
1047
- module = "pass"
1060
+ module = "pass_job"
1048
1061
  name = "TestPassJob"
1049
1062
  _job_class, job_model = get_job_class_and_model(module, name)
1050
1063
  self.assertFalse(job_model.is_job_button_receiver)
@@ -1107,7 +1120,7 @@ class JobHookReceiverTest(TestCase):
1107
1120
 
1108
1121
  def test_is_job_hook(self):
1109
1122
  with self.subTest(expected=False):
1110
- module = "pass"
1123
+ module = "pass_job"
1111
1124
  name = "TestPassJob"
1112
1125
  _job_class, job_model = get_job_class_and_model(module, name)
1113
1126
  self.assertFalse(job_model.is_job_hook_receiver)
@@ -1269,7 +1282,7 @@ class RemoveScheduledJobManagementCommandTestCase(TestCase):
1269
1282
  for i in range(1, 7):
1270
1283
  models.ScheduledJob.objects.create(
1271
1284
  name=f"test{i}",
1272
- task="pass.TestPassJob",
1285
+ task="pass_job.TestPassJob",
1273
1286
  interval=JobExecutionType.TYPE_FUTURE,
1274
1287
  user=self.user,
1275
1288
  start_time=timezone.now() - datetime.timedelta(days=i * 30),
@@ -1278,7 +1291,7 @@ class RemoveScheduledJobManagementCommandTestCase(TestCase):
1278
1291
 
1279
1292
  models.ScheduledJob.objects.create(
1280
1293
  name="test7",
1281
- task="pass.TestPassJob",
1294
+ task="pass_job.TestPassJob",
1282
1295
  interval=JobExecutionType.TYPE_DAILY,
1283
1296
  user=self.user,
1284
1297
  start_time=timezone.now() - datetime.timedelta(days=180),
@@ -1306,7 +1319,7 @@ class ScheduledJobIntervalTestCase(TestCase):
1306
1319
  start_time = timezone.now() + datetime.timedelta(days=6)
1307
1320
  scheduled_job = models.ScheduledJob.objects.create(
1308
1321
  name="weekly_interval",
1309
- task="pass.TestPassJob",
1322
+ task="pass_job.TestPassJob",
1310
1323
  interval=JobExecutionType.TYPE_WEEKLY,
1311
1324
  user=self.user,
1312
1325
  start_time=start_time,