nautobot 2.4.0__py3-none-any.whl → 2.4.0b1__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 (592) hide show
  1. nautobot/apps/__init__.py +1 -1
  2. nautobot/apps/api.py +8 -8
  3. nautobot/apps/change_logging.py +2 -2
  4. nautobot/apps/choices.py +4 -4
  5. nautobot/apps/events.py +3 -3
  6. nautobot/apps/factory.py +2 -2
  7. nautobot/apps/filters.py +1 -1
  8. nautobot/apps/forms.py +20 -20
  9. nautobot/apps/graphql.py +2 -2
  10. nautobot/apps/jobs.py +8 -8
  11. nautobot/apps/models.py +19 -19
  12. nautobot/apps/tables.py +1 -1
  13. nautobot/apps/testing.py +10 -10
  14. nautobot/apps/ui.py +2 -2
  15. nautobot/apps/utils.py +7 -7
  16. nautobot/apps/views.py +7 -7
  17. nautobot/circuits/api/serializers.py +0 -1
  18. nautobot/circuits/api/views.py +8 -4
  19. nautobot/circuits/tables.py +1 -2
  20. nautobot/circuits/templates/circuits/circuit_create.html +7 -1
  21. nautobot/circuits/views.py +3 -3
  22. nautobot/cloud/api/views.py +10 -6
  23. nautobot/cloud/models.py +1 -1
  24. nautobot/cloud/views.py +16 -0
  25. nautobot/core/api/fields.py +5 -5
  26. nautobot/core/api/filter_backends.py +9 -3
  27. nautobot/core/api/schema.py +2 -13
  28. nautobot/core/api/serializers.py +34 -40
  29. nautobot/core/api/views.py +4 -56
  30. nautobot/core/celery/log.py +4 -4
  31. nautobot/core/celery/schedulers.py +1 -1
  32. nautobot/core/choices.py +2 -2
  33. nautobot/core/events/__init__.py +3 -3
  34. nautobot/core/filters.py +16 -21
  35. nautobot/core/fixtures/user-data.json +59 -0
  36. nautobot/core/forms/__init__.py +19 -19
  37. nautobot/core/forms/fields.py +11 -14
  38. nautobot/core/forms/forms.py +2 -33
  39. nautobot/core/graphql/types.py +1 -1
  40. nautobot/core/jobs/__init__.py +7 -28
  41. nautobot/core/jobs/cleanup.py +12 -48
  42. nautobot/core/jobs/groups.py +1 -1
  43. nautobot/core/management/commands/validate_models.py +1 -1
  44. nautobot/core/models/__init__.py +1 -1
  45. nautobot/core/models/query_functions.py +2 -2
  46. nautobot/core/models/tree_queries.py +3 -6
  47. nautobot/core/settings.py +2 -29
  48. nautobot/core/settings.yaml +0 -21
  49. nautobot/core/tables.py +60 -74
  50. nautobot/core/templates/inc/media.html +0 -3
  51. nautobot/core/templates/inc/nav_menu.html +0 -1
  52. nautobot/core/templates/nautobot_config.py.j2 +0 -13
  53. nautobot/core/templates/search.html +0 -7
  54. nautobot/core/templates/utilities/render_jinja2.html +1 -1
  55. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  56. nautobot/core/templates/utilities/theme_preview.html +0 -7
  57. nautobot/core/templatetags/helpers.py +2 -11
  58. nautobot/core/testing/__init__.py +8 -8
  59. nautobot/core/testing/api.py +15 -170
  60. nautobot/core/testing/filters.py +2 -25
  61. nautobot/core/testing/forms.py +0 -2
  62. nautobot/core/testing/mixins.py +2 -7
  63. nautobot/core/testing/views.py +29 -44
  64. nautobot/core/tests/integration/test_app_home.py +1 -0
  65. nautobot/core/tests/integration/test_app_navbar.py +1 -0
  66. nautobot/core/tests/integration/test_filters.py +2 -0
  67. nautobot/core/tests/integration/test_home.py +1 -0
  68. nautobot/core/tests/integration/test_navbar.py +1 -0
  69. nautobot/core/tests/integration/test_view_authentication.py +0 -1
  70. nautobot/core/tests/runner.py +1 -1
  71. nautobot/core/tests/test_api.py +1 -98
  72. nautobot/core/tests/test_csv.py +3 -25
  73. nautobot/core/tests/test_forms.py +0 -1
  74. nautobot/core/tests/test_jobs.py +1 -303
  75. nautobot/core/tests/test_settings_schema.py +0 -7
  76. nautobot/core/tests/test_tables.py +0 -100
  77. nautobot/core/tests/test_utils.py +1 -63
  78. nautobot/core/tests/test_views.py +3 -30
  79. nautobot/core/ui/nav.py +0 -1
  80. nautobot/core/ui/object_detail.py +1 -15
  81. nautobot/core/urls.py +0 -11
  82. nautobot/core/utils/lookup.py +8 -11
  83. nautobot/core/utils/requests.py +9 -24
  84. nautobot/core/views/__init__.py +0 -42
  85. nautobot/core/views/generic.py +176 -78
  86. nautobot/core/views/mixins.py +34 -94
  87. nautobot/core/views/renderers.py +6 -6
  88. nautobot/dcim/api/serializers.py +62 -54
  89. nautobot/dcim/api/views.py +113 -47
  90. nautobot/dcim/filters/__init__.py +2 -31
  91. nautobot/dcim/forms.py +17 -36
  92. nautobot/dcim/graphql/types.py +2 -2
  93. nautobot/dcim/models/__init__.py +1 -1
  94. nautobot/dcim/models/device_component_templates.py +2 -2
  95. nautobot/dcim/models/device_components.py +20 -22
  96. nautobot/dcim/models/devices.py +1 -10
  97. nautobot/dcim/models/locations.py +3 -3
  98. nautobot/dcim/models/power.py +5 -6
  99. nautobot/dcim/models/racks.py +4 -4
  100. nautobot/dcim/tables/__init__.py +3 -3
  101. nautobot/dcim/tables/devices.py +5 -7
  102. nautobot/dcim/tables/devicetypes.py +2 -2
  103. nautobot/dcim/tables/racks.py +1 -1
  104. nautobot/dcim/templates/dcim/controller_create.html +7 -1
  105. nautobot/dcim/templates/dcim/controller_retrieve.html +9 -1
  106. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -2
  107. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -5
  108. nautobot/dcim/templates/dcim/device.html +9 -1
  109. nautobot/dcim/templates/dcim/device_edit.html +37 -36
  110. nautobot/dcim/templates/dcim/location.html +9 -1
  111. nautobot/dcim/templates/dcim/location_edit.html +7 -1
  112. nautobot/dcim/templates/dcim/rack.html +9 -1
  113. nautobot/dcim/templates/dcim/rack_edit.html +7 -1
  114. nautobot/dcim/templates/dcim/rackreservation.html +9 -1
  115. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +9 -1
  116. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +7 -1
  117. nautobot/dcim/tests/test_api.py +3 -16
  118. nautobot/dcim/tests/test_filters.py +0 -33
  119. nautobot/dcim/tests/test_forms.py +2 -51
  120. nautobot/dcim/tests/test_graphql.py +0 -52
  121. nautobot/dcim/tests/test_models.py +5 -34
  122. nautobot/dcim/tests/test_views.py +83 -21
  123. nautobot/dcim/views.py +13 -1
  124. nautobot/extras/api/customfields.py +2 -2
  125. nautobot/extras/api/serializers.py +85 -90
  126. nautobot/extras/api/views.py +27 -22
  127. nautobot/extras/constants.py +0 -2
  128. nautobot/extras/filters/__init__.py +6 -8
  129. nautobot/extras/forms/base.py +2 -2
  130. nautobot/extras/forms/forms.py +31 -139
  131. nautobot/extras/forms/mixins.py +5 -13
  132. nautobot/extras/group_sync.py +3 -3
  133. nautobot/extras/health_checks.py +2 -1
  134. nautobot/extras/jobs.py +12 -70
  135. nautobot/extras/managers.py +1 -3
  136. nautobot/extras/migrations/0018_joblog_data_migration.py +9 -7
  137. nautobot/extras/models/__init__.py +1 -1
  138. nautobot/extras/models/contacts.py +1 -1
  139. nautobot/extras/models/customfields.py +11 -12
  140. nautobot/extras/models/groups.py +9 -11
  141. nautobot/extras/models/jobs.py +4 -23
  142. nautobot/extras/models/models.py +2 -2
  143. nautobot/extras/plugins/__init__.py +2 -13
  144. nautobot/extras/plugins/marketplace_manifest.yml +79 -84
  145. nautobot/extras/plugins/tables.py +14 -16
  146. nautobot/extras/plugins/views.py +69 -65
  147. nautobot/extras/registry.py +1 -1
  148. nautobot/extras/secrets/__init__.py +2 -2
  149. nautobot/extras/tables.py +5 -7
  150. nautobot/extras/templates/extras/dynamicgroup.html +9 -1
  151. nautobot/extras/templates/extras/job_detail.html +0 -16
  152. nautobot/extras/templates/extras/job_edit.html +0 -1
  153. nautobot/extras/templates/extras/jobqueue_retrieve.html +9 -1
  154. nautobot/extras/templates/extras/marketplace.html +11 -29
  155. nautobot/extras/templates/extras/plugin_detail.html +15 -32
  156. nautobot/extras/templates/extras/plugins_tiles.html +10 -21
  157. nautobot/extras/test_jobs/api_test_job.py +1 -1
  158. nautobot/extras/test_jobs/atomic_transaction.py +2 -2
  159. nautobot/extras/test_jobs/dry_run.py +1 -1
  160. nautobot/extras/test_jobs/fail.py +5 -5
  161. nautobot/extras/test_jobs/file_output.py +1 -1
  162. nautobot/extras/test_jobs/file_upload_fail.py +1 -1
  163. nautobot/extras/test_jobs/file_upload_pass.py +1 -1
  164. nautobot/extras/test_jobs/ipaddress_vars.py +1 -3
  165. nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
  166. nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
  167. nautobot/extras/test_jobs/log_redaction.py +1 -1
  168. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
  169. nautobot/extras/test_jobs/modify_db.py +1 -1
  170. nautobot/extras/test_jobs/object_var_optional.py +1 -1
  171. nautobot/extras/test_jobs/object_var_required.py +1 -1
  172. nautobot/extras/test_jobs/object_vars.py +1 -1
  173. nautobot/extras/test_jobs/pass.py +3 -3
  174. nautobot/extras/test_jobs/profiling.py +1 -1
  175. nautobot/extras/test_jobs/relative_import.py +3 -3
  176. nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
  177. nautobot/extras/test_jobs/task_queues.py +1 -1
  178. nautobot/extras/tests/integration/test_plugin_banner.py +2 -0
  179. nautobot/extras/tests/test_api.py +13 -13
  180. nautobot/extras/tests/test_customfields.py +1 -1
  181. nautobot/extras/tests/test_datasources.py +1 -2
  182. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  183. nautobot/extras/tests/test_filters.py +6 -6
  184. nautobot/extras/tests/test_forms.py +1 -20
  185. nautobot/extras/tests/test_jobs.py +19 -160
  186. nautobot/extras/tests/test_models.py +10 -10
  187. nautobot/extras/tests/test_plugins.py +9 -62
  188. nautobot/extras/tests/test_relationships.py +9 -120
  189. nautobot/extras/tests/test_views.py +191 -52
  190. nautobot/extras/utils.py +2 -3
  191. nautobot/extras/views.py +98 -30
  192. nautobot/ipam/api/fields.py +3 -3
  193. nautobot/ipam/api/serializers.py +33 -41
  194. nautobot/ipam/api/views.py +117 -68
  195. nautobot/ipam/factory.py +1 -1
  196. nautobot/ipam/filters.py +2 -3
  197. nautobot/ipam/lookups.py +62 -101
  198. nautobot/ipam/models.py +16 -66
  199. nautobot/ipam/querysets.py +2 -2
  200. nautobot/ipam/tables.py +7 -23
  201. nautobot/ipam/templates/ipam/ipaddress.html +9 -1
  202. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +7 -1
  203. nautobot/ipam/templates/ipam/ipaddress_edit.html +7 -1
  204. nautobot/ipam/templates/ipam/prefix.html +9 -1
  205. nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
  206. nautobot/ipam/templates/ipam/vlan.html +9 -1
  207. nautobot/ipam/templates/ipam/vlan_edit.html +7 -1
  208. nautobot/ipam/templates/ipam/vrf_edit.html +7 -1
  209. nautobot/ipam/tests/test_api.py +3 -416
  210. nautobot/ipam/tests/test_forms.py +47 -49
  211. nautobot/ipam/tests/test_migrations.py +30 -30
  212. nautobot/ipam/tests/test_models.py +34 -95
  213. nautobot/ipam/tests/test_querysets.py +1 -63
  214. nautobot/ipam/tests/test_views.py +0 -3
  215. nautobot/ipam/utils/__init__.py +6 -36
  216. nautobot/ipam/views.py +87 -61
  217. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  218. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  219. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +2 -40
  220. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  221. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  222. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  223. nautobot/project-static/docs/404.html +4 -46
  224. nautobot/project-static/docs/apps/index.html +4 -46
  225. nautobot/project-static/docs/apps/nautobot-apps.html +6 -47
  226. nautobot/project-static/docs/assets/_mkdocstrings.css +1 -25
  227. nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js → bundle.83f73b43.min.js} +2 -2
  228. nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js.map → bundle.83f73b43.min.js.map} +2 -2
  229. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +10 -62
  230. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +7 -59
  231. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +122 -374
  232. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +18 -90
  233. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +21 -95
  234. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +6 -53
  235. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +5 -52
  236. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +17 -79
  237. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +28 -102
  238. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +21 -108
  239. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +38 -131
  240. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +65 -239
  241. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +165 -581
  242. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +36 -109
  243. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +167 -453
  244. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +211 -493
  245. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +8 -60
  246. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +15 -71
  247. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +55 -407
  248. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +205 -585
  249. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +412 -858
  250. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +7 -59
  251. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +186 -448
  252. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +147 -365
  253. nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -46
  254. nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -46
  255. nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -46
  256. nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -46
  257. nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -46
  258. nautobot/project-static/docs/development/apps/api/models/index.html +4 -46
  259. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -46
  260. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -46
  261. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -46
  262. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -46
  263. nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -46
  264. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -46
  265. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -46
  266. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -46
  267. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -46
  268. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +7 -68
  269. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -46
  270. nautobot/project-static/docs/development/apps/api/prometheus.html +4 -46
  271. nautobot/project-static/docs/development/apps/api/setup.html +4 -46
  272. nautobot/project-static/docs/development/apps/api/testing.html +4 -46
  273. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -46
  274. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -46
  275. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -46
  276. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -46
  277. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -46
  278. nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -46
  279. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -46
  280. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -46
  281. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -46
  282. nautobot/project-static/docs/development/apps/api/views/index.html +4 -46
  283. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -46
  284. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -46
  285. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -46
  286. nautobot/project-static/docs/development/apps/api/views/notes.html +4 -46
  287. nautobot/project-static/docs/development/apps/api/views/rest-api.html +6 -52
  288. nautobot/project-static/docs/development/apps/api/views/urls.html +4 -46
  289. nautobot/project-static/docs/development/apps/index.html +4 -46
  290. nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -46
  291. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -46
  292. nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -46
  293. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -46
  294. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -46
  295. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -46
  296. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -46
  297. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +8 -50
  298. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -46
  299. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +14 -211
  300. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -46
  301. nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -46
  302. nautobot/project-static/docs/development/core/application-registry.html +4 -46
  303. nautobot/project-static/docs/development/core/best-practices.html +4 -46
  304. nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -46
  305. nautobot/project-static/docs/development/core/caching.html +4 -46
  306. nautobot/project-static/docs/development/core/controllers.html +4 -46
  307. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +74 -73
  308. nautobot/project-static/docs/development/core/generic-views.html +4 -46
  309. nautobot/project-static/docs/development/core/getting-started.html +224 -249
  310. nautobot/project-static/docs/development/core/homepage.html +7 -49
  311. nautobot/project-static/docs/development/core/index.html +4 -46
  312. nautobot/project-static/docs/development/core/{minikube-dev-environment-for-k8s-jobs.html → local-k8s.html} +168 -469
  313. nautobot/project-static/docs/development/core/model-checklist.html +12 -56
  314. nautobot/project-static/docs/development/core/model-features.html +4 -46
  315. nautobot/project-static/docs/development/core/natural-keys.html +4 -46
  316. nautobot/project-static/docs/development/core/navigation-menu.html +4 -46
  317. nautobot/project-static/docs/development/core/release-checklist.html +7 -49
  318. nautobot/project-static/docs/development/core/role-internals.html +4 -46
  319. nautobot/project-static/docs/development/core/settings.html +4 -46
  320. nautobot/project-static/docs/development/core/style-guide.html +7 -49
  321. nautobot/project-static/docs/development/core/templates.html +4 -46
  322. nautobot/project-static/docs/development/core/testing.html +4 -46
  323. nautobot/project-static/docs/development/core/ui-component-framework.html +273 -369
  324. nautobot/project-static/docs/development/core/user-preferences.html +4 -46
  325. nautobot/project-static/docs/development/index.html +4 -46
  326. nautobot/project-static/docs/development/jobs/index.html +122 -216
  327. nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -46
  328. nautobot/project-static/docs/index.html +23 -54
  329. nautobot/project-static/docs/objects.inv +0 -0
  330. nautobot/project-static/docs/overview/application_stack.html +7 -47
  331. nautobot/project-static/docs/overview/design_philosophy.html +4 -46
  332. nautobot/project-static/docs/release-notes/index.html +12 -52
  333. nautobot/project-static/docs/release-notes/version-1.0.html +193 -234
  334. nautobot/project-static/docs/release-notes/version-1.1.html +190 -231
  335. nautobot/project-static/docs/release-notes/version-1.2.html +265 -306
  336. nautobot/project-static/docs/release-notes/version-1.3.html +291 -332
  337. nautobot/project-static/docs/release-notes/version-1.4.html +377 -417
  338. nautobot/project-static/docs/release-notes/version-1.5.html +566 -605
  339. nautobot/project-static/docs/release-notes/version-1.6.html +447 -904
  340. nautobot/project-static/docs/release-notes/version-2.0.html +489 -528
  341. nautobot/project-static/docs/release-notes/version-2.1.html +324 -363
  342. nautobot/project-static/docs/release-notes/version-2.2.html +317 -356
  343. nautobot/project-static/docs/release-notes/version-2.3.html +352 -997
  344. nautobot/project-static/docs/release-notes/version-2.4.html +101 -417
  345. nautobot/project-static/docs/requirements.txt +2 -2
  346. nautobot/project-static/docs/search/search_index.json +1 -1
  347. nautobot/project-static/docs/sitemap.xml +287 -295
  348. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  349. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -46
  350. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
  351. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +6 -48
  352. nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -46
  353. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -46
  354. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +8 -110
  355. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -46
  356. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -46
  357. nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -46
  358. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -46
  359. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -46
  360. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -46
  361. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -46
  362. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -46
  363. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +6 -48
  364. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -46
  365. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -46
  366. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -46
  367. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +8 -66
  368. nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -46
  369. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +5 -47
  370. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -46
  371. nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -46
  372. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -46
  373. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -46
  374. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -46
  375. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -46
  376. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -46
  377. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -46
  378. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -46
  379. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -46
  380. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -46
  381. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +8 -49
  382. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -46
  383. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -46
  384. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -46
  385. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -46
  386. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -46
  387. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -46
  388. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -46
  389. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -46
  390. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -46
  391. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -46
  392. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -46
  393. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -46
  394. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -46
  395. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -46
  396. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -46
  397. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -46
  398. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -46
  399. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -46
  400. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -46
  401. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -46
  402. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -46
  403. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -46
  404. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -46
  405. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -46
  406. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -46
  407. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -46
  408. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -46
  409. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -46
  410. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -46
  411. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -46
  412. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -46
  413. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -46
  414. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -46
  415. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -46
  416. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -46
  417. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -46
  418. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -46
  419. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -46
  420. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -46
  421. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -46
  422. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -46
  423. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -46
  424. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -46
  425. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -46
  426. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -46
  427. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -46
  428. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -46
  429. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -46
  430. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -46
  431. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -46
  432. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -46
  433. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -46
  434. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -46
  435. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -46
  436. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -46
  437. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -46
  438. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -46
  439. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +12 -50
  440. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -46
  441. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -46
  442. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -46
  443. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -46
  444. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -46
  445. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -46
  446. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -46
  447. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -46
  448. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -46
  449. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -46
  450. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -46
  451. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -46
  452. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +7 -49
  453. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -46
  454. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -46
  455. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -46
  456. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -46
  457. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -46
  458. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -46
  459. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -46
  460. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -46
  461. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -46
  462. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -46
  463. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -46
  464. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -46
  465. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -46
  466. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -46
  467. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -46
  468. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -46
  469. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -46
  470. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -46
  471. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -46
  472. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -46
  473. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -46
  474. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -46
  475. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +7 -51
  476. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -46
  477. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -46
  478. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -46
  479. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +7 -49
  480. nautobot/project-static/docs/user-guide/index.html +4 -46
  481. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -46
  482. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +8 -50
  483. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -46
  484. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -46
  485. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -46
  486. nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -46
  487. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -46
  488. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -46
  489. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -46
  490. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -46
  491. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -46
  492. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -46
  493. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +7 -50
  494. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -46
  495. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +7 -49
  496. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -46
  497. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -46
  498. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -46
  499. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -46
  500. nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -46
  501. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -46
  502. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +5 -47
  503. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -46
  504. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -46
  505. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +25 -94
  506. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +5 -74
  507. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -46
  508. nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -46
  509. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -46
  510. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -46
  511. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -46
  512. nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -46
  513. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -46
  514. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -46
  515. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -46
  516. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -46
  517. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -46
  518. nautobot/project-static/js/forms.js +1 -1
  519. nautobot/tenancy/api/views.py +13 -9
  520. nautobot/tenancy/views.py +2 -4
  521. nautobot/users/admin.py +1 -1
  522. nautobot/users/api/serializers.py +4 -5
  523. nautobot/users/api/views.py +3 -3
  524. nautobot/virtualization/api/serializers.py +4 -4
  525. nautobot/virtualization/api/views.py +24 -5
  526. nautobot/virtualization/filters.py +3 -20
  527. nautobot/virtualization/models.py +1 -1
  528. nautobot/virtualization/tables.py +2 -2
  529. nautobot/virtualization/templates/virtualization/cluster_edit.html +7 -1
  530. nautobot/virtualization/templates/virtualization/virtualmachine.html +9 -1
  531. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +8 -2
  532. nautobot/virtualization/tests/test_filters.py +0 -17
  533. nautobot/wireless/filters.py +2 -2
  534. nautobot/wireless/forms.py +1 -1
  535. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +9 -1
  536. nautobot/wireless/tests/test_filters.py +1 -29
  537. nautobot/wireless/views.py +10 -0
  538. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/METADATA +6 -6
  539. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/RECORD +543 -591
  540. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/WHEEL +1 -1
  541. nautobot/core/api/constants.py +0 -11
  542. nautobot/core/jobs/bulk_actions.py +0 -248
  543. nautobot/core/templates/about.html +0 -67
  544. nautobot/core/templates/inc/tenancy_form_panel.html +0 -9
  545. nautobot/core/templates/inc/tenant_table_row.html +0 -11
  546. nautobot/core/utils/querysets.py +0 -64
  547. nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +0 -25
  548. nautobot/dcim/tests/integration/test_controller.py +0 -62
  549. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +0 -71
  550. nautobot/dcim/tests/test_jobs.py +0 -118
  551. nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +0 -22
  552. nautobot/extras/migrations/0121_alter_team_contacts.py +0 -17
  553. nautobot/extras/test_jobs/singleton.py +0 -16
  554. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
  555. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
  556. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
  557. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
  558. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
  559. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
  560. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
  561. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
  562. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
  563. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
  564. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
  565. nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
  566. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
  567. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
  568. nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
  569. nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
  570. nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
  571. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
  572. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -9444
  587. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -9722
  588. nautobot/wireless/tests/integration/__init__.py +0 -0
  589. nautobot/wireless/tests/integration/test_radio_profile.py +0 -42
  590. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/LICENSE.txt +0 -0
  591. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/NOTICE +0 -0
  592. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/entry_points.txt +0 -0
