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
@@ -19,6 +19,7 @@ from nautobot.core.api import (
19
19
  ValidatedModelSerializer,
20
20
  )
21
21
  from nautobot.core.api.exceptions import SerializerNotFound
22
+ from nautobot.core.api.fields import NautobotHyperlinkedRelatedField
22
23
  from nautobot.core.api.serializers import PolymorphicProxySerializer
23
24
  from nautobot.core.api.utils import (
24
25
  get_nested_serializer_depth,
@@ -135,12 +136,12 @@ class ConfigContextSerializer(ValidatedModelSerializer, TaggedModelSerializerMix
135
136
  owner = serializers.SerializerMethodField(read_only=True)
136
137
 
137
138
  # Conditional enablement of dynamic groups filtering
138
- @property
139
- def fields(self):
140
- fields = super().fields
139
+ def __init__(self, *args, **kwargs):
140
+ super().__init__(*args, **kwargs)
141
+
141
142
  if not settings.CONFIG_CONTEXT_DYNAMIC_GROUPS_ENABLED:
142
- fields.pop("dynamic_groups", None)
143
- return fields
143
+ # In the case of a nested serializer, we won't have a `dynamic_groups` field at all.
144
+ self.fields.pop("dynamic_groups", None)
144
145
 
145
146
  class Meta:
146
147
  model = ConfigContext
@@ -199,7 +200,10 @@ class ConfigContextSchemaSerializer(NautobotModelSerializer):
199
200
  #
200
201
 
201
202
 
202
- class ContactSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
203
+ class ContactSerializer(NautobotModelSerializer):
204
+ # needed since this is the reverse side of the M2M field.
205
+ teams = NautobotHyperlinkedRelatedField(queryset=Team.objects.all(), many=True, required=False)
206
+
203
207
  class Meta:
204
208
  model = Contact
205
209
  fields = "__all__"
@@ -208,22 +212,15 @@ class ContactSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
208
212
  extra_kwargs = {
209
213
  "email": {"default": ""},
210
214
  "phone": {"default": ""},
211
- "teams": {"required": False},
212
215
  }
213
216
 
214
- def get_field_names(self, declared_fields, info):
215
- """Add reverse M2M for teams to the fields for this serializer."""
216
- field_names = list(super().get_field_names(declared_fields, info))
217
- self.extend_field_names(field_names, "teams")
218
- return field_names
219
-
220
- def validate(self, attrs):
221
- local_attrs = attrs.copy()
222
- local_attrs.pop("teams", None)
217
+ def validate(self, data):
218
+ attrs = data.copy()
219
+ attrs.pop("teams", None)
223
220
  validator = UniqueTogetherValidator(queryset=Contact.objects.all(), fields=("name", "phone", "email"))
224
- validator(local_attrs, self)
225
- super().validate(local_attrs)
226
- return attrs
221
+ validator(attrs, self)
222
+ super().validate(attrs)
223
+ return data
227
224
 
228
225
 
229
226
  class ContactAssociationSerializer(NautobotModelSerializer):
@@ -238,18 +235,18 @@ class ContactAssociationSerializer(NautobotModelSerializer):
238
235
  "team": {"required": False},
239
236
  }
240
237
 
241
- def validate(self, attrs):
238
+ def validate(self, data):
242
239
  # Validate uniqueness of (associated object, associated object type, contact/team, role)
243
240
  unique_together_fields = None
244
241
 
245
- if attrs.get("contact") and attrs.get("role"):
242
+ if data.get("contact") and data.get("role"):
246
243
  unique_together_fields = (
247
244
  "associated_object_type",
248
245
  "associated_object_id",
249
246
  "contact",
250
247
  "role",
251
248
  )
252
- elif attrs.get("team") and attrs.get("role"):
249
+ elif data.get("team") and data.get("role"):
253
250
  unique_together_fields = (
254
251
  "associated_object_type",
255
252
  "associated_object_id",
@@ -262,11 +259,11 @@ class ContactAssociationSerializer(NautobotModelSerializer):
262
259
  queryset=ContactAssociation.objects.all(),
263
260
  fields=unique_together_fields,
264
261
  )
265
- validator(attrs, self)
262
+ validator(data, self)
266
263
 
267
- super().validate(attrs)
264
+ super().validate(data)
268
265
 
269
- return attrs
266
+ return data
270
267
 
271
268
 
272
269
  #
@@ -275,7 +272,6 @@ class ContactAssociationSerializer(NautobotModelSerializer):
275
272
 
276
273
 
277
274
  class ContentTypeSerializer(BaseModelSerializer):
278
- id = serializers.IntegerField(read_only=True)
279
275
  url = serializers.HyperlinkedIdentityField(view_name="extras-api:contenttype-detail")
280
276
  display = serializers.SerializerMethodField()
281
277
 
@@ -284,8 +280,8 @@ class ContentTypeSerializer(BaseModelSerializer):
284
280
  fields = "__all__"
285
281
 
286
282
  @extend_schema_field(serializers.CharField)
287
- def get_display(self, instance):
288
- return instance.app_labeled_name
283
+ def get_display(self, obj):
284
+ return obj.app_labeled_name
289
285
 
290
286
 
291
287
  #
@@ -437,7 +433,7 @@ class ExportTemplateSerializer(RelationshipModelSerializerMixin, ValidatedModelS
437
433
  #
438
434
 
439
435
 
440
- class ExternalIntegrationSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
436
+ class ExternalIntegrationSerializer(NautobotModelSerializer):
441
437
  class Meta:
442
438
  model = ExternalIntegration
443
439
  fields = "__all__"
@@ -459,7 +455,7 @@ class FileProxySerializer(BaseModelSerializer):
459
455
  #
460
456
 
461
457
 
462
- class GitRepositorySerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
458
+ class GitRepositorySerializer(NautobotModelSerializer):
463
459
  """Git repositories defined as a data source."""
464
460
 
465
461
  provided_contents = MultipleChoiceJSONField(
@@ -506,17 +502,17 @@ class ImageAttachmentSerializer(ValidatedModelSerializer):
506
502
  model = ImageAttachment
507
503
  fields = "__all__"
508
504
 
509
- def validate(self, attrs):
505
+ def validate(self, data):
510
506
  # Validate that the parent object exists
511
507
  try:
512
- attrs["content_type"].get_object_for_this_type(id=attrs["object_id"])
508
+ data["content_type"].get_object_for_this_type(id=data["object_id"])
513
509
  except ObjectDoesNotExist:
514
- raise serializers.ValidationError(f"Invalid parent object: {attrs['content_type']} ID {attrs['object_id']}")
510
+ raise serializers.ValidationError(f"Invalid parent object: {data['content_type']} ID {data['object_id']}")
515
511
 
516
512
  # Enforce model validation
517
- super().validate(attrs)
513
+ super().validate(data)
518
514
 
519
- return attrs
515
+ return data
520
516
 
521
517
  @extend_schema_field(
522
518
  PolymorphicProxySerializer(
@@ -548,24 +544,24 @@ class JobSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
548
544
  model = Job
549
545
  fields = "__all__"
550
546
 
551
- def validate(self, attrs):
547
+ def validate(self, data):
552
548
  # note no validation for on creation of jobs because we do not support user creation of Job records via API
553
549
  if self.instance:
554
- has_sensitive_variables = attrs.get("has_sensitive_variables", self.instance.has_sensitive_variables)
555
- approval_required = attrs.get("approval_required", self.instance.approval_required)
550
+ has_sensitive_variables = data.get("has_sensitive_variables", self.instance.has_sensitive_variables)
551
+ approval_required = data.get("approval_required", self.instance.approval_required)
556
552
 
557
553
  if approval_required and has_sensitive_variables:
558
554
  error_message = "A job with sensitive variables cannot also be marked as requiring approval"
559
555
  errors = {}
560
556
 
561
- if "approval_required" in attrs:
557
+ if "approval_required" in data:
562
558
  errors["approval_required"] = [error_message]
563
- if "has_sensitive_variables" in attrs:
559
+ if "has_sensitive_variables" in data:
564
560
  errors["has_sensitive_variables"] = [error_message]
565
561
 
566
562
  raise serializers.ValidationError(errors)
567
563
 
568
- return super().validate(attrs)
564
+ return super().validate(data)
569
565
 
570
566
 
571
567
  class JobQueueSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
@@ -691,22 +687,22 @@ class JobHookSerializer(NautobotModelSerializer):
691
687
  model = JobHook
692
688
  fields = "__all__"
693
689
 
694
- def validate(self, attrs):
695
- validated_attrs = super().validate(attrs)
690
+ def validate(self, data):
691
+ validated_data = super().validate(data)
696
692
 
697
693
  conflicts = JobHook.check_for_conflicts(
698
694
  instance=self.instance,
699
- content_types=attrs.get("content_types"),
700
- job=attrs.get("job"),
701
- type_create=attrs.get("type_create"),
702
- type_update=attrs.get("type_update"),
703
- type_delete=attrs.get("type_delete"),
695
+ content_types=data.get("content_types"),
696
+ job=data.get("job"),
697
+ type_create=data.get("type_create"),
698
+ type_update=data.get("type_update"),
699
+ type_delete=data.get("type_delete"),
704
700
  )
705
701
 
706
702
  if conflicts:
707
703
  raise serializers.ValidationError(conflicts)
708
704
 
709
- return validated_attrs
705
+ return validated_data
710
706
 
711
707
 
712
708
  class JobCreationSerializer(BaseModelSerializer):
@@ -725,15 +721,15 @@ class JobCreationSerializer(BaseModelSerializer):
725
721
  model = ScheduledJob
726
722
  fields = ["url", "name", "start_time", "interval", "crontab"]
727
723
 
728
- def validate(self, attrs):
729
- attrs = super().validate(attrs)
724
+ def validate(self, data):
725
+ data = super().validate(data)
730
726
 
731
- if attrs["interval"] in choices.JobExecutionType.SCHEDULE_CHOICES:
732
- if "name" not in attrs:
727
+ if data["interval"] in choices.JobExecutionType.SCHEDULE_CHOICES:
728
+ if "name" not in data:
733
729
  raise serializers.ValidationError({"name": "Please provide a name for the job schedule."})
734
730
 
735
- if ("start_time" not in attrs and attrs["interval"] != choices.JobExecutionType.TYPE_CUSTOM) or (
736
- "start_time" in attrs and attrs["start_time"] < models.ScheduledJob.earliest_possible_time()
731
+ if ("start_time" not in data and data["interval"] != choices.JobExecutionType.TYPE_CUSTOM) or (
732
+ "start_time" in data and data["start_time"] < models.ScheduledJob.earliest_possible_time()
737
733
  ):
738
734
  raise serializers.ValidationError(
739
735
  {
@@ -741,15 +737,15 @@ class JobCreationSerializer(BaseModelSerializer):
741
737
  }
742
738
  )
743
739
 
744
- if attrs["interval"] == choices.JobExecutionType.TYPE_CUSTOM:
745
- if attrs.get("crontab") is None:
740
+ if data["interval"] == choices.JobExecutionType.TYPE_CUSTOM:
741
+ if data.get("crontab") is None:
746
742
  raise serializers.ValidationError({"crontab": "Please enter a valid crontab."})
747
743
  try:
748
- models.ScheduledJob.get_crontab(attrs["crontab"])
744
+ models.ScheduledJob.get_crontab(data["crontab"])
749
745
  except Exception as e:
750
746
  raise serializers.ValidationError({"crontab": e})
751
747
 
752
- return attrs
748
+ return data
753
749
 
754
750
 
755
751
  class JobInputSerializer(serializers.Serializer):
@@ -769,18 +765,15 @@ class JobMultiPartInputSerializer(serializers.Serializer):
769
765
  _task_queue = serializers.CharField(required=False, allow_blank=True)
770
766
  _job_queue = serializers.CharField(required=False, allow_blank=True)
771
767
 
772
- def validate(self, attrs):
773
- attrs = super().validate(attrs)
768
+ def validate(self, data):
769
+ data = super().validate(data)
774
770
 
775
- if "_schedule_interval" in attrs and attrs["_schedule_interval"] != JobExecutionType.TYPE_IMMEDIATELY:
776
- if "_schedule_name" not in attrs:
771
+ if "_schedule_interval" in data and data["_schedule_interval"] != JobExecutionType.TYPE_IMMEDIATELY:
772
+ if "_schedule_name" not in data:
777
773
  raise serializers.ValidationError({"_schedule_name": "Please provide a name for the job schedule."})
778
774
 
779
- if (
780
- "_schedule_start_time" not in attrs and attrs["_schedule_interval"] != JobExecutionType.TYPE_CUSTOM
781
- ) or (
782
- "_schedule_start_time" in attrs
783
- and attrs["_schedule_start_time"] < ScheduledJob.earliest_possible_time()
775
+ if ("_schedule_start_time" not in data and data["_schedule_interval"] != JobExecutionType.TYPE_CUSTOM) or (
776
+ "_schedule_start_time" in data and data["_schedule_start_time"] < ScheduledJob.earliest_possible_time()
784
777
  ):
785
778
  raise serializers.ValidationError(
786
779
  {
@@ -788,15 +781,15 @@ class JobMultiPartInputSerializer(serializers.Serializer):
788
781
  }
789
782
  )
790
783
 
791
- if attrs["_schedule_interval"] == JobExecutionType.TYPE_CUSTOM:
792
- if attrs.get("_schedule_crontab") is None:
784
+ if data["_schedule_interval"] == JobExecutionType.TYPE_CUSTOM:
785
+ if data.get("_schedule_crontab") is None:
793
786
  raise serializers.ValidationError({"_schedule_crontab": "Please enter a valid crontab."})
794
787
  try:
795
- ScheduledJob.get_crontab(attrs["_schedule_crontab"])
788
+ ScheduledJob.get_crontab(data["_schedule_crontab"])
796
789
  except Exception as e:
797
790
  raise serializers.ValidationError({"_schedule_crontab": e})
798
791
 
799
- return attrs
792
+ return data
800
793
 
801
794
 
802
795
  class JobLogEntrySerializer(BaseModelSerializer):
@@ -823,7 +816,7 @@ class JobButtonSerializer(ValidatedModelSerializer, NotesSerializerMixin):
823
816
  #
824
817
 
825
818
 
826
- class MetadataTypeSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
819
+ class MetadataTypeSerializer(NautobotModelSerializer):
827
820
  content_types = ContentTypeField(
828
821
  queryset=ContentType.objects.filter(FeatureQuery("metadata").get_query()),
829
822
  many=True,
@@ -1080,18 +1073,18 @@ class TagSerializer(NautobotModelSerializer):
1080
1073
  "color": {"help_text": "RGB color in hexadecimal (e.g. 00ff00)"},
1081
1074
  }
1082
1075
 
1083
- def validate(self, attrs):
1084
- attrs = super().validate(attrs)
1076
+ def validate(self, data):
1077
+ data = super().validate(data)
1085
1078
 
1086
1079
  # check if tag is assigned to any of the removed content_types
1087
- if self.instance is not None and self.instance.present_in_database and "content_types" in attrs:
1088
- content_types_id = [content_type.id for content_type in attrs["content_types"]]
1080
+ if self.instance is not None and self.instance.present_in_database and "content_types" in data:
1081
+ content_types_id = [content_type.id for content_type in data["content_types"]]
1089
1082
  errors = self.instance.validate_content_types_removal(content_types_id)
1090
1083
 
1091
1084
  if errors:
1092
1085
  raise serializers.ValidationError(errors)
1093
1086
 
1094
- return attrs
1087
+ return data
1095
1088
 
1096
1089
 
1097
1090
  #
@@ -1099,7 +1092,9 @@ class TagSerializer(NautobotModelSerializer):
1099
1092
  #
1100
1093
 
1101
1094
 
1102
- class TeamSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1095
+ class TeamSerializer(NautobotModelSerializer):
1096
+ contacts = NautobotHyperlinkedRelatedField(queryset=Contact.objects.all(), many=True, required=False)
1097
+
1103
1098
  class Meta:
1104
1099
  model = Team
1105
1100
  fields = "__all__"
@@ -1111,10 +1106,10 @@ class TeamSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1111
1106
  # https://www.django-rest-framework.org/api-guide/validators/#optional-fields
1112
1107
  validators = []
1113
1108
 
1114
- def validate(self, attrs):
1109
+ def validate(self, data):
1115
1110
  validator = UniqueTogetherValidator(queryset=Team.objects.all(), fields=("name", "phone", "email"))
1116
- validator(attrs, self)
1117
- return super().validate(attrs)
1111
+ validator(data, self)
1112
+ return super().validate(data)
1118
1113
 
1119
1114
 
1120
1115
  #
@@ -1132,19 +1127,19 @@ class WebhookSerializer(ValidatedModelSerializer, NotesSerializerMixin):
1132
1127
  model = Webhook
1133
1128
  fields = "__all__"
1134
1129
 
1135
- def validate(self, attrs):
1136
- validated_attrs = super().validate(attrs)
1130
+ def validate(self, data):
1131
+ validated_data = super().validate(data)
1137
1132
 
1138
1133
  conflicts = Webhook.check_for_conflicts(
1139
1134
  instance=self.instance,
1140
- content_types=attrs.get("content_types"),
1141
- payload_url=attrs.get("payload_url"),
1142
- type_create=attrs.get("type_create"),
1143
- type_update=attrs.get("type_update"),
1144
- type_delete=attrs.get("type_delete"),
1135
+ content_types=data.get("content_types"),
1136
+ payload_url=data.get("payload_url"),
1137
+ type_create=data.get("type_create"),
1138
+ type_update=data.get("type_update"),
1139
+ type_delete=data.get("type_delete"),
1145
1140
  )
1146
1141
 
1147
1142
  if conflicts:
1148
1143
  raise serializers.ValidationError(conflicts)
1149
1144
 
1150
- return validated_attrs
1145
+ return validated_data
@@ -17,7 +17,6 @@ from rest_framework.permissions import IsAuthenticated
17
17
  from rest_framework.response import Response
18
18
 
19
19
  from nautobot.core.api.authentication import TokenPermissions
20
- from nautobot.core.api.parsers import NautobotCSVParser
21
20
  from nautobot.core.api.utils import get_serializer_for_model
22
21
  from nautobot.core.api.views import (
23
22
  BulkDestroyModelMixin,
@@ -181,7 +180,14 @@ class ConfigContextQuerySetMixin:
181
180
 
182
181
 
183
182
  class ConfigContextViewSet(NotesViewSetMixin, ModelViewSet):
184
- queryset = ConfigContext.objects.all()
183
+ queryset = ConfigContext.objects.prefetch_related(
184
+ "locations",
185
+ "roles",
186
+ "device_types",
187
+ "platforms",
188
+ "tenant_groups",
189
+ "tenants",
190
+ )
185
191
  serializer_class = serializers.ConfigContextSerializer
186
192
  filterset_class = filters.ConfigContextFilterSet
187
193
 
@@ -298,7 +304,7 @@ class DynamicGroupViewSet(NotesViewSetMixin, ModelViewSet):
298
304
  Manage Dynamic Groups through DELETE, GET, POST, PUT, and PATCH requests.
299
305
  """
300
306
 
301
- queryset = DynamicGroup.objects.all()
307
+ queryset = DynamicGroup.objects.select_related("content_type")
302
308
  serializer_class = serializers.DynamicGroupSerializer
303
309
  filterset_class = filters.DynamicGroupFilterSet
304
310
 
@@ -323,7 +329,7 @@ class DynamicGroupMembershipViewSet(ModelViewSet):
323
329
  Manage Dynamic Group Memberships through DELETE, GET, POST, PUT, and PATCH requests.
324
330
  """
325
331
 
326
- queryset = DynamicGroupMembership.objects.all()
332
+ queryset = DynamicGroupMembership.objects.select_related("group", "parent_group")
327
333
  serializer_class = serializers.DynamicGroupMembershipSerializer
328
334
  filterset_class = filters.DynamicGroupMembershipFilterSet
329
335
 
@@ -334,13 +340,13 @@ class DynamicGroupMembershipViewSet(ModelViewSet):
334
340
 
335
341
 
336
342
  class SavedViewViewSet(ModelViewSet):
337
- queryset = SavedView.objects.all()
343
+ queryset = SavedView.objects.select_related("owner")
338
344
  serializer_class = serializers.SavedViewSerializer
339
345
  filterset_class = filters.SavedViewFilterSet
340
346
 
341
347
 
342
348
  class UserSavedViewAssociationViewSet(ModelViewSet):
343
- queryset = UserSavedViewAssociation.objects.all()
349
+ queryset = UserSavedViewAssociation.objects.select_related("user", "saved_view")
344
350
  serializer_class = serializers.UserSavedViewAssociationSerializer
345
351
  filterset_class = filters.UserSavedViewAssociationFilterSet
346
352
 
@@ -350,7 +356,7 @@ class StaticGroupAssociationViewSet(NautobotModelViewSet):
350
356
  Manage Static Group Associations through DELETE, GET, POST, PUT, and PATCH requests.
351
357
  """
352
358
 
353
- queryset = StaticGroupAssociation.objects.all()
359
+ queryset = StaticGroupAssociation.objects.select_related("associated_object_type", "dynamic_group")
354
360
  serializer_class = serializers.StaticGroupAssociationSerializer
355
361
  filterset_class = filters.StaticGroupAssociationFilterSet
356
362
 
@@ -361,7 +367,7 @@ class StaticGroupAssociationViewSet(NautobotModelViewSet):
361
367
  and "dynamic_group" in self.request.GET
362
368
  and self.action in ["list", "retrieve"]
363
369
  ):
364
- self.queryset = StaticGroupAssociation.all_objects.all()
370
+ self.queryset = StaticGroupAssociation.all_objects.select_related("associated_object_type", "dynamic_group")
365
371
  return super().get_queryset()
366
372
 
367
373
 
@@ -382,7 +388,7 @@ class ExportTemplateViewSet(NotesViewSetMixin, ModelViewSet):
382
388
 
383
389
 
384
390
  class ExternalIntegrationViewSet(NautobotModelViewSet):
385
- queryset = ExternalIntegration.objects.all()
391
+ queryset = ExternalIntegration.objects.select_related("secrets_group")
386
392
  serializer_class = serializers.ExternalIntegrationSerializer
387
393
  filterset_class = filters.ExternalIntegrationFilterSet
388
394
 
@@ -393,7 +399,7 @@ class ExternalIntegrationViewSet(NautobotModelViewSet):
393
399
 
394
400
 
395
401
  class FileProxyViewSet(ReadOnlyModelViewSet):
396
- queryset = FileProxy.objects.all()
402
+ queryset = FileProxy.objects.select_related("job_result")
397
403
  serializer_class = serializers.FileProxySerializer
398
404
  filterset_class = filters.FileProxyFilterSet
399
405
 
@@ -482,7 +488,6 @@ class ImageAttachmentViewSet(ModelViewSet):
482
488
  queryset = ImageAttachment.objects.all()
483
489
  serializer_class = serializers.ImageAttachmentSerializer
484
490
  filterset_class = filters.ImageAttachmentFilterSet
485
- parser_classes = [JSONParser, NautobotCSVParser, MultiPartParser]
486
491
 
487
492
 
488
493
  #
@@ -761,13 +766,13 @@ class JobViewSet(
761
766
  ):
762
767
  lookup_value_regex = r"[-0-9a-fA-F]+"
763
768
 
764
- def perform_destroy(self, instance):
765
- if instance.module_name.startswith("nautobot."):
769
+ def perform_destroy(self, obj):
770
+ if obj.module_name.startswith("nautobot."):
766
771
  raise ProtectedError(
767
- f"Unable to delete Job {instance}. System Job cannot be deleted",
772
+ f"Unable to delete Job {obj}. System Job cannot be deleted",
768
773
  [],
769
774
  )
770
- super().perform_destroy(instance)
775
+ super().perform_destroy(obj)
771
776
 
772
777
 
773
778
  @extend_schema_view(
@@ -833,7 +838,7 @@ class JobQueueAssignmentViewSet(NautobotModelViewSet):
833
838
  Manage job queue assignments through DELETE, GET, POST, PUT, and PATCH requests.
834
839
  """
835
840
 
836
- queryset = JobQueueAssignment.objects.all()
841
+ queryset = JobQueueAssignment.objects.select_related("job", "job_queue")
837
842
  serializer_class = serializers.JobQueueAssignmentSerializer
838
843
  filterset_class = filters.JobQueueAssignmentFilterSet
839
844
 
@@ -848,7 +853,7 @@ class JobLogEntryViewSet(ReadOnlyModelViewSet):
848
853
  Retrieve a list of job log entries.
849
854
  """
850
855
 
851
- queryset = JobLogEntry.objects.all()
856
+ queryset = JobLogEntry.objects.select_related("job_result")
852
857
  serializer_class = serializers.JobLogEntrySerializer
853
858
  filterset_class = filters.JobLogEntryFilterSet
854
859
 
@@ -866,7 +871,7 @@ class JobResultViewSet(
866
871
  Retrieve a list of job results
867
872
  """
868
873
 
869
- queryset = JobResult.objects.all()
874
+ queryset = JobResult.objects.select_related("job_model", "user")
870
875
  serializer_class = serializers.JobResultSerializer
871
876
  filterset_class = filters.JobResultFilterSet
872
877
 
@@ -903,7 +908,7 @@ class ScheduledJobViewSet(ReadOnlyModelViewSet):
903
908
  Retrieve a list of scheduled jobs
904
909
  """
905
910
 
906
- queryset = ScheduledJob.objects.all()
911
+ queryset = ScheduledJob.objects.select_related("user")
907
912
  serializer_class = serializers.ScheduledJobSerializer
908
913
  filterset_class = filters.ScheduledJobFilterSet
909
914
 
@@ -1056,7 +1061,7 @@ class MetadataTypeViewSet(NautobotModelViewSet):
1056
1061
 
1057
1062
 
1058
1063
  class MetadataChoiceViewSet(ModelViewSet):
1059
- queryset = MetadataChoice.objects.all()
1064
+ queryset = MetadataChoice.objects.select_related("metadata_type")
1060
1065
  serializer_class = serializers.MetadataChoiceSerializer
1061
1066
  filterset_class = filters.MetadataChoiceFilterSet
1062
1067
 
@@ -1073,7 +1078,7 @@ class ObjectMetadataViewSet(NautobotModelViewSet):
1073
1078
 
1074
1079
 
1075
1080
  class NoteViewSet(ModelViewSet):
1076
- queryset = Note.objects.all()
1081
+ queryset = Note.objects.select_related("user")
1077
1082
  serializer_class = serializers.NoteSerializer
1078
1083
  filterset_class = filters.NoteFilterSet
1079
1084
 
@@ -1092,7 +1097,7 @@ class ObjectChangeViewSet(ReadOnlyModelViewSet):
1092
1097
  Retrieve a list of recent changes.
1093
1098
  """
1094
1099
 
1095
- queryset = ObjectChange.objects.all()
1100
+ queryset = ObjectChange.objects.select_related("user")
1096
1101
  serializer_class = serializers.ObjectChangeSerializer
1097
1102
  filterset_class = filters.ObjectChangeFilterSet
1098
1103
 
@@ -30,7 +30,6 @@ JOB_OVERRIDABLE_FIELDS = (
30
30
  "soft_time_limit",
31
31
  "time_limit",
32
32
  "has_sensitive_variables",
33
- "is_singleton",
34
33
  )
35
34
 
36
35
 
@@ -53,5 +52,4 @@ JOB_RESULT_CUSTOM_CELERY_KWARGS = (
53
52
  "nautobot_job_job_model_id",
54
53
  "nautobot_job_scheduled_job_id",
55
54
  "nautobot_job_user_id",
56
- "nautobot_job_ignore_singleton_lock",
57
55
  )
@@ -119,13 +119,13 @@ __all__ = (
119
119
  "CustomFieldDateFilter",
120
120
  "CustomFieldFilterMixin",
121
121
  "CustomFieldJSONFilter",
122
- "CustomFieldModelFilterSet",
123
- "CustomFieldModelFilterSetMixin",
124
122
  "CustomFieldMultiSelectFilter",
125
123
  "CustomFieldMultiValueCharFilter",
126
124
  "CustomFieldMultiValueDateFilter",
127
125
  "CustomFieldMultiValueNumberFilter",
128
126
  "CustomFieldNumberFilter",
127
+ "CustomFieldModelFilterSet",
128
+ "CustomFieldModelFilterSetMixin",
129
129
  "CustomLinkFilterSet",
130
130
  "DynamicGroupFilterSet",
131
131
  "DynamicGroupMembershipFilterSet",
@@ -136,25 +136,25 @@ __all__ = (
136
136
  "ImageAttachmentFilterSet",
137
137
  "JobFilterSet",
138
138
  "JobLogEntryFilterSet",
139
- "JobQueueAssignmentFilterSet",
140
139
  "JobQueueFilterSet",
140
+ "JobQueueAssignmentFilterSet",
141
141
  "JobResultFilterSet",
142
142
  "LocalContextFilterSet",
143
143
  "LocalContextModelFilterSetMixin",
144
- "MetadataChoiceFilterSet",
145
144
  "MetadataTypeFilterSet",
145
+ "MetadataChoiceFilterSet",
146
146
  "NautobotFilterSet",
147
147
  "NoteFilterSet",
148
148
  "ObjectChangeFilterSet",
149
- "RelationshipAssociationFilterSet",
150
149
  "RelationshipFilter",
151
150
  "RelationshipFilterSet",
151
+ "RelationshipAssociationFilterSet",
152
152
  "RoleFilterSet",
153
153
  "RoleModelFilterSetMixin",
154
154
  "ScheduledJobFilterSet",
155
155
  "SecretFilterSet",
156
- "SecretsGroupAssociationFilterSet",
157
156
  "SecretsGroupFilterSet",
157
+ "SecretsGroupAssociationFilterSet",
158
158
  "StatusFilter",
159
159
  "StatusFilterSet",
160
160
  "StatusModelFilterSetMixin",
@@ -874,7 +874,6 @@ class JobFilterSet(BaseFilterSet, CustomFieldModelFilterSetMixin):
874
874
  "is_job_button_receiver",
875
875
  "soft_time_limit",
876
876
  "time_limit",
877
- "is_singleton",
878
877
  "grouping_override",
879
878
  "name_override",
880
879
  "approval_required_override",
@@ -884,7 +883,6 @@ class JobFilterSet(BaseFilterSet, CustomFieldModelFilterSetMixin):
884
883
  "soft_time_limit_override",
885
884
  "time_limit_override",
886
885
  "has_sensitive_variables_override",
887
- "is_singleton_override",
888
886
  "tags",
889
887
  ]
890
888
 
@@ -14,9 +14,9 @@ from .mixins import (
14
14
  )
15
15
 
16
16
  __all__ = (
17
- "NautobotBulkEditForm",
18
- "NautobotFilterForm",
19
17
  "NautobotModelForm",
18
+ "NautobotFilterForm",
19
+ "NautobotBulkEditForm",
20
20
  )
21
21
 
22
22