nautobot 2.4.0b1__py3-none-any.whl → 2.4.1__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 (601) 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/views.py +3 -3
  22. nautobot/cloud/api/views.py +6 -10
  23. nautobot/cloud/models.py +1 -1
  24. nautobot/cloud/views.py +0 -16
  25. nautobot/core/api/constants.py +11 -0
  26. nautobot/core/api/fields.py +5 -5
  27. nautobot/core/api/filter_backends.py +3 -9
  28. nautobot/core/api/schema.py +13 -2
  29. nautobot/core/api/serializers.py +40 -34
  30. nautobot/core/api/views.py +56 -4
  31. nautobot/core/celery/log.py +4 -4
  32. nautobot/core/celery/schedulers.py +2 -2
  33. nautobot/core/choices.py +2 -2
  34. nautobot/core/events/__init__.py +3 -3
  35. nautobot/core/filters.py +67 -35
  36. nautobot/core/forms/__init__.py +19 -19
  37. nautobot/core/forms/fields.py +14 -11
  38. nautobot/core/forms/forms.py +33 -2
  39. nautobot/core/graphql/types.py +1 -1
  40. nautobot/core/jobs/__init__.py +28 -7
  41. nautobot/core/jobs/bulk_actions.py +285 -0
  42. nautobot/core/jobs/cleanup.py +48 -12
  43. nautobot/core/jobs/groups.py +1 -1
  44. nautobot/core/management/commands/validate_models.py +1 -1
  45. nautobot/core/models/__init__.py +3 -1
  46. nautobot/core/models/query_functions.py +2 -2
  47. nautobot/core/models/tree_queries.py +6 -3
  48. nautobot/core/settings.py +29 -2
  49. nautobot/core/settings.yaml +21 -0
  50. nautobot/core/tables.py +79 -61
  51. nautobot/core/templates/about.html +67 -0
  52. nautobot/core/templates/inc/media.html +3 -0
  53. nautobot/core/templates/inc/nav_menu.html +1 -0
  54. nautobot/core/templates/inc/tenancy_form_panel.html +9 -0
  55. nautobot/core/templates/inc/tenant_table_row.html +11 -0
  56. nautobot/core/templates/nautobot_config.py.j2 +13 -0
  57. nautobot/core/templates/search.html +7 -0
  58. nautobot/core/templates/utilities/render_jinja2.html +1 -1
  59. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  60. nautobot/core/templates/utilities/theme_preview.html +7 -0
  61. nautobot/core/templatetags/helpers.py +11 -2
  62. nautobot/core/testing/__init__.py +8 -8
  63. nautobot/core/testing/api.py +170 -15
  64. nautobot/core/testing/filters.py +45 -10
  65. nautobot/core/testing/forms.py +2 -0
  66. nautobot/core/testing/integration.py +86 -4
  67. nautobot/core/testing/mixins.py +7 -2
  68. nautobot/core/testing/views.py +44 -29
  69. nautobot/core/tests/integration/test_app_home.py +0 -1
  70. nautobot/core/tests/integration/test_app_navbar.py +0 -1
  71. nautobot/core/tests/integration/test_filters.py +0 -2
  72. nautobot/core/tests/integration/test_home.py +0 -1
  73. nautobot/core/tests/integration/test_navbar.py +0 -1
  74. nautobot/core/tests/integration/test_view_authentication.py +1 -0
  75. nautobot/core/tests/runner.py +1 -1
  76. nautobot/core/tests/test_api.py +98 -1
  77. nautobot/core/tests/test_csv.py +25 -3
  78. nautobot/core/tests/test_filters.py +209 -246
  79. nautobot/core/tests/test_forms.py +1 -0
  80. nautobot/core/tests/test_jobs.py +460 -1
  81. nautobot/core/tests/test_models.py +9 -0
  82. nautobot/core/tests/test_settings_schema.py +7 -0
  83. nautobot/core/tests/test_tables.py +100 -0
  84. nautobot/core/tests/test_utils.py +63 -1
  85. nautobot/core/tests/test_views.py +30 -3
  86. nautobot/core/ui/nav.py +1 -0
  87. nautobot/core/ui/object_detail.py +15 -1
  88. nautobot/core/urls.py +11 -0
  89. nautobot/core/utils/lookup.py +11 -8
  90. nautobot/core/utils/querysets.py +64 -0
  91. nautobot/core/utils/requests.py +24 -9
  92. nautobot/core/views/__init__.py +42 -0
  93. nautobot/core/views/generic.py +131 -197
  94. nautobot/core/views/mixins.py +126 -38
  95. nautobot/core/views/renderers.py +6 -6
  96. nautobot/dcim/api/serializers.py +56 -64
  97. nautobot/dcim/api/views.py +47 -113
  98. nautobot/dcim/constants.py +6 -13
  99. nautobot/dcim/factory.py +6 -1
  100. nautobot/dcim/filters/__init__.py +31 -2
  101. nautobot/dcim/forms.py +36 -17
  102. nautobot/dcim/graphql/types.py +2 -2
  103. nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +25 -0
  104. nautobot/dcim/models/__init__.py +1 -1
  105. nautobot/dcim/models/device_component_templates.py +2 -2
  106. nautobot/dcim/models/device_components.py +22 -20
  107. nautobot/dcim/models/devices.py +10 -1
  108. nautobot/dcim/models/locations.py +3 -3
  109. nautobot/dcim/models/power.py +6 -5
  110. nautobot/dcim/models/racks.py +4 -4
  111. nautobot/dcim/tables/__init__.py +3 -3
  112. nautobot/dcim/tables/devices.py +7 -5
  113. nautobot/dcim/tables/devicetypes.py +2 -2
  114. nautobot/dcim/tables/racks.py +1 -1
  115. nautobot/dcim/templates/dcim/controller_create.html +1 -7
  116. nautobot/dcim/templates/dcim/controller_retrieve.html +1 -9
  117. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +2 -0
  118. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +5 -0
  119. nautobot/dcim/templates/dcim/device.html +1 -9
  120. nautobot/dcim/templates/dcim/device_edit.html +36 -37
  121. nautobot/dcim/templates/dcim/location.html +1 -9
  122. nautobot/dcim/templates/dcim/location_edit.html +1 -7
  123. nautobot/dcim/templates/dcim/rack.html +1 -9
  124. nautobot/dcim/templates/dcim/rack_edit.html +1 -7
  125. nautobot/dcim/templates/dcim/rackreservation.html +1 -9
  126. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +1 -9
  127. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +1 -7
  128. nautobot/dcim/tests/integration/test_controller.py +62 -0
  129. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +71 -0
  130. nautobot/dcim/tests/integration/test_device_bulk_delete.py +189 -0
  131. nautobot/dcim/tests/integration/test_device_bulk_edit.py +181 -0
  132. nautobot/dcim/tests/test_api.py +16 -5
  133. nautobot/dcim/tests/test_filters.py +33 -0
  134. nautobot/dcim/tests/test_forms.py +51 -2
  135. nautobot/dcim/tests/test_graphql.py +52 -0
  136. nautobot/dcim/tests/test_jobs.py +118 -0
  137. nautobot/dcim/tests/test_models.py +52 -9
  138. nautobot/dcim/tests/test_views.py +21 -83
  139. nautobot/dcim/views.py +1 -13
  140. nautobot/extras/api/customfields.py +2 -2
  141. nautobot/extras/api/serializers.py +90 -85
  142. nautobot/extras/api/views.py +22 -27
  143. nautobot/extras/constants.py +2 -0
  144. nautobot/extras/filters/__init__.py +8 -6
  145. nautobot/extras/forms/base.py +2 -2
  146. nautobot/extras/forms/forms.py +139 -31
  147. nautobot/extras/forms/mixins.py +14 -6
  148. nautobot/extras/group_sync.py +3 -3
  149. nautobot/extras/health_checks.py +1 -2
  150. nautobot/extras/jobs.py +85 -18
  151. nautobot/extras/managers.py +3 -1
  152. nautobot/extras/migrations/0018_joblog_data_migration.py +7 -9
  153. nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +22 -0
  154. nautobot/extras/migrations/0121_alter_team_contacts.py +17 -0
  155. nautobot/extras/models/__init__.py +1 -1
  156. nautobot/extras/models/contacts.py +1 -1
  157. nautobot/extras/models/customfields.py +12 -11
  158. nautobot/extras/models/groups.py +11 -9
  159. nautobot/extras/models/jobs.py +23 -4
  160. nautobot/extras/models/models.py +2 -2
  161. nautobot/extras/plugins/__init__.py +13 -2
  162. nautobot/extras/plugins/marketplace_manifest.yml +84 -79
  163. nautobot/extras/plugins/tables.py +16 -14
  164. nautobot/extras/plugins/views.py +65 -69
  165. nautobot/extras/registry.py +1 -1
  166. nautobot/extras/secrets/__init__.py +2 -2
  167. nautobot/extras/tables.py +7 -5
  168. nautobot/extras/templates/extras/dynamicgroup.html +1 -9
  169. nautobot/extras/templates/extras/job_detail.html +16 -0
  170. nautobot/extras/templates/extras/job_edit.html +1 -0
  171. nautobot/extras/templates/extras/jobqueue_retrieve.html +1 -9
  172. nautobot/extras/templates/extras/marketplace.html +29 -11
  173. nautobot/extras/templates/extras/plugin_detail.html +32 -15
  174. nautobot/extras/templates/extras/plugins_tiles.html +21 -10
  175. nautobot/extras/templatetags/job_buttons.py +4 -4
  176. nautobot/extras/test_jobs/api_test_job.py +1 -1
  177. nautobot/extras/test_jobs/atomic_transaction.py +2 -2
  178. nautobot/extras/test_jobs/dry_run.py +1 -1
  179. nautobot/extras/test_jobs/fail.py +5 -5
  180. nautobot/extras/test_jobs/file_output.py +1 -1
  181. nautobot/extras/test_jobs/file_upload_fail.py +1 -1
  182. nautobot/extras/test_jobs/file_upload_pass.py +1 -1
  183. nautobot/extras/test_jobs/ipaddress_vars.py +3 -1
  184. nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
  185. nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
  186. nautobot/extras/test_jobs/log_redaction.py +1 -1
  187. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
  188. nautobot/extras/test_jobs/modify_db.py +1 -1
  189. nautobot/extras/test_jobs/object_var_optional.py +1 -1
  190. nautobot/extras/test_jobs/object_var_required.py +1 -1
  191. nautobot/extras/test_jobs/object_vars.py +1 -1
  192. nautobot/extras/test_jobs/pass.py +3 -3
  193. nautobot/extras/test_jobs/profiling.py +1 -1
  194. nautobot/extras/test_jobs/relative_import.py +3 -3
  195. nautobot/extras/test_jobs/singleton.py +16 -0
  196. nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
  197. nautobot/extras/test_jobs/task_queues.py +1 -1
  198. nautobot/extras/tests/integration/test_plugin_banner.py +0 -2
  199. nautobot/extras/tests/test_api.py +13 -13
  200. nautobot/extras/tests/test_customfields.py +1 -1
  201. nautobot/extras/tests/test_datasources.py +2 -1
  202. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  203. nautobot/extras/tests/test_filters.py +6 -6
  204. nautobot/extras/tests/test_forms.py +33 -1
  205. nautobot/extras/tests/test_jobs.py +178 -32
  206. nautobot/extras/tests/test_models.py +16 -10
  207. nautobot/extras/tests/test_plugins.py +62 -9
  208. nautobot/extras/tests/test_relationships.py +120 -9
  209. nautobot/extras/tests/test_views.py +56 -194
  210. nautobot/extras/utils.py +3 -2
  211. nautobot/extras/views.py +30 -98
  212. nautobot/ipam/api/fields.py +3 -3
  213. nautobot/ipam/api/serializers.py +41 -33
  214. nautobot/ipam/api/views.py +68 -117
  215. nautobot/ipam/factory.py +1 -1
  216. nautobot/ipam/filters.py +3 -2
  217. nautobot/ipam/lookups.py +101 -62
  218. nautobot/ipam/models.py +66 -16
  219. nautobot/ipam/querysets.py +2 -2
  220. nautobot/ipam/tables.py +23 -7
  221. nautobot/ipam/templates/ipam/ipaddress.html +1 -9
  222. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +1 -7
  223. nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -7
  224. nautobot/ipam/templates/ipam/prefix.html +1 -9
  225. nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
  226. nautobot/ipam/templates/ipam/vlan.html +1 -9
  227. nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
  228. nautobot/ipam/templates/ipam/vrf_edit.html +1 -7
  229. nautobot/ipam/tests/test_api.py +436 -3
  230. nautobot/ipam/tests/test_forms.py +49 -47
  231. nautobot/ipam/tests/test_migrations.py +30 -30
  232. nautobot/ipam/tests/test_models.py +95 -34
  233. nautobot/ipam/tests/test_querysets.py +63 -1
  234. nautobot/ipam/tests/test_views.py +3 -0
  235. nautobot/ipam/utils/__init__.py +36 -6
  236. nautobot/ipam/views.py +61 -87
  237. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  238. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  239. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +40 -2
  240. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  241. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  242. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  243. nautobot/project-static/docs/404.html +46 -4
  244. nautobot/project-static/docs/apps/index.html +46 -4
  245. nautobot/project-static/docs/apps/nautobot-apps.html +47 -6
  246. nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
  247. nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js → bundle.88dd0f4e.min.js} +2 -2
  248. nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js.map → bundle.88dd0f4e.min.js.map} +2 -2
  249. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +62 -10
  250. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +59 -7
  251. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +374 -122
  252. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +90 -18
  253. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +95 -21
  254. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +53 -6
  255. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +52 -5
  256. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +79 -17
  257. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +102 -28
  258. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +108 -21
  259. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +131 -38
  260. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +239 -65
  261. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +581 -165
  262. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +109 -36
  263. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +453 -167
  264. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +493 -211
  265. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +60 -8
  266. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +71 -15
  267. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +407 -55
  268. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +620 -205
  269. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +858 -412
  270. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +59 -7
  271. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +448 -186
  272. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +365 -147
  273. nautobot/project-static/docs/development/apps/api/configuration-view.html +46 -4
  274. nautobot/project-static/docs/development/apps/api/database-backend-config.html +46 -4
  275. nautobot/project-static/docs/development/apps/api/models/django-admin.html +46 -4
  276. nautobot/project-static/docs/development/apps/api/models/global-search.html +46 -4
  277. nautobot/project-static/docs/development/apps/api/models/graphql.html +46 -4
  278. nautobot/project-static/docs/development/apps/api/models/index.html +46 -4
  279. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +46 -4
  280. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +46 -4
  281. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +46 -4
  282. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +46 -4
  283. nautobot/project-static/docs/development/apps/api/platform-features/index.html +46 -4
  284. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +46 -4
  285. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +46 -4
  286. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +46 -4
  287. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +46 -4
  288. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +68 -7
  289. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +46 -4
  290. nautobot/project-static/docs/development/apps/api/prometheus.html +46 -4
  291. nautobot/project-static/docs/development/apps/api/setup.html +46 -4
  292. nautobot/project-static/docs/development/apps/api/testing.html +46 -4
  293. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +46 -4
  294. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +46 -4
  295. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +46 -4
  296. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +46 -4
  297. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +46 -4
  298. nautobot/project-static/docs/development/apps/api/views/base-template.html +46 -4
  299. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +46 -4
  300. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +46 -4
  301. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +46 -4
  302. nautobot/project-static/docs/development/apps/api/views/index.html +46 -4
  303. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +46 -4
  304. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +46 -4
  305. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +46 -4
  306. nautobot/project-static/docs/development/apps/api/views/notes.html +46 -4
  307. nautobot/project-static/docs/development/apps/api/views/rest-api.html +52 -6
  308. nautobot/project-static/docs/development/apps/api/views/urls.html +46 -4
  309. nautobot/project-static/docs/development/apps/index.html +46 -4
  310. nautobot/project-static/docs/development/apps/migration/code-updates.html +46 -4
  311. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +46 -4
  312. nautobot/project-static/docs/development/apps/migration/from-v1.html +46 -4
  313. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +46 -4
  314. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +46 -4
  315. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +46 -4
  316. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +46 -4
  317. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +50 -8
  318. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +46 -4
  319. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +211 -14
  320. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +46 -4
  321. nautobot/project-static/docs/development/apps/porting-from-netbox.html +46 -4
  322. nautobot/project-static/docs/development/core/application-registry.html +46 -4
  323. nautobot/project-static/docs/development/core/best-practices.html +46 -4
  324. nautobot/project-static/docs/development/core/bootstrap-ui.html +46 -4
  325. nautobot/project-static/docs/development/core/caching.html +46 -4
  326. nautobot/project-static/docs/development/core/controllers.html +46 -4
  327. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +73 -74
  328. nautobot/project-static/docs/development/core/generic-views.html +46 -4
  329. nautobot/project-static/docs/development/core/getting-started.html +249 -224
  330. nautobot/project-static/docs/development/core/homepage.html +49 -7
  331. nautobot/project-static/docs/development/core/index.html +46 -4
  332. nautobot/project-static/docs/development/core/{local-k8s.html → minikube-dev-environment-for-k8s-jobs.html} +469 -168
  333. nautobot/project-static/docs/development/core/model-checklist.html +56 -12
  334. nautobot/project-static/docs/development/core/model-features.html +46 -4
  335. nautobot/project-static/docs/development/core/natural-keys.html +46 -4
  336. nautobot/project-static/docs/development/core/navigation-menu.html +46 -4
  337. nautobot/project-static/docs/development/core/release-checklist.html +49 -7
  338. nautobot/project-static/docs/development/core/role-internals.html +46 -4
  339. nautobot/project-static/docs/development/core/settings.html +46 -4
  340. nautobot/project-static/docs/development/core/style-guide.html +49 -7
  341. nautobot/project-static/docs/development/core/templates.html +46 -4
  342. nautobot/project-static/docs/development/core/testing.html +46 -4
  343. nautobot/project-static/docs/development/core/ui-component-framework.html +369 -273
  344. nautobot/project-static/docs/development/core/user-preferences.html +46 -4
  345. nautobot/project-static/docs/development/index.html +46 -4
  346. nautobot/project-static/docs/development/jobs/index.html +216 -122
  347. nautobot/project-static/docs/development/jobs/migration/from-v1.html +46 -4
  348. nautobot/project-static/docs/index.html +54 -23
  349. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
  350. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
  351. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
  352. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
  353. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
  354. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
  355. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
  356. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
  357. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
  358. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
  359. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
  360. nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
  361. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
  362. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
  363. nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
  364. nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
  365. nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
  366. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
  367. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
  368. nautobot/project-static/docs/objects.inv +0 -0
  369. nautobot/project-static/docs/overview/application_stack.html +47 -7
  370. nautobot/project-static/docs/overview/design_philosophy.html +46 -4
  371. nautobot/project-static/docs/release-notes/index.html +52 -12
  372. nautobot/project-static/docs/release-notes/version-1.0.html +234 -193
  373. nautobot/project-static/docs/release-notes/version-1.1.html +231 -190
  374. nautobot/project-static/docs/release-notes/version-1.2.html +306 -265
  375. nautobot/project-static/docs/release-notes/version-1.3.html +332 -291
  376. nautobot/project-static/docs/release-notes/version-1.4.html +417 -377
  377. nautobot/project-static/docs/release-notes/version-1.5.html +605 -566
  378. nautobot/project-static/docs/release-notes/version-1.6.html +904 -447
  379. nautobot/project-static/docs/release-notes/version-2.0.html +528 -489
  380. nautobot/project-static/docs/release-notes/version-2.1.html +363 -324
  381. nautobot/project-static/docs/release-notes/version-2.2.html +356 -317
  382. nautobot/project-static/docs/release-notes/version-2.3.html +997 -352
  383. nautobot/project-static/docs/release-notes/version-2.4.html +525 -101
  384. nautobot/project-static/docs/requirements.txt +2 -2
  385. nautobot/project-static/docs/search/search_index.json +1 -1
  386. nautobot/project-static/docs/sitemap.xml +295 -287
  387. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  388. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +46 -4
  389. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +46 -4
  390. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +48 -6
  391. nautobot/project-static/docs/user-guide/administration/configuration/index.html +46 -4
  392. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +46 -4
  393. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +110 -8
  394. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +46 -4
  395. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +46 -4
  396. nautobot/project-static/docs/user-guide/administration/guides/docker.html +46 -4
  397. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +46 -4
  398. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +46 -4
  399. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +46 -4
  400. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +46 -4
  401. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +46 -4
  402. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +48 -6
  403. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +46 -4
  404. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +46 -4
  405. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +46 -4
  406. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +66 -8
  407. nautobot/project-static/docs/user-guide/administration/installation/index.html +46 -4
  408. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +47 -5
  409. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +46 -4
  410. nautobot/project-static/docs/user-guide/administration/installation/services.html +46 -4
  411. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +46 -4
  412. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +46 -4
  413. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +46 -4
  414. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +46 -4
  415. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +46 -4
  416. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +46 -4
  417. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +46 -4
  418. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +46 -4
  419. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +46 -4
  420. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +49 -8
  421. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +46 -4
  422. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +46 -4
  423. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +46 -4
  424. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +46 -4
  425. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +46 -4
  426. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +46 -4
  427. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +46 -4
  428. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +46 -4
  429. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +46 -4
  430. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +46 -4
  431. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +46 -4
  432. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +46 -4
  433. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +46 -4
  434. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +46 -4
  435. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +46 -4
  436. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +46 -4
  437. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +46 -4
  438. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +46 -4
  439. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +46 -4
  440. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +46 -4
  441. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +46 -4
  442. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +46 -4
  443. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +46 -4
  444. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +46 -4
  445. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +46 -4
  446. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +46 -4
  447. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +46 -4
  448. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +46 -4
  449. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +46 -4
  450. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +46 -4
  451. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +46 -4
  452. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +46 -4
  453. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +46 -4
  454. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +46 -4
  455. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +46 -4
  456. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +46 -4
  457. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +46 -4
  458. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +46 -4
  459. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +46 -4
  460. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +46 -4
  461. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +46 -4
  462. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +46 -4
  463. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +46 -4
  464. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +46 -4
  465. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +46 -4
  466. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +46 -4
  467. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +46 -4
  468. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +46 -4
  469. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +46 -4
  470. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +46 -4
  471. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +46 -4
  472. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +46 -4
  473. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +46 -4
  474. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +46 -4
  475. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +46 -4
  476. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +46 -4
  477. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +46 -4
  478. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +50 -12
  479. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +46 -4
  480. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +46 -4
  481. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +46 -4
  482. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +46 -4
  483. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +46 -4
  484. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +46 -4
  485. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +46 -4
  486. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +46 -4
  487. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +46 -4
  488. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +46 -4
  489. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +46 -4
  490. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +46 -4
  491. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +49 -7
  492. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +46 -4
  493. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +46 -4
  494. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +46 -4
  495. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +46 -4
  496. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +46 -4
  497. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +46 -4
  498. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +46 -4
  499. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +46 -4
  500. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +46 -4
  501. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +46 -4
  502. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +46 -4
  503. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +46 -4
  504. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +46 -4
  505. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +46 -4
  506. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +46 -4
  507. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +46 -4
  508. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +46 -4
  509. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +46 -4
  510. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +46 -4
  511. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +46 -4
  512. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +46 -4
  513. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +46 -4
  514. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +51 -7
  515. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +46 -4
  516. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
  517. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
  518. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
  519. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
  520. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
  521. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
  522. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
  523. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
  524. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
  525. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
  526. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
  527. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
  528. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
  529. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +46 -4
  530. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +46 -4
  531. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +49 -7
  532. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +9444 -0
  533. nautobot/project-static/docs/user-guide/index.html +46 -4
  534. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +46 -4
  535. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +50 -8
  536. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +46 -4
  537. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +46 -4
  538. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +46 -4
  539. nautobot/project-static/docs/user-guide/platform-functionality/events.html +46 -4
  540. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +46 -4
  541. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +46 -4
  542. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +46 -4
  543. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +46 -4
  544. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +46 -4
  545. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +46 -4
  546. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +50 -7
  547. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +46 -4
  548. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +49 -7
  549. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +46 -4
  550. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +46 -4
  551. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9722 -0
  552. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +46 -4
  553. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +46 -4
  554. nautobot/project-static/docs/user-guide/platform-functionality/note.html +46 -4
  555. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +46 -4
  556. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +47 -5
  557. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +46 -4
  558. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +46 -4
  559. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +94 -25
  560. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +74 -5
  561. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +46 -4
  562. nautobot/project-static/docs/user-guide/platform-functionality/role.html +46 -4
  563. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +46 -4
  564. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +46 -4
  565. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +46 -4
  566. nautobot/project-static/docs/user-guide/platform-functionality/status.html +46 -4
  567. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +46 -4
  568. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +46 -4
  569. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +46 -4
  570. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +46 -4
  571. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +46 -4
  572. nautobot/project-static/js/forms.js +1 -1
  573. nautobot/tenancy/api/views.py +9 -13
  574. nautobot/tenancy/views.py +4 -2
  575. nautobot/users/admin.py +1 -1
  576. nautobot/users/api/serializers.py +5 -4
  577. nautobot/users/api/views.py +3 -3
  578. nautobot/virtualization/api/serializers.py +4 -4
  579. nautobot/virtualization/api/views.py +5 -24
  580. nautobot/virtualization/filters.py +20 -3
  581. nautobot/virtualization/models.py +1 -1
  582. nautobot/virtualization/tables.py +2 -2
  583. nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
  584. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -9
  585. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
  586. nautobot/virtualization/tests/test_filters.py +17 -0
  587. nautobot/wireless/filters.py +2 -2
  588. nautobot/wireless/forms.py +1 -1
  589. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +1 -9
  590. nautobot/wireless/tests/integration/__init__.py +0 -0
  591. nautobot/wireless/tests/integration/test_radio_profile.py +42 -0
  592. nautobot/wireless/tests/test_filters.py +29 -1
  593. nautobot/wireless/tests/test_views.py +22 -1
  594. nautobot/wireless/views.py +0 -10
  595. {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/METADATA +6 -6
  596. {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/RECORD +600 -550
  597. {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/WHEEL +1 -1
  598. nautobot/core/fixtures/user-data.json +0 -59
  599. {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/LICENSE.txt +0 -0
  600. {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/NOTICE +0 -0
  601. {nautobot-2.4.0b1.dist-info → nautobot-2.4.1.dist-info}/entry_points.txt +0 -0
@@ -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
@@ -27,19 +27,12 @@ REARPORT_POSITIONS_MAX = 1024
27
27
  INTERFACE_MTU_MIN = 1
28
28
  INTERFACE_MTU_MAX = 32767 # Max value of a signed 16-bit integer
29
29
 
30
- VIRTUAL_IFACE_TYPES = [
31
- InterfaceTypeChoices.TYPE_VIRTUAL,
32
- InterfaceTypeChoices.TYPE_BRIDGE,
33
- InterfaceTypeChoices.TYPE_LAG,
34
- ]
35
-
36
- WIRELESS_IFACE_TYPES = [
37
- InterfaceTypeChoices.TYPE_80211A,
38
- InterfaceTypeChoices.TYPE_80211G,
39
- InterfaceTypeChoices.TYPE_80211N,
40
- InterfaceTypeChoices.TYPE_80211AC,
41
- InterfaceTypeChoices.TYPE_80211AD,
42
- ]
30
+ interface_type_by_category = {}
31
+ for category_name, category_item_tuples in InterfaceTypeChoices.CHOICES:
32
+ interface_type_by_category[category_name] = [item_tuple[0] for item_tuple in category_item_tuples]
33
+
34
+ WIRELESS_IFACE_TYPES = interface_type_by_category["Wireless"]
35
+ VIRTUAL_IFACE_TYPES = interface_type_by_category["Virtual interfaces"]
43
36
 
44
37
  NONCONNECTABLE_IFACE_TYPES = VIRTUAL_IFACE_TYPES + WIRELESS_IFACE_TYPES
45
38
 
nautobot/dcim/factory.py CHANGED
@@ -201,7 +201,12 @@ class DeviceFactory(PrimaryModelFactory):
201
201
  if extracted:
202
202
  self.software_image_files.set(extracted)
203
203
  else:
204
- self.software_image_files.set(get_random_instances(SoftwareImageFile))
204
+ self.software_image_files.set(
205
+ get_random_instances(
206
+ SoftwareImageFile.objects.filter(default_image=True)
207
+ | SoftwareImageFile.objects.filter(device_types=self.device_type)
208
+ )
209
+ )
205
210
 
206
211
  # TODO to be done after these model factories are done.
207
212
  # has_cluster = NautobotBoolIterator()
@@ -128,8 +128,8 @@ __all__ = (
128
128
  "FrontPortTemplateFilterSet",
129
129
  "InterfaceConnectionFilterSet",
130
130
  "InterfaceFilterSet",
131
- "InterfaceRedundancyGroupFilterSet",
132
131
  "InterfaceRedundancyGroupAssociationFilterSet",
132
+ "InterfaceRedundancyGroupFilterSet",
133
133
  "InterfaceTemplateFilterSet",
134
134
  "InventoryItemFilterSet",
135
135
  "LocationFilterSet",
@@ -907,6 +907,12 @@ class DeviceFilterSet(
907
907
  to_field_name="version",
908
908
  label="Software version (version or ID)",
909
909
  )
910
+ ip_addresses = MultiValueCharFilter(
911
+ method="filter_ip_addresses",
912
+ label="IP addresses (address or ID)",
913
+ distinct=True,
914
+ )
915
+ has_ip_addresses = RelatedMembershipBooleanFilter(field_name="interfaces__ip_addresses", label="Has IP addresses")
910
916
  radio_profiles = NaturalKeyOrPKMultipleChoiceFilter(
911
917
  field_name="controller_managed_device_group__radio_profiles",
912
918
  queryset=RadioProfile.objects.all(),
@@ -928,6 +934,13 @@ class DeviceFilterSet(
928
934
  label="Has wireless networks",
929
935
  )
930
936
 
937
+ def filter_ip_addresses(self, queryset, name, value):
938
+ pk_values = set(item for item in value if is_uuid(item))
939
+ addresses = set(item for item in value if item not in pk_values)
940
+
941
+ ip_queryset = IPAddress.objects.filter_address_or_pk_in(addresses, pk_values)
942
+ return queryset.filter(interfaces__ip_addresses__in=ip_queryset).distinct()
943
+
931
944
  class Meta:
932
945
  model = Device
933
946
  fields = [
@@ -1154,6 +1167,12 @@ class InterfaceFilterSet(
1154
1167
  queryset=InterfaceRedundancyGroup.objects.all(),
1155
1168
  to_field_name="name",
1156
1169
  )
1170
+ ip_addresses = MultiValueCharFilter(
1171
+ method="filter_ip_addresses",
1172
+ label="IP addresses (address or ID)",
1173
+ distinct=True,
1174
+ )
1175
+ has_ip_addresses = RelatedMembershipBooleanFilter(field_name="ip_addresses", label="Has IP addresses")
1157
1176
  virtual_device_contexts = NaturalKeyOrPKMultipleChoiceFilter(
1158
1177
  queryset=VirtualDeviceContext.objects.all(),
1159
1178
  to_field_name="name",
@@ -1164,6 +1183,13 @@ class InterfaceFilterSet(
1164
1183
  label="Has Virtual Device Context",
1165
1184
  )
1166
1185
 
1186
+ def filter_ip_addresses(self, queryset, name, value):
1187
+ pk_values = set(item for item in value if is_uuid(item))
1188
+ addresses = set(item for item in value if item not in pk_values)
1189
+
1190
+ ip_queryset = IPAddress.objects.filter_address_or_pk_in(addresses, pk_values)
1191
+ return queryset.filter(ip_addresses__in=ip_queryset).distinct()
1192
+
1167
1193
  class Meta:
1168
1194
  model = Interface
1169
1195
  fields = [
@@ -1884,7 +1910,10 @@ class ControllerFilterSet(
1884
1910
  fields = "__all__"
1885
1911
 
1886
1912
 
1887
- class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
1913
+ class ControllerManagedDeviceGroupFilterSet(
1914
+ NautobotFilterSet,
1915
+ TenancyModelFilterSetMixin,
1916
+ ):
1888
1917
  """Filters for ControllerManagedDeviceGroup model."""
1889
1918
 
1890
1919
  q = SearchFilter(