@@ -38,8 +38,6 @@ from nautobot.extras.choices import (
38
38
  )
39
39
  from nautobot.extras.context_managers import change_logging, JobHookChangeContext, web_request_context
40
40
  from nautobot.extras.jobs import get_job, get_jobs
41
- from nautobot.extras.models import Job, JobQueue
42
- from nautobot.extras.models.jobs import JobLogEntry
43
41
 
44
42
 
45
43
  class JobTest(TestCase):
@@ -163,7 +161,7 @@ class JobTest(TestCase):
163
161
  self.assertTrue(job_model.supports_dryrun)
164
162
 
165
163
  module = "pass"
166
- name = "TestPassJob"
164
+ name = "TestPass"
167
165
  job_class, job_model = get_job_class_and_model(module, name)
168
166
  self.assertFalse(job_class.supports_dryrun)
169
167
  self.assertFalse(job_model.supports_dryrun)
@@ -193,31 +191,27 @@ class JobTest(TestCase):
193
191
  with override_settings(JOBS_ROOT=temp_dir):
194
192
  # Create a new Job and make sure it's discovered correctly
195
193
  with open(os.path.join(temp_dir, "my_jobs.py"), "w") as fd:
196
- fd.write(
197
- """\
194
+ fd.write("""\
198
195
  from nautobot.apps.jobs import Job, register_jobs
199
196
  class MyJob(Job):
200
197
  def run(self):
201
198
  pass
202
199
  register_jobs(MyJob)
203
- """
204
- )
200
+ """)
205
201
  jobs_data = get_jobs(reload=True)
