nautobot 2.4.0b1__py3-none-any.whl → 2.4.2__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 (668) 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 +1 -0
  18. nautobot/circuits/api/views.py +4 -8
  19. nautobot/circuits/tables.py +2 -1
  20. nautobot/circuits/templates/circuits/circuit_create.html +1 -7
  21. nautobot/circuits/tests/integration/test_circuits_bulk_operations.py +43 -0
  22. nautobot/circuits/tests/integration/test_relationships.py +1 -1
  23. nautobot/circuits/views.py +3 -3
  24. nautobot/cloud/api/views.py +6 -10
  25. nautobot/cloud/models.py +1 -1
  26. nautobot/cloud/views.py +0 -16
  27. nautobot/core/api/constants.py +11 -0
  28. nautobot/core/api/fields.py +5 -5
  29. nautobot/core/api/filter_backends.py +3 -9
  30. nautobot/core/api/schema.py +13 -2
  31. nautobot/core/api/serializers.py +40 -34
  32. nautobot/core/api/views.py +56 -4
  33. nautobot/core/apps/__init__.py +0 -5
  34. nautobot/core/celery/log.py +4 -4
  35. nautobot/core/celery/schedulers.py +2 -2
  36. nautobot/core/choices.py +2 -2
  37. nautobot/core/events/__init__.py +3 -3
  38. nautobot/core/filters.py +67 -35
  39. nautobot/core/forms/__init__.py +19 -19
  40. nautobot/core/forms/fields.py +14 -11
  41. nautobot/core/forms/forms.py +33 -2
  42. nautobot/core/graphql/types.py +1 -1
  43. nautobot/core/jobs/__init__.py +28 -7
  44. nautobot/core/jobs/bulk_actions.py +285 -0
  45. nautobot/core/jobs/cleanup.py +48 -12
  46. nautobot/core/jobs/groups.py +1 -1
  47. nautobot/core/management/commands/validate_models.py +1 -1
  48. nautobot/core/models/__init__.py +3 -1
  49. nautobot/core/models/query_functions.py +2 -2
  50. nautobot/core/models/tree_queries.py +6 -3
  51. nautobot/core/settings.py +29 -2
  52. nautobot/core/settings.yaml +21 -0
  53. nautobot/core/tables.py +79 -61
  54. nautobot/core/templates/about.html +67 -0
  55. nautobot/core/templates/generic/object_bulk_destroy.html +1 -1
  56. nautobot/core/templates/inc/media.html +3 -0
  57. nautobot/core/templates/inc/nav_menu.html +1 -0
  58. nautobot/core/templates/inc/tenancy_form_panel.html +9 -0
  59. nautobot/core/templates/inc/tenant_table_row.html +11 -0
  60. nautobot/core/templates/nautobot_config.py.j2 +13 -0
  61. nautobot/core/templates/search.html +7 -0
  62. nautobot/core/templates/utilities/render_jinja2.html +1 -1
  63. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  64. nautobot/core/templates/utilities/theme_preview.html +7 -0
  65. nautobot/core/templatetags/helpers.py +11 -2
  66. nautobot/core/testing/__init__.py +8 -8
  67. nautobot/core/testing/api.py +170 -15
  68. nautobot/core/testing/filters.py +45 -10
  69. nautobot/core/testing/forms.py +2 -0
  70. nautobot/core/testing/integration.py +514 -5
  71. nautobot/core/testing/mixins.py +7 -2
  72. nautobot/core/testing/views.py +44 -29
  73. nautobot/core/tests/integration/test_app_home.py +0 -1
  74. nautobot/core/tests/integration/test_app_navbar.py +0 -1
  75. nautobot/core/tests/integration/test_filters.py +0 -2
  76. nautobot/core/tests/integration/test_home.py +0 -1
  77. nautobot/core/tests/integration/test_navbar.py +0 -1
  78. nautobot/core/tests/integration/test_view_authentication.py +1 -0
  79. nautobot/core/tests/runner.py +1 -1
  80. nautobot/core/tests/test_api.py +98 -1
  81. nautobot/core/tests/test_csv.py +25 -3
  82. nautobot/core/tests/test_filters.py +209 -246
  83. nautobot/core/tests/test_forms.py +1 -0
  84. nautobot/core/tests/test_jobs.py +492 -1
  85. nautobot/core/tests/test_models.py +9 -0
  86. nautobot/core/tests/test_settings_schema.py +7 -0
  87. nautobot/core/tests/test_tables.py +100 -0
  88. nautobot/core/tests/test_utils.py +63 -1
  89. nautobot/core/tests/test_views.py +30 -3
  90. nautobot/core/ui/nav.py +1 -0
  91. nautobot/core/ui/object_detail.py +15 -1
  92. nautobot/core/urls.py +11 -0
  93. nautobot/core/utils/git.py +7 -2
  94. nautobot/core/utils/lookup.py +11 -8
  95. nautobot/core/utils/querysets.py +64 -0
  96. nautobot/core/utils/requests.py +24 -9
  97. nautobot/core/views/__init__.py +42 -0
  98. nautobot/core/views/generic.py +131 -197
  99. nautobot/core/views/mixins.py +136 -41
  100. nautobot/core/views/renderers.py +6 -6
  101. nautobot/core/views/utils.py +2 -2
  102. nautobot/dcim/api/serializers.py +56 -64
  103. nautobot/dcim/api/views.py +47 -113
  104. nautobot/dcim/constants.py +6 -13
  105. nautobot/dcim/factory.py +6 -1
  106. nautobot/dcim/filters/__init__.py +31 -2
  107. nautobot/dcim/forms.py +48 -17
  108. nautobot/dcim/graphql/types.py +2 -2
  109. nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +25 -0
  110. nautobot/dcim/models/__init__.py +1 -1
  111. nautobot/dcim/models/device_component_templates.py +2 -2
  112. nautobot/dcim/models/device_components.py +22 -20
  113. nautobot/dcim/models/devices.py +10 -1
  114. nautobot/dcim/models/locations.py +3 -3
  115. nautobot/dcim/models/power.py +6 -5
  116. nautobot/dcim/models/racks.py +4 -4
  117. nautobot/dcim/tables/__init__.py +3 -3
  118. nautobot/dcim/tables/devices.py +9 -6
  119. nautobot/dcim/tables/devicetypes.py +2 -2
  120. nautobot/dcim/tables/racks.py +1 -1
  121. nautobot/dcim/templates/dcim/cable.html +1 -1
  122. nautobot/dcim/templates/dcim/controller_create.html +1 -7
  123. nautobot/dcim/templates/dcim/controller_retrieve.html +1 -9
  124. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +2 -0
  125. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +5 -0
  126. nautobot/dcim/templates/dcim/device/base.html +1 -1
  127. nautobot/dcim/templates/dcim/device.html +3 -11
  128. nautobot/dcim/templates/dcim/device_component.html +1 -1
  129. nautobot/dcim/templates/dcim/device_edit.html +36 -37
  130. nautobot/dcim/templates/dcim/devicetype.html +1 -1
  131. nautobot/dcim/templates/dcim/location.html +2 -10
  132. nautobot/dcim/templates/dcim/location_edit.html +1 -7
  133. nautobot/dcim/templates/dcim/locationtype.html +1 -1
  134. nautobot/dcim/templates/dcim/locationtype_retrieve.html +1 -1
  135. nautobot/dcim/templates/dcim/manufacturer.html +1 -1
  136. nautobot/dcim/templates/dcim/platform.html +1 -1
  137. nautobot/dcim/templates/dcim/powerfeed.html +1 -1
  138. nautobot/dcim/templates/dcim/powerpanel.html +1 -1
  139. nautobot/dcim/templates/dcim/rack.html +2 -10
  140. nautobot/dcim/templates/dcim/rack_edit.html +1 -7
  141. nautobot/dcim/templates/dcim/rackgroup.html +1 -1
  142. nautobot/dcim/templates/dcim/rackreservation.html +3 -11
  143. nautobot/dcim/templates/dcim/virtualchassis.html +1 -1
  144. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +1 -9
  145. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +1 -7
  146. nautobot/dcim/tests/integration/test_controller.py +62 -0
  147. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +71 -0
  148. nautobot/dcim/tests/integration/test_device_bulk_operations.py +30 -0
  149. nautobot/dcim/tests/integration/test_location_bulk_operations.py +43 -0
  150. nautobot/dcim/tests/test_api.py +16 -5
  151. nautobot/dcim/tests/test_filters.py +33 -0
  152. nautobot/dcim/tests/test_forms.py +51 -2
  153. nautobot/dcim/tests/test_graphql.py +52 -0
  154. nautobot/dcim/tests/test_jobs.py +118 -0
  155. nautobot/dcim/tests/test_models.py +52 -9
  156. nautobot/dcim/tests/test_views.py +30 -84
  157. nautobot/dcim/views.py +13 -28
  158. nautobot/extras/api/customfields.py +2 -2
  159. nautobot/extras/api/serializers.py +123 -85
  160. nautobot/extras/api/views.py +33 -30
  161. nautobot/extras/constants.py +3 -0
  162. nautobot/extras/datasources/git.py +125 -0
  163. nautobot/extras/filters/__init__.py +8 -6
  164. nautobot/extras/forms/base.py +2 -2
  165. nautobot/extras/forms/forms.py +139 -31
  166. nautobot/extras/forms/mixins.py +14 -6
  167. nautobot/extras/group_sync.py +3 -3
  168. nautobot/extras/health_checks.py +1 -2
  169. nautobot/extras/jobs.py +85 -18
  170. nautobot/extras/managers.py +3 -1
  171. nautobot/extras/migrations/0018_joblog_data_migration.py +7 -9
  172. nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +22 -0
  173. nautobot/extras/migrations/0121_alter_team_contacts.py +17 -0
  174. nautobot/extras/migrations/0122_add_graphqlquery_owner_content_type.py +34 -0
  175. nautobot/extras/models/__init__.py +1 -1
  176. nautobot/extras/models/contacts.py +1 -1
  177. nautobot/extras/models/customfields.py +41 -23
  178. nautobot/extras/models/datasources.py +85 -0
  179. nautobot/extras/models/groups.py +11 -9
  180. nautobot/extras/models/jobs.py +23 -4
  181. nautobot/extras/models/models.py +17 -2
  182. nautobot/extras/models/relationships.py +17 -5
  183. nautobot/extras/plugins/__init__.py +13 -2
  184. nautobot/extras/plugins/marketplace_manifest.yml +84 -79
  185. nautobot/extras/plugins/tables.py +16 -14
  186. nautobot/extras/plugins/views.py +65 -69
  187. nautobot/extras/registry.py +1 -1
  188. nautobot/extras/secrets/__init__.py +2 -2
  189. nautobot/extras/signals.py +15 -1
  190. nautobot/extras/tables.py +7 -5
  191. nautobot/extras/templates/extras/computedfield.html +1 -1
  192. nautobot/extras/templates/extras/configcontext.html +1 -1
  193. nautobot/extras/templates/extras/configcontextschema.html +1 -1
  194. nautobot/extras/templates/extras/customfield.html +1 -1
  195. nautobot/extras/templates/extras/customlink.html +1 -1
  196. nautobot/extras/templates/extras/dynamicgroup.html +2 -10
  197. nautobot/extras/templates/extras/exporttemplate.html +1 -1
  198. nautobot/extras/templates/extras/gitrepository.html +1 -1
  199. nautobot/extras/templates/extras/graphqlquery.html +1 -1
  200. nautobot/extras/templates/extras/job_detail.html +17 -1
  201. nautobot/extras/templates/extras/job_edit.html +1 -0
  202. nautobot/extras/templates/extras/jobbutton_retrieve.html +1 -1
  203. nautobot/extras/templates/extras/jobhook.html +1 -1
  204. nautobot/extras/templates/extras/jobqueue_retrieve.html +1 -9
  205. nautobot/extras/templates/extras/jobresult.html +1 -1
  206. nautobot/extras/templates/extras/marketplace.html +29 -11
  207. nautobot/extras/templates/extras/objectchange.html +1 -1
  208. nautobot/extras/templates/extras/plugin_detail.html +33 -16
  209. nautobot/extras/templates/extras/plugins_tiles.html +21 -10
  210. nautobot/extras/templates/extras/relationship.html +1 -63
  211. nautobot/extras/templates/extras/role_retrieve.html +1 -1
  212. nautobot/extras/templates/extras/scheduledjob.html +1 -1
  213. nautobot/extras/templates/extras/secret.html +1 -1
  214. nautobot/extras/templates/extras/secretsgroup.html +1 -1
  215. nautobot/extras/templates/extras/status.html +1 -1
  216. nautobot/extras/templates/extras/tag.html +1 -1
  217. nautobot/extras/templates/extras/webhook.html +1 -1
  218. nautobot/extras/templatetags/job_buttons.py +4 -4
  219. nautobot/extras/test_jobs/api_test_job.py +1 -1
  220. nautobot/extras/test_jobs/atomic_transaction.py +2 -2
  221. nautobot/extras/test_jobs/dry_run.py +1 -1
  222. nautobot/extras/test_jobs/fail.py +5 -5
  223. nautobot/extras/test_jobs/file_output.py +1 -1
  224. nautobot/extras/test_jobs/file_upload_fail.py +1 -1
  225. nautobot/extras/test_jobs/file_upload_pass.py +1 -1
  226. nautobot/extras/test_jobs/ipaddress_vars.py +3 -1
  227. nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
  228. nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
  229. nautobot/extras/test_jobs/log_redaction.py +1 -1
  230. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
  231. nautobot/extras/test_jobs/modify_db.py +1 -1
  232. nautobot/extras/test_jobs/object_var_optional.py +1 -1
  233. nautobot/extras/test_jobs/object_var_required.py +1 -1
  234. nautobot/extras/test_jobs/object_vars.py +1 -1
  235. nautobot/extras/test_jobs/pass.py +3 -3
  236. nautobot/extras/test_jobs/profiling.py +1 -1
  237. nautobot/extras/test_jobs/relative_import.py +3 -3
  238. nautobot/extras/test_jobs/singleton.py +16 -0
  239. nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
  240. nautobot/extras/test_jobs/task_queues.py +1 -1
  241. nautobot/extras/tests/git_data/01-valid-files/graphql_queries/device_interfaces.gql +8 -0
  242. nautobot/extras/tests/git_data/01-valid-files/graphql_queries/device_names.gql +5 -0
  243. nautobot/extras/tests/git_data/02-invalid-files/graphql_queries/bad_device_names.gql +5 -0
  244. nautobot/extras/tests/git_helper.py +9 -1
  245. nautobot/extras/tests/integration/__init__.py +29 -16
  246. nautobot/extras/tests/integration/test_plugin_banner.py +0 -2
  247. nautobot/extras/tests/test_api.py +19 -13
  248. nautobot/extras/tests/test_customfields.py +50 -52
  249. nautobot/extras/tests/test_datasources.py +29 -1
  250. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  251. nautobot/extras/tests/test_filters.py +6 -6
  252. nautobot/extras/tests/test_forms.py +33 -1
  253. nautobot/extras/tests/test_jobs.py +178 -32
  254. nautobot/extras/tests/test_models.py +299 -10
  255. nautobot/extras/tests/test_plugins.py +62 -9
  256. nautobot/extras/tests/test_relationships.py +120 -9
  257. nautobot/extras/tests/test_utils.py +22 -1
  258. nautobot/extras/tests/test_views.py +56 -194
  259. nautobot/extras/utils.py +20 -10
  260. nautobot/extras/views.py +85 -110
  261. nautobot/ipam/api/fields.py +3 -3
  262. nautobot/ipam/api/serializers.py +41 -33
  263. nautobot/ipam/api/views.py +68 -117
  264. nautobot/ipam/factory.py +1 -1
  265. nautobot/ipam/filters.py +3 -2
  266. nautobot/ipam/lookups.py +101 -62
  267. nautobot/ipam/models.py +74 -18
  268. nautobot/ipam/querysets.py +2 -2
  269. nautobot/ipam/tables.py +25 -9
  270. nautobot/ipam/templates/ipam/ipaddress.html +2 -10
  271. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +1 -7
  272. nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -7
  273. nautobot/ipam/templates/ipam/prefix.html +2 -10
  274. nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
  275. nautobot/ipam/templates/ipam/rir.html +1 -1
  276. nautobot/ipam/templates/ipam/routetarget.html +1 -1
  277. nautobot/ipam/templates/ipam/service.html +1 -1
  278. nautobot/ipam/templates/ipam/vlan.html +2 -10
  279. nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
  280. nautobot/ipam/templates/ipam/vlangroup.html +1 -1
  281. nautobot/ipam/templates/ipam/vrf.html +1 -1
  282. nautobot/ipam/templates/ipam/vrf_edit.html +1 -7
  283. nautobot/ipam/tests/test_api.py +436 -3
  284. nautobot/ipam/tests/test_forms.py +49 -47
  285. nautobot/ipam/tests/test_migrations.py +30 -30
  286. nautobot/ipam/tests/test_models.py +119 -34
  287. nautobot/ipam/tests/test_querysets.py +63 -1
  288. nautobot/ipam/tests/test_utils.py +41 -2
  289. nautobot/ipam/tests/test_views.py +3 -0
  290. nautobot/ipam/utils/__init__.py +54 -17
  291. nautobot/ipam/views.py +61 -87
  292. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  293. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  294. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +40 -2
  295. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  296. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  297. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  298. nautobot/project-static/docs/404.html +131 -14
  299. nautobot/project-static/docs/apps/index.html +131 -14
  300. nautobot/project-static/docs/apps/nautobot-apps.html +132 -16
  301. nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
  302. nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js → bundle.60a45f97.min.js} +2 -2
  303. nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js.map → bundle.60a45f97.min.js.map} +2 -2
  304. nautobot/project-static/docs/assets/javascripts/workers/{search.6ce7567c.min.js → search.f8cc74c7.min.js} +1 -1
  305. nautobot/project-static/docs/assets/javascripts/workers/{search.6ce7567c.min.js.map → search.f8cc74c7.min.js.map} +1 -1
  306. nautobot/project-static/docs/assets/stylesheets/{main.6f8fc17f.min.css → main.a40c8224.min.css} +1 -1
  307. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +147 -20
  308. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +144 -17
  309. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +459 -132
  310. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +175 -28
  311. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +180 -31
  312. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +138 -16
  313. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +137 -15
  314. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +164 -27
  315. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +187 -38
  316. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +193 -31
  317. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +216 -48
  318. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +324 -75
  319. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +666 -175
  320. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +194 -46
  321. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +538 -177
  322. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +578 -221
  323. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +145 -18
  324. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +156 -25
  325. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +492 -65
  326. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +705 -215
  327. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +943 -422
  328. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +144 -17
  329. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +619 -200
  330. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +474 -159
  331. nautobot/project-static/docs/development/apps/api/configuration-view.html +131 -14
  332. nautobot/project-static/docs/development/apps/api/database-backend-config.html +131 -14
  333. nautobot/project-static/docs/development/apps/api/models/django-admin.html +131 -14
  334. nautobot/project-static/docs/development/apps/api/models/global-search.html +131 -14
  335. nautobot/project-static/docs/development/apps/api/models/graphql.html +131 -14
  336. nautobot/project-static/docs/development/apps/api/models/index.html +131 -14
  337. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +131 -14
  338. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +131 -14
  339. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +131 -14
  340. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +131 -14
  341. nautobot/project-static/docs/development/apps/api/platform-features/index.html +131 -14
  342. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +131 -14
  343. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +131 -14
  344. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +131 -14
  345. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +131 -14
  346. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +153 -17
  347. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +131 -14
  348. nautobot/project-static/docs/development/apps/api/prometheus.html +131 -14
  349. nautobot/project-static/docs/development/apps/api/setup.html +131 -14
  350. nautobot/project-static/docs/development/apps/api/testing.html +131 -14
  351. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +131 -14
  352. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +131 -14
  353. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +131 -14
  354. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +131 -14
  355. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +131 -14
  356. nautobot/project-static/docs/development/apps/api/views/base-template.html +131 -14
  357. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +131 -14
  358. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +131 -14
  359. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +131 -14
  360. nautobot/project-static/docs/development/apps/api/views/index.html +131 -14
  361. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +131 -14
  362. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +131 -14
  363. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +131 -14
  364. nautobot/project-static/docs/development/apps/api/views/notes.html +131 -14
  365. nautobot/project-static/docs/development/apps/api/views/rest-api.html +137 -16
  366. nautobot/project-static/docs/development/apps/api/views/urls.html +131 -14
  367. nautobot/project-static/docs/development/apps/index.html +131 -14
  368. nautobot/project-static/docs/development/apps/migration/code-updates.html +131 -14
  369. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +131 -14
  370. nautobot/project-static/docs/development/apps/migration/from-v1.html +131 -14
  371. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +131 -14
  372. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +131 -14
  373. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +131 -14
  374. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +131 -14
  375. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +135 -18
  376. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +131 -14
  377. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +297 -25
  378. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +131 -14
  379. nautobot/project-static/docs/development/apps/porting-from-netbox.html +131 -14
  380. nautobot/project-static/docs/development/core/application-registry.html +131 -14
  381. nautobot/project-static/docs/development/core/best-practices.html +131 -14
  382. nautobot/project-static/docs/development/core/bootstrap-ui.html +131 -14
  383. nautobot/project-static/docs/development/core/caching.html +131 -14
  384. nautobot/project-static/docs/development/core/controllers.html +131 -14
  385. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +158 -84
  386. nautobot/project-static/docs/development/core/generic-views.html +131 -14
  387. nautobot/project-static/docs/development/core/getting-started.html +334 -234
  388. nautobot/project-static/docs/development/core/homepage.html +134 -17
  389. nautobot/project-static/docs/development/core/index.html +131 -14
  390. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +9829 -0
  391. nautobot/project-static/docs/development/core/model-checklist.html +141 -22
  392. nautobot/project-static/docs/development/core/model-features.html +131 -14
  393. nautobot/project-static/docs/development/core/natural-keys.html +131 -14
  394. nautobot/project-static/docs/development/core/navigation-menu.html +131 -14
  395. nautobot/project-static/docs/development/core/release-checklist.html +134 -17
  396. nautobot/project-static/docs/development/core/role-internals.html +131 -14
  397. nautobot/project-static/docs/development/core/settings.html +131 -14
  398. nautobot/project-static/docs/development/core/style-guide.html +134 -17
  399. nautobot/project-static/docs/development/core/templates.html +132 -15
  400. nautobot/project-static/docs/development/core/testing.html +131 -14
  401. nautobot/project-static/docs/development/core/ui-component-framework.html +454 -283
  402. nautobot/project-static/docs/development/core/user-preferences.html +131 -14
  403. nautobot/project-static/docs/development/index.html +131 -14
  404. nautobot/project-static/docs/development/jobs/index.html +301 -132
  405. nautobot/project-static/docs/development/jobs/migration/from-v1.html +131 -14
  406. nautobot/project-static/docs/index.html +139 -33
  407. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
  408. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
  409. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
  410. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
  411. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
  412. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
  413. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
  414. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
  415. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
  416. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
  417. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
  418. nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
  419. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
  420. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
  421. nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
  422. nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
  423. nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
  424. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
  425. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
  426. nautobot/project-static/docs/objects.inv +0 -0
  427. nautobot/project-static/docs/overview/application_stack.html +132 -17
  428. nautobot/project-static/docs/overview/design_philosophy.html +131 -14
  429. nautobot/project-static/docs/release-notes/index.html +137 -22
  430. nautobot/project-static/docs/release-notes/version-1.0.html +319 -203
  431. nautobot/project-static/docs/release-notes/version-1.1.html +316 -200
  432. nautobot/project-static/docs/release-notes/version-1.2.html +391 -275
  433. nautobot/project-static/docs/release-notes/version-1.3.html +417 -301
  434. nautobot/project-static/docs/release-notes/version-1.4.html +502 -387
  435. nautobot/project-static/docs/release-notes/version-1.5.html +690 -576
  436. nautobot/project-static/docs/release-notes/version-1.6.html +989 -457
  437. nautobot/project-static/docs/release-notes/version-2.0.html +613 -499
  438. nautobot/project-static/docs/release-notes/version-2.1.html +448 -334
  439. nautobot/project-static/docs/release-notes/version-2.2.html +441 -327
  440. nautobot/project-static/docs/release-notes/version-2.3.html +1171 -451
  441. nautobot/project-static/docs/release-notes/version-2.4.html +800 -111
  442. nautobot/project-static/docs/requirements.txt +2 -2
  443. nautobot/project-static/docs/search/search_index.json +1 -1
  444. nautobot/project-static/docs/sitemap.xml +303 -287
  445. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  446. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +131 -14
  447. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +131 -14
  448. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +133 -16
  449. nautobot/project-static/docs/user-guide/administration/configuration/index.html +131 -14
  450. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +131 -14
  451. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +195 -18
  452. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +131 -14
  453. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +134 -17
  454. nautobot/project-static/docs/user-guide/administration/guides/docker.html +131 -14
  455. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +131 -14
  456. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +131 -14
  457. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +131 -14
  458. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +131 -14
  459. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +131 -14
  460. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +133 -16
  461. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +131 -14
  462. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +131 -14
  463. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +131 -14
  464. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +151 -18
  465. nautobot/project-static/docs/user-guide/administration/installation/index.html +131 -14
  466. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +132 -15
  467. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +131 -14
  468. nautobot/project-static/docs/user-guide/administration/installation/services.html +131 -14
  469. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +131 -14
  470. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +131 -14
  471. nautobot/project-static/docs/user-guide/administration/security/index.html +9420 -0
  472. nautobot/project-static/docs/user-guide/administration/security/notices.html +9843 -0
  473. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +131 -14
  474. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +131 -14
  475. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +131 -14
  476. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +131 -14
  477. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +131 -14
  478. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +131 -14
  479. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +131 -14
  480. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +134 -18
  481. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +131 -14
  482. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +131 -14
  483. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +131 -14
  484. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +131 -14
  485. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +131 -14
  486. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +131 -14
  487. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +131 -14
  488. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +131 -14
  489. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +131 -14
  490. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +131 -14
  491. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +131 -14
  492. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +131 -14
  493. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +131 -14
  494. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +131 -14
  495. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +131 -14
  496. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +131 -14
  497. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +131 -14
  498. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +131 -14
  499. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +131 -14
  500. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +131 -14
  501. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +131 -14
  502. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +131 -14
  503. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +131 -14
  504. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +131 -14
  505. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +131 -14
  506. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +131 -14
  507. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +131 -14
  508. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +131 -14
  509. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +131 -14
  510. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +131 -14
  511. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +131 -14
  512. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +131 -14
  513. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +131 -14
  514. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +131 -14
  515. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +131 -14
  516. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +131 -14
  517. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +131 -14
  518. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +131 -14
  519. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +131 -14
  520. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +131 -14
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +131 -14
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +131 -14
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +131 -14
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +131 -14
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +131 -14
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +131 -14
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +131 -14
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +131 -14
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +131 -14
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +131 -14
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +131 -14
  532. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +131 -14
  533. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +131 -14
  534. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +131 -14
  535. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +131 -14
  536. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +131 -14
  537. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +131 -14
  538. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +135 -22
  539. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +131 -14
  540. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +131 -14
  541. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +131 -14
  542. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +131 -14
  543. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +131 -14
  544. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +131 -14
  545. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +131 -14
  546. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +131 -14
  547. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +131 -14
  548. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +131 -14
  549. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +131 -14
  550. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +131 -14
  551. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +134 -17
  552. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +131 -14
  553. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +131 -14
  554. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +131 -14
  555. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +131 -14
  556. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +131 -14
  557. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +131 -14
  558. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +131 -14
  559. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +131 -14
  560. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +131 -14
  561. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +131 -14
  562. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +131 -14
  563. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +131 -14
  564. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +131 -14
  565. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +131 -14
  566. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +131 -14
  567. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +134 -17
  568. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +131 -14
  569. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +131 -14
  570. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +131 -14
  571. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +131 -14
  572. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +131 -14
  573. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +131 -14
  574. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +236 -34
  575. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +131 -14
  576. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
  587. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
  589. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +131 -14
  590. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +131 -14
  591. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +134 -17
  592. nautobot/project-static/docs/{development/core/local-k8s.html → user-guide/feature-guides/wireless-networks-and-controllers.html} +632 -566
  593. nautobot/project-static/docs/user-guide/index.html +131 -14
  594. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +131 -14
  595. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +135 -18
  596. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +131 -14
  597. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +131 -14
  598. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +131 -14
  599. nautobot/project-static/docs/user-guide/platform-functionality/events.html +131 -14
  600. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +131 -14
  601. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +131 -14
  602. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +451 -16
  603. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +131 -14
  604. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +131 -14
  605. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +131 -14
  606. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +135 -17
  607. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +131 -14
  608. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +134 -17
  609. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +131 -14
  610. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +131 -14
  611. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9797 -0
  612. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +131 -14
  613. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +131 -14
  614. nautobot/project-static/docs/user-guide/platform-functionality/note.html +131 -14
  615. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +131 -14
  616. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +132 -15
  617. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +131 -14
  618. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +131 -14
  619. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +179 -35
  620. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +159 -15
  621. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +131 -14
  622. nautobot/project-static/docs/user-guide/platform-functionality/role.html +131 -14
  623. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +131 -14
  624. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +131 -14
  625. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +131 -14
  626. nautobot/project-static/docs/user-guide/platform-functionality/status.html +131 -14
  627. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +131 -14
  628. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +131 -14
  629. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +131 -14
  630. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +131 -14
  631. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +131 -14
  632. nautobot/project-static/js/forms.js +1 -1
  633. nautobot/tenancy/api/views.py +9 -13
  634. nautobot/tenancy/templates/tenancy/tenant.html +1 -2
  635. nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
  636. nautobot/tenancy/views.py +4 -2
  637. nautobot/users/admin.py +1 -1
  638. nautobot/users/api/serializers.py +5 -4
  639. nautobot/users/api/views.py +3 -3
  640. nautobot/virtualization/api/serializers.py +4 -4
  641. nautobot/virtualization/api/views.py +5 -24
  642. nautobot/virtualization/filters.py +20 -3
  643. nautobot/virtualization/models.py +1 -1
  644. nautobot/virtualization/tables.py +2 -2
  645. nautobot/virtualization/templates/virtualization/cluster.html +1 -1
  646. nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
  647. nautobot/virtualization/templates/virtualization/clustergroup.html +1 -1
  648. nautobot/virtualization/templates/virtualization/clustertype.html +1 -1
  649. nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -10
  650. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
  651. nautobot/virtualization/templates/virtualization/vminterface.html +1 -1
  652. nautobot/virtualization/tests/test_filters.py +17 -0
  653. nautobot/wireless/filters.py +2 -2
  654. nautobot/wireless/forms.py +1 -1
  655. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +1 -9
  656. nautobot/wireless/tests/integration/__init__.py +0 -0
  657. nautobot/wireless/tests/integration/test_radio_profile.py +42 -0
  658. nautobot/wireless/tests/test_filters.py +29 -1
  659. nautobot/wireless/tests/test_views.py +22 -1
  660. nautobot/wireless/views.py +0 -10
  661. {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/METADATA +9 -9
  662. {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/RECORD +667 -610
  663. {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/WHEEL +1 -1
  664. nautobot/core/fixtures/user-data.json +0 -59
  665. /nautobot/project-static/docs/assets/stylesheets/{main.6f8fc17f.min.css.map → main.a40c8224.min.css.map} +0 -0
  666. {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/LICENSE.txt +0 -0
  667. {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/NOTICE +0 -0
  668. {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/entry_points.txt +0 -0
@@ -247,15 +247,15 @@ class LocationSerializer(
247
247
  # https://www.django-rest-framework.org/api-guide/validators/#optional-fields
248
248
  validators = []
249
249
 
250
- def validate(self, data):
250
+ def validate(self, attrs):
251
251
  # Validate uniqueness of (parent, name) since we omitted the automatically created validator from Meta.
252
- if data.get("parent") and data.get("name"):
252
+ if attrs.get("parent") and attrs.get("name"):
253
253
  validator = UniqueTogetherValidator(queryset=Location.objects.all(), fields=("parent", "name"))
254
- validator(data, self)
254
+ validator(attrs, self)
255
255
 
256
- super().validate(data)
256
+ super().validate(attrs)
257
257
 
258
- return data
258
+ return attrs
259
259
 
260
260
 
261
261
  #
@@ -285,20 +285,20 @@ class RackSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
285
285
  # This prevents facility_id and rack_group from being interpreted as required fields.
286
286
  validators = []
287
287
 
288
- def validate(self, data):
288
+ def validate(self, attrs):
289
289
  # Validate uniqueness of (rack_group, name) since we omitted the automatically-created validator above.
290
- if data.get("rack_group", None):
290
+ if attrs.get("rack_group", None):
291
291
  validator = UniqueTogetherValidator(queryset=Rack.objects.all(), fields=("rack_group", "name"))
292
- validator(data, self)
292
+ validator(attrs, self)
293
293
  # Validate uniqueness of (rack_group, facility_id) since we omitted the automatically-created validator above.
294
- if data.get("facility_id", None) and data.get("rack_group", None):
294
+ if attrs.get("facility_id", None) and attrs.get("rack_group", None):
295
295
  validator = UniqueTogetherValidator(queryset=Rack.objects.all(), fields=("rack_group", "facility_id"))
296
- validator(data, self)
296
+ validator(attrs, self)
297
297
 
298
298
  # Enforce model validation
299
- super().validate(data)
299
+ super().validate(attrs)
300
300
 
301
- return data
301
+ return attrs
302
302
 
303
303
 
304
304
  class RackUnitSerializer(serializers.Serializer):
@@ -369,7 +369,7 @@ class ManufacturerSerializer(NautobotModelSerializer):
369
369
  fields = "__all__"
370
370
 
371
371
 
372
- class DeviceFamilySerializer(NautobotModelSerializer):
372
+ class DeviceFamilySerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
373
373
  device_type_count = serializers.IntegerField(read_only=True)
374
374
 
375
375
  class Meta:
@@ -534,14 +534,6 @@ class DeviceSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
534
534
  "vc_priority": {"label": "Virtual chassis priority"},
535
535
  }
536
536
 
537
- def get_additional_detail_view_tabs(self):
538
- """Add "Virtual Chassis" as a separate detail tab."""
539
- tabs = super().get_additional_detail_view_tabs()
540
- tabs["Virtual Chassis"] = [
541
- {"Virtual Chassis": {"fields": ["virtual_chassis", "vc_position", "vc_priority"]}},
542
- ]
543
- return tabs
544
-
545
537
  def get_field_names(self, declared_fields, info):
546
538
  """
547
539
  Add a couple of special fields to the serializer.
@@ -558,20 +550,20 @@ class DeviceSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
558
550
  def get_config_context(self, obj):
559
551
  return obj.get_config_context()
560
552
 
561
- def validate(self, data):
553
+ def validate(self, attrs):
562
554
  # Validate uniqueness of (rack, position, face) since we omitted the automatically-created validator from Meta.
563
- if data.get("rack") and data.get("position") and data.get("face"):
555
+ if attrs.get("rack") and attrs.get("position") and attrs.get("face"):
564
556
  validator = UniqueTogetherValidator(
565
557
  queryset=Device.objects.all(),
566
558
  fields=("rack", "position", "face"),
567
559
  message=f"The position and face is already occupied on this rack. {UniqueTogetherValidator.message}",
568
560
  )
569
- validator(data, self)
561
+ validator(attrs, self)
570
562
 
571
563
  # Enforce model validation
572
- super().validate(data)
564
+ super().validate(attrs)
573
565
 
574
- return data
566
+ return attrs
575
567
 
576
568
 
577
569
  class DeviceNAPALMSerializer(serializers.Serializer):
@@ -644,22 +636,22 @@ class PowerPortSerializer(
644
636
 
645
637
 
646
638
  class InterfaceCommonSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
647
- def validate(self, data):
639
+ def validate(self, attrs):
648
640
  # Validate many-to-many VLAN assignments
649
- mode = data.get("mode", getattr(self.instance, "mode", None))
641
+ mode = attrs.get("mode", getattr(self.instance, "mode", None))
650
642
 
651
643
  if mode != InterfaceModeChoices.MODE_TAGGED:
652
- if data.get("tagged_vlans"):
644
+ if attrs.get("tagged_vlans"):
653
645
  raise serializers.ValidationError(
654
646
  {
655
647
  "tagged_vlans": f"Mode must be set to {InterfaceModeChoices.MODE_TAGGED} when specifying tagged_vlans"
656
648
  }
657
649
  )
658
650
 
659
- if data.get("tagged_vlans") != [] and self.instance and self.instance.tagged_vlans.exists():
651
+ if attrs.get("tagged_vlans") != [] and self.instance and self.instance.tagged_vlans.exists():
660
652
  raise serializers.ValidationError({"tagged_vlans": f"Clear tagged_vlans to set mode to {mode}"})
661
653
 
662
- return super().validate(data)
654
+ return super().validate(attrs)
663
655
 
664
656
 
665
657
  class InterfaceSerializer(
@@ -671,7 +663,7 @@ class InterfaceSerializer(
671
663
  type = ChoiceField(choices=InterfaceTypeChoices)
672
664
  mode = ChoiceField(choices=InterfaceModeChoices, allow_blank=True, required=False)
673
665
  mac_address = serializers.CharField(allow_blank=True, allow_null=True, required=False)
674
- ip_address_count = serializers.IntegerField(read_only=True)
666
+ ip_address_count = serializers.IntegerField(read_only=True, source="_ip_address_count")
675
667
 
676
668
  class Meta:
677
669
  model = Interface
@@ -760,18 +752,18 @@ class InventoryItemSerializer(TaggedModelSerializerMixin, TreeModelSerializerMix
760
752
  # https://www.django-rest-framework.org/api-guide/validators/#optional-fields
761
753
  validators = []
762
754
 
763
- def validate(self, data):
755
+ def validate(self, attrs):
764
756
  # Validate uniqueness of (device, parent, name) since we omitted the automatically created validator from Meta.
765
- if data.get("device") and data.get("parent") and data.get("name"):
757
+ if attrs.get("device") and attrs.get("parent") and attrs.get("name"):
766
758
  validator = UniqueTogetherValidator(
767
759
  queryset=InventoryItem.objects.all(),
768
760
  fields=("device", "parent", "name"),
769
761
  )
770
- validator(data, self)
762
+ validator(attrs, self)
771
763
 
772
- super().validate(data)
764
+ super().validate(attrs)
773
765
 
774
- return data
766
+ return attrs
775
767
 
776
768
 
777
769
  #
@@ -989,7 +981,7 @@ class DeviceTypeToSoftwareImageFileSerializer(ValidatedModelSerializer):
989
981
 
990
982
  class ControllerSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
991
983
  capabilities = serializers.ListField(
992
- child=ChoiceField(choices=ControllerCapabilitiesChoices, required=False), allow_empty=True
984
+ child=ChoiceField(choices=ControllerCapabilitiesChoices, required=False), allow_empty=True, required=False
993
985
  )
994
986
 
995
987
  class Meta:
@@ -999,7 +991,7 @@ class ControllerSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
999
991
 
1000
992
  class ControllerManagedDeviceGroupSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1001
993
  capabilities = serializers.ListField(
1002
- child=ChoiceField(choices=ControllerCapabilitiesChoices, required=False), allow_empty=True
994
+ child=ChoiceField(choices=ControllerCapabilitiesChoices, required=False), allow_empty=True, required=False
1003
995
  )
1004
996
 
1005
997
  class Meta:
@@ -1018,21 +1010,21 @@ class ModuleBaySerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1018
1010
  fields = "__all__"
1019
1011
  validators = []
1020
1012
 
1021
- def validate(self, data):
1013
+ def validate(self, attrs):
1022
1014
  """Validate device and module field constraints for module bay."""
1023
- if data.get("parent_device") and data.get("parent_module"):
1015
+ if attrs.get("parent_device") and attrs.get("parent_module"):
1024
1016
  raise serializers.ValidationError("Only one of parent_device or parent_module must be set")
1025
- if data.get("parent_device"):
1017
+ if attrs.get("parent_device"):
1026
1018
  validator = UniqueTogetherValidator(
1027
1019
  queryset=self.Meta.model.objects.all(), fields=("parent_device", "name")
1028
1020
  )
1029
- validator(data, self)
1030
- if data.get("parent_module"):
1021
+ validator(attrs, self)
1022
+ if attrs.get("parent_module"):
1031
1023
  validator = UniqueTogetherValidator(
1032
1024
  queryset=self.Meta.model.objects.all(), fields=("parent_module", "name")
1033
1025
  )
1034
- validator(data, self)
1035
- return super().validate(data)
1026
+ validator(attrs, self)
1027
+ return super().validate(attrs)
1036
1028
 
1037
1029
 
1038
1030
  class ModuleBayTemplateSerializer(NautobotModelSerializer):
@@ -1041,17 +1033,17 @@ class ModuleBayTemplateSerializer(NautobotModelSerializer):
1041
1033
  fields = "__all__"
1042
1034
  validators = []
1043
1035
 
1044
- def validate(self, data):
1036
+ def validate(self, attrs):
1045
1037
  """Validate device_type and module_type field constraints for module bay template."""
1046
- if data.get("device_type") and data.get("module_type"):
1038
+ if attrs.get("device_type") and attrs.get("module_type"):
1047
1039
  raise serializers.ValidationError("Only one of device_type or module_type must be set")
1048
- if data.get("device_type"):
1040
+ if attrs.get("device_type"):
1049
1041
  validator = UniqueTogetherValidator(queryset=self.Meta.model.objects.all(), fields=("device_type", "name"))
1050
- validator(data, self)
1051
- if data.get("module_type"):
1042
+ validator(attrs, self)
1043
+ if attrs.get("module_type"):
1052
1044
  validator = UniqueTogetherValidator(queryset=self.Meta.model.objects.all(), fields=("module_type", "name"))
1053
- validator(data, self)
1054
- return super().validate(data)
1045
+ validator(attrs, self)
1046
+ return super().validate(attrs)
1055
1047
 
1056
1048
 
1057
1049
  class ModuleSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
@@ -1061,17 +1053,17 @@ class ModuleSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1061
1053
 
1062
1054
  validators = []
1063
1055
 
1064
- def validate(self, data):
1056
+ def validate(self, attrs):
1065
1057
  """Validate asset_Tag, serial, parent_module_bay and location field constraints for module."""
1066
- if data.get("parent_module_bay") and data.get("location"):
1058
+ if attrs.get("parent_module_bay") and attrs.get("location"):
1067
1059
  raise serializers.ValidationError("Only one of parent_module_bay or location must be set")
1068
- if data.get("serial"):
1060
+ if attrs.get("serial"):
1069
1061
  validator = UniqueTogetherValidator(queryset=Module.objects.all(), fields=("module_type", "serial"))
1070
- validator(data, self)
1071
- if data.get("asset_tag"):
1062
+ validator(attrs, self)
1063
+ if attrs.get("asset_tag"):
1072
1064
  validator = UniqueValidator(queryset=Module.objects.all())
1073
- validator(data["asset_tag"], self.fields["asset_tag"])
1074
- return super().validate(data)
1065
+ validator(attrs["asset_tag"], self.fields["asset_tag"])
1066
+ return super().validate(attrs)
1075
1067
 
1076
1068
 
1077
1069
  class ModuleTypeSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
@@ -1080,16 +1072,16 @@ class ModuleTypeSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1080
1072
  fields = "__all__"
1081
1073
 
1082
1074
 
1083
- class VirtualDeviceContextSerializer(NautobotModelSerializer):
1075
+ class VirtualDeviceContextSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
1084
1076
  class Meta:
1085
1077
  model = VirtualDeviceContext
1086
1078
  fields = "__all__"
1087
1079
 
1088
- def validate(self, data):
1080
+ def validate(self, attrs):
1089
1081
  """Validate device cannot be changed for VirtualDeviceContext."""
1090
- if data.get("device") and self.instance and self.instance.device != data.get("device"):
1082
+ if attrs.get("device") and self.instance and self.instance.device != attrs.get("device"):
1091
1083
  raise serializers.ValidationError("Changing the device of a VirtualDeviceContext is not allowed.")
1092
- return super().validate(data)
1084
+ return super().validate(attrs)
1093
1085
 
1094
1086
 
1095
1087
  class InterfaceVDCAssignmentSerializer(ValidatedModelSerializer):
@@ -11,6 +11,7 @@ from drf_spectacular.types import OpenApiTypes
11
11
  from drf_spectacular.utils import extend_schema, OpenApiParameter
12
12
  from rest_framework.decorators import action
13
13
  from rest_framework.mixins import ListModelMixin
14
+ from rest_framework.parsers import JSONParser, MultiPartParser
14
15
  from rest_framework.permissions import IsAuthenticated
15
16
  from rest_framework.response import Response
16
17
  from rest_framework.viewsets import GenericViewSet, ViewSet
@@ -18,6 +19,7 @@ from rest_framework.viewsets import GenericViewSet, ViewSet
18
19
  from nautobot.circuits.models import Circuit
19
20
  from nautobot.cloud.models import CloudAccount
20
21
  from nautobot.core.api.exceptions import ServiceUnavailable
22
+ from nautobot.core.api.parsers import NautobotCSVParser
21
23
  from nautobot.core.api.utils import get_serializer_for_model
22
24
  from nautobot.core.api.views import ModelViewSet
23
25
  from nautobot.core.models.querysets import count_related
@@ -76,7 +78,7 @@ from nautobot.extras.api.views import (
76
78
  )
77
79
  from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices
78
80
  from nautobot.extras.secrets.exceptions import SecretError
79
- from nautobot.ipam.models import Prefix, VLAN
81
+ from nautobot.ipam.models import IPAddress, Prefix, VLAN
80
82
  from nautobot.virtualization.models import VirtualMachine
81
83
 
82
84
  from . import serializers
@@ -140,7 +142,7 @@ class PassThroughPortMixin:
140
142
 
141
143
 
142
144
  class LocationTypeViewSet(NautobotModelViewSet):
143
- queryset = LocationType.objects.select_related("parent").prefetch_related("content_types")
145
+ queryset = LocationType.objects.all()
144
146
  serializer_class = serializers.LocationTypeSerializer
145
147
  filterset_class = filters.LocationTypeFilterSet
146
148
 
@@ -151,17 +153,13 @@ class LocationTypeViewSet(NautobotModelViewSet):
151
153
 
152
154
 
153
155
  class LocationViewSet(NautobotModelViewSet):
154
- queryset = (
155
- Location.objects.select_related("location_type", "parent", "status", "tenant")
156
- .prefetch_related("tags")
157
- .annotate(
158
- device_count=count_related(Device, "location"),
159
- rack_count=count_related(Rack, "location"),
160
- prefix_count=count_related(Prefix, "locations"),
161
- vlan_count=count_related(VLAN, "locations"),
162
- circuit_count=count_related(Circuit, "circuit_terminations__location"),
163
- virtual_machine_count=count_related(VirtualMachine, "cluster__location"),
164
- )
156
+ queryset = Location.objects.annotate(
157
+ device_count=count_related(Device, "location"),
158
+ rack_count=count_related(Rack, "location"),
159
+ prefix_count=count_related(Prefix, "locations"),
160
+ vlan_count=count_related(VLAN, "locations"),
161
+ circuit_count=count_related(Circuit, "circuit_terminations__location"),
162
+ virtual_machine_count=count_related(VirtualMachine, "cluster__location"),
165
163
  )
166
164
  serializer_class = serializers.LocationSerializer
167
165
  filterset_class = filters.LocationFilterSet
@@ -173,7 +171,7 @@ class LocationViewSet(NautobotModelViewSet):
173
171
 
174
172
 
175
173
  class RackGroupViewSet(NautobotModelViewSet):
176
- queryset = RackGroup.objects.annotate(rack_count=count_related(Rack, "rack_group")).select_related("location")
174
+ queryset = RackGroup.objects.annotate(rack_count=count_related(Rack, "rack_group"))
177
175
  serializer_class = serializers.RackGroupSerializer
178
176
  filterset_class = filters.RackGroupFilterSet
179
177
 
@@ -184,13 +182,9 @@ class RackGroupViewSet(NautobotModelViewSet):
184
182
 
185
183
 
186
184
  class RackViewSet(NautobotModelViewSet):
187
- queryset = (
188
- Rack.objects.select_related("location", "rack_group__location", "status", "role", "tenant")
189
- .prefetch_related("tags")
190
- .annotate(
191
- device_count=count_related(Device, "rack"),
192
- power_feed_count=count_related(PowerFeed, "rack"),
193
- )
185
+ queryset = Rack.objects.select_related("rack_group__location").annotate(
186
+ device_count=count_related(Device, "rack"),
187
+ power_feed_count=count_related(PowerFeed, "rack"),
194
188
  )
195
189
  serializer_class = serializers.RackSerializer
196
190
  filterset_class = filters.RackFilterSet
@@ -255,7 +249,7 @@ class RackViewSet(NautobotModelViewSet):
255
249
 
256
250
 
257
251
  class RackReservationViewSet(NautobotModelViewSet):
258
- queryset = RackReservation.objects.select_related("rack", "user", "tenant")
252
+ queryset = RackReservation.objects.all()
259
253
  serializer_class = serializers.RackReservationSerializer
260
254
  filterset_class = filters.RackReservationFilterSet
261
255
 
@@ -295,13 +289,10 @@ class DeviceFamilyViewSet(NautobotModelViewSet):
295
289
 
296
290
 
297
291
  class DeviceTypeViewSet(NautobotModelViewSet):
298
- queryset = (
299
- DeviceType.objects.select_related("manufacturer")
300
- .prefetch_related("software_image_files", "tags")
301
- .annotate(device_count=count_related(Device, "device_type"))
302
- )
292
+ queryset = DeviceType.objects.annotate(device_count=count_related(Device, "device_type"))
303
293
  serializer_class = serializers.DeviceTypeSerializer
304
294
  filterset_class = filters.DeviceTypeFilterSet
295
+ parser_classes = [JSONParser, NautobotCSVParser, MultiPartParser]
305
296
 
306
297
 
307
298
  #
@@ -387,21 +378,8 @@ class PlatformViewSet(NautobotModelViewSet):
387
378
  class DeviceViewSet(ConfigContextQuerySetMixin, NautobotModelViewSet):
388
379
  queryset = Device.objects.select_related(
389
380
  "device_type__manufacturer",
390
- "role",
391
- "tenant",
392
- "platform",
393
- "rack",
394
- "location",
395
- "parent_bay",
396
- "primary_ip4",
397
- "primary_ip6",
398
- "software_version",
399
381
  "virtual_chassis__master",
400
- "device_redundancy_group",
401
- "controller_managed_device_group",
402
- "secrets_group",
403
- "status",
404
- ).prefetch_related("tags", "primary_ip4__nat_outside_list", "primary_ip6__nat_outside_list", "software_image_files")
382
+ ).prefetch_related("primary_ip4__nat_outside_list", "primary_ip6__nat_outside_list")
405
383
  serializer_class = serializers.DeviceSerializer
406
384
  filterset_class = filters.DeviceFilterSet
407
385
 
@@ -564,85 +542,65 @@ class DeviceViewSet(ConfigContextQuerySetMixin, NautobotModelViewSet):
564
542
 
565
543
 
566
544
  class ConsolePortViewSet(PathEndpointMixin, NautobotModelViewSet):
567
- queryset = ConsolePort.objects.select_related("device", "cable").prefetch_related(
568
- "_path__destination", "_cable_peer", "tags"
569
- )
545
+ queryset = ConsolePort.objects.prefetch_related("_path__destination", "_cable_peer")
570
546
  serializer_class = serializers.ConsolePortSerializer
571
547
  filterset_class = filters.ConsolePortFilterSet
572
548
 
573
549
 
574
550
  class ConsoleServerPortViewSet(PathEndpointMixin, NautobotModelViewSet):
575
- queryset = ConsoleServerPort.objects.select_related("device", "cable").prefetch_related(
576
- "_path__destination", "_cable_peer", "tags"
577
- )
551
+ queryset = ConsoleServerPort.objects.prefetch_related("_path__destination", "_cable_peer")
578
552
  serializer_class = serializers.ConsoleServerPortSerializer
579
553
  filterset_class = filters.ConsoleServerPortFilterSet
580
554
 
581
555
 
582
556
  class PowerPortViewSet(PathEndpointMixin, NautobotModelViewSet):
583
- queryset = PowerPort.objects.select_related("device", "cable").prefetch_related(
584
- "_path__destination", "_cable_peer", "tags"
585
- )
557
+ queryset = PowerPort.objects.prefetch_related("_path__destination", "_cable_peer")
586
558
  serializer_class = serializers.PowerPortSerializer
587
559
  filterset_class = filters.PowerPortFilterSet
588
560
 
589
561
 
590
562
  class PowerOutletViewSet(PathEndpointMixin, NautobotModelViewSet):
591
- queryset = PowerOutlet.objects.select_related("device", "cable").prefetch_related(
592
- "_path__destination", "_cable_peer", "tags"
593
- )
563
+ queryset = PowerOutlet.objects.prefetch_related("_path__destination", "_cable_peer")
594
564
  serializer_class = serializers.PowerOutletSerializer
595
565
  filterset_class = filters.PowerOutletFilterSet
596
566
 
597
567
 
598
568
  class InterfaceViewSet(PathEndpointMixin, NautobotModelViewSet):
599
- queryset = Interface.objects.select_related(
600
- "device",
601
- "parent_interface",
602
- "bridge",
603
- "lag",
604
- "status",
605
- "cable",
606
- "untagged_vlan",
607
- ).prefetch_related(
608
- "tags", "_path__destination", "_cable_peer", "ip_addresses", "tagged_vlans", "virtual_device_contexts"
569
+ queryset = Interface.objects.prefetch_related("_path__destination", "_cable_peer").annotate(
570
+ _ip_address_count=count_related(IPAddress, "interfaces") # avoid conflict with Interface.ip_address_count()
609
571
  )
610
572
  serializer_class = serializers.InterfaceSerializer
611
573
  filterset_class = filters.InterfaceFilterSet
612
574
 
613
575
 
614
576
  class FrontPortViewSet(PassThroughPortMixin, NautobotModelViewSet):
615
- queryset = FrontPort.objects.select_related(
616
- "device__device_type__manufacturer", "rear_port", "cable"
617
- ).prefetch_related("tags")
577
+ queryset = FrontPort.objects.select_related("device__device_type__manufacturer")
618
578
  serializer_class = serializers.FrontPortSerializer
619
579
  filterset_class = filters.FrontPortFilterSet
620
580
 
621
581
 
622
582
  class RearPortViewSet(PassThroughPortMixin, NautobotModelViewSet):
623
- queryset = RearPort.objects.select_related("device__device_type__manufacturer", "cable").prefetch_related("tags")
583
+ queryset = RearPort.objects.select_related("device__device_type__manufacturer")
624
584
  serializer_class = serializers.RearPortSerializer
625
585
  filterset_class = filters.RearPortFilterSet
626
586
 
627
587
 
628
588
  class DeviceBayViewSet(NautobotModelViewSet):
629
- queryset = DeviceBay.objects.select_related("installed_device").prefetch_related("tags")
589
+ queryset = DeviceBay.objects.all()
630
590
  serializer_class = serializers.DeviceBaySerializer
631
591
  filterset_class = filters.DeviceBayFilterSet
632
592
 
633
593
 
634
594
  class InventoryItemViewSet(NautobotModelViewSet):
635
- queryset = InventoryItem.objects.select_related("device", "manufacturer", "software_version").prefetch_related(
636
- "tags"
637
- )
595
+ queryset = InventoryItem.objects.all()
638
596
  serializer_class = serializers.InventoryItemSerializer
639
597
  filterset_class = filters.InventoryItemFilterSet
640
598
 
641
599
 
642
600
  class ModuleBayViewSet(NautobotModelViewSet):
643
- queryset = ModuleBay.objects.select_related(
644
- "parent_device__tenant", "parent_device__location", "parent_module"
645
- ).prefetch_related("installed_module", "tags")
601
+ queryset = ModuleBay.objects.select_related("parent_device__tenant", "parent_device__location").prefetch_related(
602
+ "installed_module"
603
+ )
646
604
  serializer_class = serializers.ModuleBaySerializer
647
605
  filterset_class = filters.ModuleBayFilterSet
648
606
 
@@ -681,7 +639,7 @@ class InterfaceConnectionViewSet(ListModelMixin, GenericViewSet):
681
639
 
682
640
 
683
641
  class CableViewSet(NautobotModelViewSet):
684
- queryset = Cable.objects.select_related("status").prefetch_related("termination_a", "termination_b")
642
+ queryset = Cable.objects.prefetch_related("termination_a", "termination_b")
685
643
  serializer_class = serializers.CableSerializer
686
644
  filterset_class = filters.CableFilterSet
687
645
 
@@ -692,9 +650,7 @@ class CableViewSet(NautobotModelViewSet):
692
650
 
693
651
 
694
652
  class VirtualChassisViewSet(NautobotModelViewSet):
695
- queryset = VirtualChassis.objects.prefetch_related("tags").annotate(
696
- member_count=count_related(Device, "virtual_chassis")
697
- )
653
+ queryset = VirtualChassis.objects.annotate(member_count=count_related(Device, "virtual_chassis"))
698
654
  serializer_class = serializers.VirtualChassisSerializer
699
655
  filterset_class = filters.VirtualChassisFilterSet
700
656
 
@@ -705,9 +661,7 @@ class VirtualChassisViewSet(NautobotModelViewSet):
705
661
 
706
662
 
707
663
  class PowerPanelViewSet(NautobotModelViewSet):
708
- queryset = PowerPanel.objects.select_related("location", "rack_group").annotate(
709
- power_feed_count=count_related(PowerFeed, "power_panel")
710
- )
664
+ queryset = PowerPanel.objects.annotate(power_feed_count=count_related(PowerFeed, "power_panel"))
711
665
  serializer_class = serializers.PowerPanelSerializer
712
666
  filterset_class = filters.PowerPanelFilterSet
713
667
 
@@ -718,12 +672,7 @@ class PowerPanelViewSet(NautobotModelViewSet):
718
672
 
719
673
 
720
674
  class PowerFeedViewSet(PathEndpointMixin, NautobotModelViewSet):
721
- queryset = PowerFeed.objects.select_related(
722
- "power_panel",
723
- "rack",
724
- "cable",
725
- "status",
726
- ).prefetch_related("tags", "_cable_peer", "_path__destination")
675
+ queryset = PowerFeed.objects.prefetch_related("_cable_peer", "_path__destination")
727
676
  serializer_class = serializers.PowerFeedSerializer
728
677
  filterset_class = filters.PowerFeedFilterSet
729
678
 
@@ -734,7 +683,7 @@ class PowerFeedViewSet(PathEndpointMixin, NautobotModelViewSet):
734
683
 
735
684
 
736
685
  class DeviceRedundancyGroupViewSet(NautobotModelViewSet):
737
- queryset = DeviceRedundancyGroup.objects.select_related("status").prefetch_related("devices")
686
+ queryset = DeviceRedundancyGroup.objects.all()
738
687
  serializer_class = serializers.DeviceRedundancyGroupSerializer
739
688
  filterset_class = filters.DeviceRedundancyGroupFilterSet
740
689
 
@@ -745,7 +694,7 @@ class DeviceRedundancyGroupViewSet(NautobotModelViewSet):
745
694
 
746
695
 
747
696
  class InterfaceRedundancyGroupViewSet(NautobotModelViewSet):
748
- queryset = InterfaceRedundancyGroup.objects.select_related("status").prefetch_related("interfaces")
697
+ queryset = InterfaceRedundancyGroup.objects.all()
749
698
  serializer_class = serializers.InterfaceRedundancyGroupSerializer
750
699
  filterset_class = filters.InterfaceRedundancyGroupFilterSet
751
700
 
@@ -821,21 +770,19 @@ class ConnectedDeviceViewSet(ViewSet):
821
770
 
822
771
 
823
772
  class SoftwareImageFileViewSet(NautobotModelViewSet):
824
- queryset = SoftwareImageFile.objects.select_related("software_version").prefetch_related("device_types")
773
+ queryset = SoftwareImageFile.objects.all()
825
774
  serializer_class = serializers.SoftwareImageFileSerializer
826
775
  filterset_class = filters.SoftwareImageFileFilterSet
827
776
 
828
777
 
829
778
  class SoftwareVersionViewSet(NautobotModelViewSet):
830
- queryset = SoftwareVersion.objects.select_related("platform").prefetch_related(
831
- "devices", "software_image_files", "inventory_items", "virtual_machines"
832
- )
779
+ queryset = SoftwareVersion.objects.all()
833
780
  serializer_class = serializers.SoftwareVersionSerializer
834
781
  filterset_class = filters.SoftwareVersionFilterSet
835
782
 
836
783
 
837
784
  class DeviceTypeToSoftwareImageFileViewSet(ModelViewSet):
838
- queryset = DeviceTypeToSoftwareImageFile.objects.select_related("device_type", "software_image_file")
785
+ queryset = DeviceTypeToSoftwareImageFile.objects.all()
839
786
  serializer_class = serializers.DeviceTypeToSoftwareImageFileSerializer
840
787
  filterset_class = filters.DeviceTypeToSoftwareImageFileFilterSet
841
788
 
@@ -846,23 +793,13 @@ class DeviceTypeToSoftwareImageFileViewSet(ModelViewSet):
846
793
 
847
794
 
848
795
  class ControllerViewSet(NautobotModelViewSet):
849
- queryset = Controller.objects.select_related(
850
- "location",
851
- "platform",
852
- "role",
853
- "tenant",
854
- "status",
855
- ).prefetch_related("tags")
796
+ queryset = Controller.objects.all()
856
797
  serializer_class = serializers.ControllerSerializer
857
798
  filterset_class = filters.ControllerFilterSet
858
799
 
859
800
 
860
801
  class ControllerManagedDeviceGroupViewSet(NautobotModelViewSet):
861
- queryset = ControllerManagedDeviceGroup.objects.select_related(
862
- "controller",
863
- "parent",
864
- ).prefetch_related("tags")
865
-
802
+ queryset = ControllerManagedDeviceGroup.objects.all()
866
803
  serializer_class = serializers.ControllerManagedDeviceGroupSerializer
867
804
  filterset_class = filters.ControllerManagedDeviceGroupFilterSet
868
805
 
@@ -877,27 +814,24 @@ class ModuleViewSet(NautobotModelViewSet):
877
814
  "parent_module_bay__parent_device__location",
878
815
  "parent_module_bay__parent_device__tenant",
879
816
  "module_type__manufacturer",
880
- "tenant",
881
- "role",
882
- "location",
883
- ).prefetch_related("module_bays", "tags")
817
+ )
884
818
  serializer_class = serializers.ModuleSerializer
885
819
  filterset_class = filters.ModuleFilterSet
886
820
 
887
821
 
888
822
  class ModuleTypeViewSet(NautobotModelViewSet):
889
- queryset = ModuleType.objects.select_related("manufacturer").prefetch_related("tags", "modules")
823
+ queryset = ModuleType.objects.all()
890
824
  serializer_class = serializers.ModuleTypeSerializer
891
825
  filterset_class = filters.ModuleTypeFilterSet
892
826
 
893
827
 
894
828
  class VirtualDeviceContextViewSet(NautobotModelViewSet):
895
- queryset = VirtualDeviceContext.objects.select_related("device", "tenant", "primary_ip4", "primary_ip6", "role")
829
+ queryset = VirtualDeviceContext.objects.all()
896
830
  serializer_class = serializers.VirtualDeviceContextSerializer
897
831
  filterset_class = filters.VirtualDeviceContextFilterSet
898
832
 
899
833
 
900
834
  class InterfaceVDCAssignmentViewSet(NautobotModelViewSet):
901
- queryset = InterfaceVDCAssignment.objects.select_related("virtual_device_context", "interface")
835
+ queryset = InterfaceVDCAssignment.objects.all()
902
836
  serializer_class = serializers.InterfaceVDCAssignmentSerializer
903
837
  filterset_class = filters.InterfaceVDCAssignmentFilterSet