206
202
  self.assertIn("my_jobs.MyJob", jobs_data.keys())
207
203
  self.assertIsNotNone(get_job("my_jobs.MyJob"))
208
204
  # Also make sure some representative previous JOBS_ROOT jobs aren't still around:
209
205
  self.assertNotIn("dry_run.TestDryRun", jobs_data.keys())
210
- self.assertNotIn("pass.TestPassJob", jobs_data.keys())
206
+ self.assertNotIn("pass.TestPass", jobs_data.keys())
211
207
 
212
208
  # Create a second Job in the same module
213
209
  with open(os.path.join(temp_dir, "my_jobs.py"), "a") as fd:
214
- fd.write(
215
- """
210
+ fd.write("""
216
211
  class MyOtherJob(MyJob):
217
212
  pass
218
213
  register_jobs(MyOtherJob)
219
- """
220
- )
214
+ """)
221
215
  jobs_data = get_jobs(reload=True)
222
216
  self.assertIn("my_jobs.MyJob", jobs_data.keys())
223
217
  self.assertIsNotNone(get_job("my_jobs.MyJob"))
@@ -226,16 +220,14 @@ register_jobs(MyOtherJob)
226
220
 
227
221
  # Create a third Job in another module
228
222
  with open(os.path.join(temp_dir, "their_jobs.py"), "w") as fd:
229
- fd.write(
230
- """
223
+ fd.write("""
231
224
  from nautobot.apps.jobs import Job, register_jobs
232
225
 
233
226
  class MyJob(Job):
234
227
  def run(self):
235
228
  pass
236
229
  register_jobs(MyJob)
237
- """
238
- )
230
+ """)
239
231
  jobs_data = get_jobs(reload=True)
240
232
  self.assertIn("my_jobs.MyJob", jobs_data.keys())
241
233
  self.assertIsNotNone(get_job("my_jobs.MyJob"))
@@ -257,16 +249,14 @@ register_jobs(MyJob)
257
249
 
258
250
  # Create a module with an inauspicious name
259
251
  with open(os.path.join(temp_dir, "traceback.py"), "w") as fd:
260
- fd.write(
261
- """
252
+ fd.write("""
262
253
  from nautobot.apps.jobs import Job, register_jobs
263
254
 
264
255
  class BadJob(Job):
265
256
  def run(self):
266
257
  raise RuntimeError("You ran a bad job!")
267
258
  register_jobs(BadJob)
268
- """
269
- )
259
+ """)
270
260
  jobs_data = get_jobs(reload=True)
271
261
  self.assertIn("my_jobs.MyJob", jobs_data.keys())
272
262
  self.assertIsNotNone(get_job("my_jobs.MyJob"))
@@ -298,105 +288,6 @@ class JobTransactionTest(TransactionTestCase):
298
288
  self.request.id = uuid.uuid4()
299
289
  self.request.user = self.user
300
290
 
301
- def test_bulk_delete_system_jobs_fail(self):
302
- system_job_queryset = Job.objects.filter(module_name__startswith="nautobot.")
303
- pk_list = [str(pk) for pk in system_job_queryset.values_list("pk", flat=True)[:3]]
304
- initial_count = Job.objects.all().count()
305
- self.add_permissions("extras.delete_job")
306
- job_result = create_job_result_and_run_job(
307
- "nautobot.core.jobs.bulk_actions",
308
- "BulkDeleteObjects",
309
- content_type=ContentType.objects.get_for_model(Job).id,
310
- delete_all=False,
311
- filter_query_params={},
312
- pk_list=pk_list,
313
- username=self.user.username,
314
- )
315
- self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_FAILURE)
316
- error_log = JobLogEntry.objects.get(job_result=job_result, log_level=LogLevelChoices.LOG_ERROR)
317
- self.assertIn(
318
- f"Unable to delete Job {system_job_queryset.first()}. System Job cannot be deleted", error_log.message
319
- )
320
- self.assertEqual(initial_count, Job.objects.all().count())
321
-
322
- def test_job_bulk_edit_default_queue_stays_default_after_one_field_update(self):
323
- self.add_permissions("extras.change_job", "extras.view_job")
324
- job_class_to_test = "TestPassJob"
325
- job_description = "default job queue test"
326
- job_to_test = Job.objects.get(job_class_name=job_class_to_test)
327
- queryset = Job.objects.filter(installed=True, hidden=False, job_class_name=job_class_to_test)
328
- default_job_queue = job_to_test.default_job_queue
329
- pk_list = list(queryset.values_list("pk", flat=True))
330
-
331
- job_ct = ContentType.objects.get_for_model(Job)
332
- job_result = create_job_result_and_run_job(
333
- "nautobot.core.jobs.bulk_actions",
334
- "BulkEditObjects",
335
- content_type=job_ct.id,
336
- edit_all=False,
337
- filter_query_params={},
338
- form_data={
339
- "pk": pk_list,
340
- "description": job_description,
341
- },
342
- username=self.user.username,
343
- )
344
- self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
345
- self.assertEqual(Job.objects.filter(description=job_description).count(), queryset.count())
346
- self.assertFalse(
347
- JobLogEntry.objects.filter(job_result=job_result, log_level=LogLevelChoices.LOG_WARNING).exists()
348
- )
349
- self.assertFalse(
350
- JobLogEntry.objects.filter(job_result=job_result, log_level=LogLevelChoices.LOG_ERROR).exists()
351
- )
352
- instance = Job.objects.get(job_class_name=job_class_to_test)
353
- self.assertEqual(instance.description, job_description)
354
- self.assertEqual(instance.default_job_queue, default_job_queue)
355
-
356
- def test_job_bulk_edit_preserve_job_queues_after_one_field_update(self):
357
- self.add_permissions("extras.change_job", "extras.view_job")
358
- job_class_to_test = "TestPassJob"
359
- job_description = "job queues test"
360
- job_to_test = Job.objects.get(job_class_name=job_class_to_test)
361
-
362
- # Simulate 3 job queues set
363
- job_queues = JobQueue.objects.all()[:3]
364
- job_to_test.job_queues.set(job_queues)
365
- job_to_test.job_queues.add(job_to_test.default_job_queue)
366
- job_to_test.job_queues_override = True
367
- job_to_test.save()
368
-
369
- expected_job_queues = list(job_to_test.job_queues.values_list("pk", flat=True))
370
-
371
- queryset = Job.objects.filter(installed=True, hidden=False, job_class_name=job_class_to_test)
372
- pk_list = list(queryset.values_list("pk", flat=True))
373
-
374
- job_ct = ContentType.objects.get_for_model(Job)
375
- job_result = create_job_result_and_run_job(
376
- "nautobot.core.jobs.bulk_actions",
377
- "BulkEditObjects",
378
- content_type=job_ct.id,
379
- edit_all=False,
380
- filter_query_params={},
381
- form_data={
382
- "pk": pk_list,
383
- "description": job_description,
384
- },
385
- username=self.user.username,
386
- )
387
- self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
388
- self.assertEqual(Job.objects.filter(description=job_description).count(), queryset.count())
389
- self.assertFalse(
390
- JobLogEntry.objects.filter(job_result=job_result, log_level=LogLevelChoices.LOG_WARNING).exists()
391
- )
392
- self.assertFalse(
393
- JobLogEntry.objects.filter(job_result=job_result, log_level=LogLevelChoices.LOG_ERROR).exists()
394
- )
395
-
396
- instance = Job.objects.get(job_class_name=job_class_to_test)
397
- self.assertEqual(instance.description, job_description)
398
- self.assertQuerySetEqual(instance.job_queues.all(), JobQueue.objects.filter(pk__in=expected_job_queues))
399
-
400
291
  def test_job_hard_time_limit_less_than_soft_time_limit(self):
401
292
  """
402
293
  Job test which produces a warning log message because the time_limit is less than the soft_time_limit.
@@ -419,7 +310,7 @@ class JobTransactionTest(TransactionTestCase):
419
310
  Job test with pass result.
420
311
  """
421
312
  module = "pass"
422
- name = "TestPassJob"
313
+ name = "TestPass"
423
314
  job_result = create_job_result_and_run_job(module, name)
424
315
  self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
425
316
  self.assertEqual(job_result.result, True)
@@ -453,7 +344,7 @@ class JobTransactionTest(TransactionTestCase):
453
344
  Job test with fail result.
454
345
  """
455
346
  module = "fail"
456
- name = "TestFailJob"
347
+ name = "TestFail"
457
348
  job_result = create_job_result_and_run_job(module, name)
458
349
  self.assertEqual(job_result.status, JobResultStatusChoices.STATUS_FAILURE)
459
350
  logs = job_result.job_log_entries
@@ -688,7 +579,7 @@ class JobTransactionTest(TransactionTestCase):
688
579
  Job test to see if the latest_result property is indeed returning the most recent job result
689
580
  """
690
581
  module = "pass"
691
- name = "TestPassJob"
582
+ name = "TestPass"
692
583
  job_result_1 = create_job_result_and_run_job(module, name)
693
584
  self.assertEqual(job_result_1.status, JobResultStatusChoices.STATUS_SUCCESS)
694
585
  job_result_2 = create_job_result_and_run_job(module, name)
@@ -715,38 +606,6 @@ class JobTransactionTest(TransactionTestCase):
715
606
  self.assertTrue(profiling_result.exists())
716
607
  profiling_result.unlink()
717
608
 
718
- def test_job_singleton(self):
719
- module = "singleton"
720
- name = "TestSingletonJob"
721
-
722
- job_class, _ = get_job_class_and_model(module, name, "local")
723
- self.assertTrue(job_class.is_singleton)
724
- cache.set(job_class.singleton_cache_key, 1)
725
- failed_job_result = create_job_result_and_run_job(module, name)
726
-
727
- self.assertEqual(
728
- failed_job_result.status, JobResultStatusChoices.STATUS_FAILURE, msg="Duplicate singleton job didn't error."
729
- )
730
- self.assertIsNone(cache.get(job_class.singleton_cache_key, None))
731
-
732
- def test_job_ignore_singleton(self):
733
- module = "singleton"
734
- name = "TestSingletonJob"
735
-
736
- job_class, _ = get_job_class_and_model(module, name, "local")
737
- self.assertTrue(job_class.is_singleton)
738
- cache.set(job_class.singleton_cache_key, 1)
739
- passed_job_result = create_job_result_and_run_job(
740
- module, name, celery_kwargs={"nautobot_job_ignore_singleton_lock": True}
741
- )
742
-
743
- self.assertEqual(
744
- passed_job_result.status,
745
- JobResultStatusChoices.STATUS_SUCCESS,
746
- msg="Duplicate singleton job didn't succeed with nautobot_job_ignore_singleton_lock=True.",
747
- )
748
- self.assertIsNone(cache.get(job_class.singleton_cache_key, None))
749
-
750
609
  @mock.patch("nautobot.extras.context_managers.enqueue_webhooks")
751
610
  def test_job_fires_webhooks(self, mock_enqueue_webhooks):
752
611
  module = "atomic_transaction"
@@ -935,7 +794,7 @@ class RunJobManagementCommandTest(TransactionTestCase):
935
794
  def test_runjob_nochange_successful(self):
936
795
  """Basic success-path test for Jobs that don't modify the Nautobot database."""
937
796
  module = "pass"
938
- name = "TestPassJob"
797
+ name = "TestPass"
939
798
  _job_class, job_model = get_job_class_and_model(module, name)
940
799
 
941
800
  out, err = self.run_command("--local", "--no-color", "--username", self.user.username, job_model.class_path)
@@ -1033,7 +892,7 @@ class JobButtonReceiverTest(TestCase):
1033
892
  def test_is_job_button(self):
1034
893
  with self.subTest(expected=False):
1035
894
  module = "pass"
1036
- name = "TestPassJob"
895
+ name = "TestPass"
1037
896
  _job_class, job_model = get_job_class_and_model(module, name)
1038
897
  self.assertFalse(job_model.is_job_button_receiver)
1039
898
 
@@ -1096,7 +955,7 @@ class JobHookReceiverTest(TestCase):
1096
955
  def test_is_job_hook(self):
1097
956
  with self.subTest(expected=False):
1098
957
  module = "pass"
1099
- name = "TestPassJob"
958
+ name = "TestPass"
1100
959
  _job_class, job_model = get_job_class_and_model(module, name)
1101
960
  self.assertFalse(job_model.is_job_hook_receiver)
1102
961
 
@@ -1257,7 +1116,7 @@ class RemoveScheduledJobManagementCommandTestCase(TestCase):
1257
1116
  for i in range(1, 7):
1258
1117
  models.ScheduledJob.objects.create(
1259
1118
  name=f"test{i}",
1260
- task="pass.TestPassJob",
1119
+ task="pass.TestPass",
1261
1120
  interval=JobExecutionType.TYPE_FUTURE,
1262
1121
  user=self.user,
1263
1122
  start_time=timezone.now() - datetime.timedelta(days=i * 30),
@@ -1266,7 +1125,7 @@ class RemoveScheduledJobManagementCommandTestCase(TestCase):
1266
1125
 
1267
1126
  models.ScheduledJob.objects.create(
1268
1127
  name="test7",
1269
- task="pass.TestPassJob",
1128
+ task="pass.TestPass",
1270
1129
  interval=JobExecutionType.TYPE_DAILY,
1271
1130
  user=self.user,
1272
1131
  start_time=timezone.now() - datetime.timedelta(days=180),
@@ -1294,7 +1153,7 @@ class ScheduledJobIntervalTestCase(TestCase):
1294
1153
  start_time = timezone.now() + datetime.timedelta(days=6)
1295
1154
  scheduled_job = models.ScheduledJob.objects.create(
1296
1155
  name="weekly_interval",
1297
- task="pass.TestPassJob",
1156
+ task="pass.TestPass",
1298
1157
  interval=JobExecutionType.TYPE_WEEKLY,
1299
1158
  user=self.user,
1300
1159
  start_time=start_time,
@@ -1083,7 +1083,7 @@ class JobModelTest(ModelTestCases.BaseModelTestCase):
1083
1083
  @classmethod
1084
1084
  def setUpTestData(cls):
1085
1085
  # JobModel instances are automatically instantiated at startup, so we just need to look them up.
1086
- cls.local_job = JobModel.objects.get(job_class_name="TestPassJob")
1086
+ cls.local_job = JobModel.objects.get(job_class_name="TestPass")
1087
1087
  cls.job_containing_sensitive_variables = JobModel.objects.get(job_class_name="ExampleLoggingJob")
1088
1088
  cls.app_job = JobModel.objects.get(job_class_name="ExampleJob")
1089
1089
 
@@ -1095,7 +1095,7 @@ class JobModelTest(ModelTestCases.BaseModelTestCase):
1095
1095
  self.assertEqual(self.app_job.job_class, ExampleJob)
1096
1096
 
1097
1097
  def test_class_path(self):
1098
- self.assertEqual(self.local_job.class_path, "pass.TestPassJob")
1098
+ self.assertEqual(self.local_job.class_path, "pass.TestPass")
1099
1099
  self.assertIsNotNone(self.local_job.job_class)
1100
1100
  self.assertEqual(self.local_job.class_path, self.local_job.job_class.class_path)
1101
1101
 
@@ -1832,11 +1832,11 @@ class ScheduledJobTest(ModelTestCases.BaseModelTestCase):
1832
1832
 
1833
1833
  def setUp(self):
1834
1834
  self.user = User.objects.create_user(username="scheduledjobuser")
1835
- self.job_model = JobModel.objects.get(name="TestPassJob")
1835
+ self.job_model = JobModel.objects.get(name="TestPass")
1836
1836
 
1837
1837
  self.daily_utc_job = ScheduledJob.objects.create(
1838
1838
  name="Daily UTC Job",
1839
- task="pass.TestPassJob",
1839
+ task="pass.TestPass",
1840
1840
  job_model=self.job_model,
1841
1841
  interval=JobExecutionType.TYPE_DAILY,
1842
1842
  start_time=datetime(year=2050, month=1, day=22, hour=17, minute=0, tzinfo=get_default_timezone()),
@@ -1844,7 +1844,7 @@ class ScheduledJobTest(ModelTestCases.BaseModelTestCase):
1844
1844
  )
1845
1845
  self.daily_est_job = ScheduledJob.objects.create(
1846
1846
  name="Daily EST Job",
1847
- task="pass.TestPassJob",
1847
+ task="pass.TestPass",
1848
1848
  job_model=self.job_model,
1849
1849
  interval=JobExecutionType.TYPE_DAILY,
1850
1850
  start_time=datetime(year=2050, month=1, day=22, hour=17, minute=0, tzinfo=ZoneInfo("America/New_York")),
@@ -1859,7 +1859,7 @@ class ScheduledJobTest(ModelTestCases.BaseModelTestCase):
1859
1859
  )
1860
1860
  self.crontab_est_job = ScheduledJob.objects.create(
1861
1861
  name="Crontab EST Job",
1862
- task="pass.TestPassJob",
1862
+ task="pass.TestPass",
1863
1863
  job_model=self.job_model,
1864
1864
  interval=JobExecutionType.TYPE_CUSTOM,
1865
1865
  start_time=datetime(year=2050, month=1, day=22, hour=17, minute=0, tzinfo=ZoneInfo("America/New_York")),
@@ -1868,7 +1868,7 @@ class ScheduledJobTest(ModelTestCases.BaseModelTestCase):
1868
1868
  )
1869
1869
  self.one_off_utc_job = ScheduledJob.objects.create(
1870
1870
  name="One-off UTC Job",
1871
- task="pass.TestPassJob",
1871
+ task="pass.TestPass",
1872
1872
  job_model=self.job_model,
1873
1873
  interval=JobExecutionType.TYPE_FUTURE,
1874
1874
  start_time=datetime(year=2050, month=1, day=22, hour=0, minute=0, tzinfo=ZoneInfo("UTC")),
@@ -2015,7 +2015,7 @@ class ScheduledJobTest(ModelTestCases.BaseModelTestCase):
2015
2015
  """Test that TYPE_CUSTOM behavior around DST is as expected."""
2016
2016
  cronjob = ScheduledJob.objects.create(
2017
2017
  name="DST Aware Cronjob",
2018
- task="pass.TestPassJob",
2018
+ task="pass.TestPass",
2019
2019
  job_model=self.job_model,
2020
2020
  enabled=False,
2021
2021
  interval=JobExecutionType.TYPE_CUSTOM,
@@ -2070,7 +2070,7 @@ class ScheduledJobTest(ModelTestCases.BaseModelTestCase):
2070
2070
  """Test the interaction of TYPE_DAILY around DST."""
2071
2071
  daily = ScheduledJob.objects.create(
2072
2072
  name="Daily Job",
2073
- task="pass.TestPassJob",
2073
+ task="pass.TestPass",
2074
2074
  job_model=self.job_model,
2075
2075
  enabled=False,
2076
2076
  interval=JobExecutionType.TYPE_DAILY,
@@ -2638,7 +2638,7 @@ class JobLogEntryTest(TestCase): # TODO: change to BaseModelTestCase
2638
2638
 
2639
2639
  def setUp(self):
2640
2640
  module = "pass"
2641
- name = "TestPassJob"
2641
+ name = "TestPass"
2642
2642
  job_class = get_job(f"{module}.{name}")
2643
2643
 
2644
2644
  self.job_result = JobResult.objects.create(name=job_class.class_path, user=None)
@@ -1,6 +1,5 @@
1
- from unittest import mock, skip
1
+ from unittest import mock, skip, skipIf
2
2
 
3
- from django.apps import apps
4
3
  from django.conf import settings
5
4
  from django.contrib.contenttypes.models import ContentType
6
5
  from django.core.exceptions import ValidationError
@@ -22,7 +21,6 @@ from nautobot.extras.models import CustomField, Relationship, RelationshipAssoci
22
21
  from nautobot.extras.plugins.exceptions import PluginImproperlyConfigured
23
22
  from nautobot.extras.plugins.utils import load_plugin
24
23
  from nautobot.extras.plugins.validators import wrap_model_clean_methods
25
- from nautobot.extras.plugins.views import extract_app_data
26
24
  from nautobot.extras.registry import DatasourceContent, registry
27
25
  from nautobot.ipam.models import IPAddress, Namespace, Prefix
28
26
  from nautobot.tenancy.filters import TenantFilterSet
@@ -317,61 +315,6 @@ class AppListViewTest(TestCase):
317
315
  response_body = extract_page_body(response.content.decode(response.charset)).lower()
318
316
  self.assertIn("example app", response_body, msg=response_body)
319
317
 
320
- def test_extract_app_data(self):
321
- app_config = apps.get_app_config("example_app")
322
- # Without a corresponding entry in marketplace_data
323
- self.assertEqual(
324
- extract_app_data(app_config, {"apps": []}),
325
- {
326
- "name": "Example Nautobot App",
327
- "package": "example_app",
328
- "app_label": "example_app",
329
- "author": "Nautobot development team",
330
- "author_email": "nautobot@example.com",
331
- "headline": "For testing purposes only",
332
- "description": "For testing purposes only",
333
- "version": "1.0.0",
334
- "home_url": "plugins:example_app:home",
335
- "config_url": "plugins:example_app:config",
336
- "docs_url": "plugins:example_app:docs",
337
- },
338
- )
339
-
340
- # With a corresponding entry in marketplace_data
341
- mock_marketplace_data = {
342
- "apps": [
343
- {
344
- "name": "Nautobot Example App",
345
- "use_cases": ["Example", "Development"],
346
- "requires": [],
347
- "docs": "https://example.com/docs/example_app/",
348
- "headline": "Demonstrate and test various parts of Nautobot App APIs and functionality.",
349
- "description": "An example of the kinds of things a Nautobot App can do, including ...",
350
- "package_name": "example_app",
351
- "author": "Network to Code (NTC)",
352
- "availability": "Open Source",
353
- "icon": "...",
354
- },
355
- ],
356
- }
357
- self.assertEqual(
358
- extract_app_data(app_config, mock_marketplace_data),
359
- {
360
- "name": "Nautobot Example App",
361
- "package": "example_app",
362
- "app_label": "example_app",
363
- "author": "Network to Code (NTC)",
364
- "author_email": "nautobot@example.com",
365
- "availability": "Open Source",
366
- "headline": "Demonstrate and test various parts of Nautobot App APIs and functionality.",
367
- "description": "An example of the kinds of things a Nautobot App can do, including ...",
368
- "version": "1.0.0",
369
- "home_url": "plugins:example_app:home",
370
- "config_url": "plugins:example_app:config",
371
- "docs_url": "plugins:example_app:docs",
372
- },
373
- )
374
-
375
318
 
376
319
  class PluginDetailViewTest(TestCase):
377
320
  def test_view_detail_anonymous(self):
@@ -857,6 +800,10 @@ class TestAppCoreViewOverrides(TestCase):
857
800
  )
858
801
 
859
802
 
803
+ @skipIf(
804
+ "example_plugin" not in settings.PLUGINS,
805
+ "example_plugin not in settings.PLUGINS",
806
+ )
860
807
  class PluginTemplateExtensionsTest(TestCase):
861
808
  """
862
809
  Test that registered TemplateExtensions inject content as expected
@@ -876,19 +823,19 @@ class PluginTemplateExtensionsTest(TestCase):
876
823
  def test_detail_view_buttons(self):
877
824
  response = self.client.get(reverse("dcim:location", kwargs={"pk": self.location.pk}))
878
825
  response_body = extract_page_body(response.content.decode(response.charset))
879
- self.assertIn("APP INJECTED LOCATION CONTENT - BUTTONS", response_body, msg=response_body)
826
+ self.assertIn("LOCATION CONTENT - BUTTONS", response_body, msg=response_body)
880
827
 
881
828
  def test_detail_view_left_page(self):
882
829
  response = self.client.get(reverse("dcim:location", kwargs={"pk": self.location.pk}))
883
830
  response_body = extract_page_body(response.content.decode(response.charset))
884
- self.assertIn("App Injected Content - Left", response_body, msg=response_body)
831
+ self.assertIn("LOCATION CONTENT - LEFT PAGE", response_body, msg=response_body)
885
832
 
886
833
  def test_detail_view_right_page(self):
887
834
  response = self.client.get(reverse("dcim:location", kwargs={"pk": self.location.pk}))
888
835
  response_body = extract_page_body(response.content.decode(response.charset))
889
- self.assertIn("App Injected Content - Right", response_body, msg=response_body)
836
+ self.assertIn("LOCATION CONTENT - RIGHT PAGE", response_body, msg=response_body)
890
837
 
891
838
  def test_detail_view_full_width_page(self):
892
839
  response = self.client.get(reverse("dcim:location", kwargs={"pk": self.location.pk}))
893
840
  response_body = extract_page_body(response.content.decode(response.charset))
894
- self.assertIn("App Injected Content - Full Width", response_body, msg=response_body)
841
+ self.assertIn("LOCATION CONTENT - FULL WIDTH PAGE", response_body, msg=response_body)