nautobot 2.2.0__py3-none-any.whl → 2.2.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (362) hide show
  1. nautobot/apps/api.py +2 -1
  2. nautobot/apps/utils.py +0 -4
  3. nautobot/apps/views.py +0 -2
  4. nautobot/circuits/api/urls.py +2 -1
  5. nautobot/circuits/api/views.py +12 -0
  6. nautobot/circuits/tests/test_filters.py +1 -1
  7. nautobot/core/api/routers.py +3 -25
  8. nautobot/core/api/utils.py +0 -4
  9. nautobot/core/api/views.py +15 -21
  10. nautobot/core/filters.py +1 -7
  11. nautobot/core/management/commands/generate_test_data.py +4 -4
  12. nautobot/core/settings.py +0 -1
  13. nautobot/core/tables.py +1 -2
  14. nautobot/core/templates/admin/base.html +94 -23
  15. nautobot/core/templates/graphene/graphiql.html +47 -18
  16. nautobot/core/templates/inc/footer.html +5 -5
  17. nautobot/core/templates/inc/nav_menu.html +7 -0
  18. nautobot/core/templates/rest_framework/api.html +5 -12
  19. nautobot/core/templatetags/helpers.py +2 -2
  20. nautobot/core/testing/views.py +0 -30
  21. nautobot/core/tests/test_api.py +6 -13
  22. nautobot/core/tests/test_csv.py +4 -5
  23. nautobot/core/tests/test_filters.py +1 -2
  24. nautobot/core/tests/test_graphql.py +14 -4
  25. nautobot/core/tests/test_navigations.py +0 -3
  26. nautobot/core/tests/test_views.py +16 -22
  27. nautobot/core/utils/lookup.py +0 -124
  28. nautobot/core/views/__init__.py +7 -3
  29. nautobot/core/views/generic.py +3 -19
  30. nautobot/core/views/mixins.py +0 -7
  31. nautobot/core/views/renderers.py +1 -4
  32. nautobot/dcim/api/serializers.py +4 -4
  33. nautobot/dcim/api/urls.py +3 -2
  34. nautobot/dcim/api/views.py +18 -7
  35. nautobot/dcim/factory.py +7 -7
  36. nautobot/dcim/filters/__init__.py +17 -16
  37. nautobot/dcim/forms.py +45 -61
  38. nautobot/dcim/homepage.py +3 -11
  39. nautobot/dcim/migrations/0057_controller_models.py +70 -11
  40. nautobot/dcim/models/__init__.py +2 -2
  41. nautobot/dcim/models/devices.py +16 -14
  42. nautobot/dcim/models/racks.py +3 -1
  43. nautobot/dcim/navigation.py +31 -23
  44. nautobot/dcim/signals.py +6 -6
  45. nautobot/dcim/tables/__init__.py +2 -2
  46. nautobot/dcim/tables/devices.py +15 -12
  47. nautobot/dcim/tables/template_code.py +1 -1
  48. nautobot/dcim/templates/dcim/controller_retrieve.html +18 -35
  49. nautobot/dcim/templates/dcim/controllerdevicegroup_create.html +43 -0
  50. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +43 -67
  51. nautobot/dcim/templates/dcim/device.html +2 -10
  52. nautobot/dcim/templates/dcim/device_edit.html +1 -1
  53. nautobot/dcim/tests/test_api.py +6 -11
  54. nautobot/dcim/tests/test_filters.py +81 -92
  55. nautobot/dcim/tests/test_graphql.py +1 -11
  56. nautobot/dcim/tests/test_models.py +15 -15
  57. nautobot/dcim/tests/test_signals.py +0 -2
  58. nautobot/dcim/tests/test_views.py +12 -24
  59. nautobot/dcim/urls.py +1 -1
  60. nautobot/dcim/views.py +15 -19
  61. nautobot/extras/api/urls.py +2 -1
  62. nautobot/extras/api/views.py +10 -0
  63. nautobot/extras/filters/__init__.py +2 -53
  64. nautobot/extras/forms/contacts.py +0 -7
  65. nautobot/extras/managers.py +0 -14
  66. nautobot/extras/navigation.py +65 -71
  67. nautobot/extras/plugins/views.py +11 -7
  68. nautobot/extras/tests/test_api.py +0 -2
  69. nautobot/extras/tests/test_dynamicgroups.py +0 -2
  70. nautobot/extras/tests/test_filters.py +4 -89
  71. nautobot/extras/tests/test_models.py +0 -9
  72. nautobot/extras/tests/test_relationships.py +1 -10
  73. nautobot/extras/tests/test_views.py +1 -112
  74. nautobot/extras/views.py +10 -10
  75. nautobot/ipam/api/urls.py +2 -1
  76. nautobot/ipam/api/views.py +11 -0
  77. nautobot/ipam/tables.py +22 -2
  78. nautobot/ipam/tests/test_graphql.py +3 -2
  79. nautobot/ipam/tests/test_views.py +0 -1
  80. nautobot/ipam/views.py +9 -9
  81. nautobot/project-static/css/base.css +0 -1
  82. nautobot/project-static/docs/404.html +3 -24
  83. nautobot/project-static/docs/apps/index.html +3 -24
  84. nautobot/project-static/docs/apps/nautobot-apps.html +3 -24
  85. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +3 -24
  86. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +3 -24
  87. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +5 -26
  88. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +3 -24
  89. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +3 -24
  90. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +3 -24
  91. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +3 -24
  92. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +3 -24
  93. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +3 -24
  94. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +3 -24
  95. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +3 -24
  96. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +3 -24
  97. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +3 -24
  98. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +3 -24
  99. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +3 -24
  100. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +3 -24
  101. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +3 -24
  102. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +3 -24
  103. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3 -24
  104. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +3 -24
  105. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +3 -24
  106. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +3 -242
  107. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +5 -69
  108. nautobot/project-static/docs/development/apps/api/configuration-view.html +3 -24
  109. nautobot/project-static/docs/development/apps/api/database-backend-config.html +3 -24
  110. nautobot/project-static/docs/development/apps/api/models/django-admin.html +3 -24
  111. nautobot/project-static/docs/development/apps/api/models/global-search.html +3 -24
  112. nautobot/project-static/docs/development/apps/api/models/graphql.html +3 -24
  113. nautobot/project-static/docs/development/apps/api/models/index.html +3 -24
  114. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +3 -24
  115. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +3 -24
  116. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +3 -24
  117. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +3 -24
  118. nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -24
  119. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +3 -24
  120. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +3 -24
  121. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +3 -24
  122. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +3 -24
  123. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +3 -24
  124. nautobot/project-static/docs/development/apps/api/prometheus.html +3 -24
  125. nautobot/project-static/docs/development/apps/api/setup.html +3 -24
  126. nautobot/project-static/docs/development/apps/api/testing.html +3 -24
  127. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +3 -24
  128. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +3 -24
  129. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +3 -24
  130. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +3 -24
  131. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +3 -24
  132. nautobot/project-static/docs/development/apps/api/views/base-template.html +3 -24
  133. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +12 -38
  134. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +15 -41
  135. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +3 -24
  136. nautobot/project-static/docs/development/apps/api/views/index.html +3 -24
  137. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +3 -24
  138. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +3 -24
  139. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +3 -24
  140. nautobot/project-static/docs/development/apps/api/views/notes.html +3 -24
  141. nautobot/project-static/docs/development/apps/api/views/rest-api.html +3 -24
  142. nautobot/project-static/docs/development/apps/api/views/urls.html +3 -24
  143. nautobot/project-static/docs/development/apps/index.html +3 -24
  144. nautobot/project-static/docs/development/apps/migration/code-updates.html +3 -24
  145. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +3 -24
  146. nautobot/project-static/docs/development/apps/migration/from-v1.html +3 -24
  147. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +3 -24
  148. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +3 -24
  149. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +3 -24
  150. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +3 -24
  151. nautobot/project-static/docs/development/apps/porting-from-netbox.html +3 -24
  152. nautobot/project-static/docs/development/core/application-registry.html +3 -24
  153. nautobot/project-static/docs/development/core/best-practices.html +3 -24
  154. nautobot/project-static/docs/development/core/bootstrap-ui.html +3 -24
  155. nautobot/project-static/docs/development/core/caching.html +3 -24
  156. nautobot/project-static/docs/development/core/controllers.html +204 -35
  157. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +3 -24
  158. nautobot/project-static/docs/development/core/extending-models.html +3 -24
  159. nautobot/project-static/docs/development/core/generic-views.html +3 -24
  160. nautobot/project-static/docs/development/core/getting-started.html +13 -43
  161. nautobot/project-static/docs/development/core/homepage.html +3 -24
  162. nautobot/project-static/docs/development/core/index.html +3 -24
  163. nautobot/project-static/docs/development/core/model-features.html +3 -24
  164. nautobot/project-static/docs/development/core/natural-keys.html +3 -24
  165. nautobot/project-static/docs/development/core/navigation-menu.html +3 -24
  166. nautobot/project-static/docs/development/core/release-checklist.html +3 -24
  167. nautobot/project-static/docs/development/core/role-internals.html +3 -24
  168. nautobot/project-static/docs/development/core/settings.html +3 -24
  169. nautobot/project-static/docs/development/core/style-guide.html +3 -24
  170. nautobot/project-static/docs/development/core/templates.html +3 -24
  171. nautobot/project-static/docs/development/core/testing.html +3 -24
  172. nautobot/project-static/docs/development/core/user-preferences.html +3 -24
  173. nautobot/project-static/docs/development/index.html +3 -24
  174. nautobot/project-static/docs/development/jobs/index.html +3 -24
  175. nautobot/project-static/docs/development/jobs/migration/from-v1.html +3 -24
  176. nautobot/project-static/docs/index.html +3 -24
  177. nautobot/project-static/docs/models/dcim/{controllermanageddevicegroup.html → controllerdevicegroup.html} +3 -3
  178. nautobot/project-static/docs/objects.inv +0 -0
  179. nautobot/project-static/docs/release-notes/index.html +3 -24
  180. nautobot/project-static/docs/release-notes/version-1.0.html +3 -24
  181. nautobot/project-static/docs/release-notes/version-1.1.html +3 -24
  182. nautobot/project-static/docs/release-notes/version-1.2.html +3 -24
  183. nautobot/project-static/docs/release-notes/version-1.3.html +3 -24
  184. nautobot/project-static/docs/release-notes/version-1.4.html +3 -24
  185. nautobot/project-static/docs/release-notes/version-1.5.html +3 -24
  186. nautobot/project-static/docs/release-notes/version-1.6.html +3 -24
  187. nautobot/project-static/docs/release-notes/version-2.0.html +3 -24
  188. nautobot/project-static/docs/release-notes/version-2.1.html +162 -411
  189. nautobot/project-static/docs/release-notes/version-2.2.html +30 -212
  190. nautobot/project-static/docs/search/search_index.json +1 -1
  191. nautobot/project-static/docs/sitemap.xml +255 -260
  192. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  193. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +3 -24
  194. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +3 -24
  195. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +3 -24
  196. nautobot/project-static/docs/user-guide/administration/configuration/index.html +3 -24
  197. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +3 -24
  198. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +3 -24
  199. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +3 -24
  200. nautobot/project-static/docs/user-guide/administration/guides/caching.html +3 -24
  201. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +3 -24
  202. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +3 -24
  203. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +3 -24
  204. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +3 -24
  205. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +3 -24
  206. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +3 -24
  207. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +3 -24
  208. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +3 -24
  209. nautobot/project-static/docs/user-guide/administration/installation/docker.html +6 -31
  210. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +3 -24
  211. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -24
  212. nautobot/project-static/docs/user-guide/administration/installation/index.html +3 -24
  213. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +3 -24
  214. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +3 -24
  215. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +6 -27
  216. nautobot/project-static/docs/user-guide/administration/installation/services.html +3 -24
  217. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +3 -24
  218. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -24
  219. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +3 -24
  220. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +3 -24
  221. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +3 -24
  222. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +3 -24
  223. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +3 -24
  224. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +3 -24
  225. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +3 -24
  226. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +3 -24
  227. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +3 -24
  228. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +3 -24
  229. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +3 -24
  230. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +3 -24
  231. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +3 -24
  232. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +3 -24
  233. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +3 -24
  234. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +3 -24
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +3 -24
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +3 -24
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +3 -24
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +3 -24
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +3 -24
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +11 -259
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/{controllermanageddevicegroup.html → controllerdevicegroup.html} +17 -107
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +3 -24
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +3 -24
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +3 -24
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +3 -24
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +3 -24
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +3 -24
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +3 -24
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +3 -24
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +3 -24
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +3 -24
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +3 -24
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +3 -24
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +3 -24
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +3 -24
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +3 -24
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +3 -24
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +3 -24
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +3 -24
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +3 -24
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +3 -24
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +3 -24
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +3 -24
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +3 -24
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +3 -24
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +3 -24
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +3 -24
  268. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +3 -24
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +3 -24
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +3 -24
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +3 -24
  272. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +6 -27
  273. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +3 -24
  274. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +3 -24
  275. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +3 -24
  276. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +3 -24
  277. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +3 -24
  278. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +3 -24
  279. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +3 -24
  280. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +3 -24
  281. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +3 -24
  282. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +3 -24
  283. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +3 -24
  284. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +3 -24
  285. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +3 -24
  286. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +3 -24
  287. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +3 -24
  288. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +3 -24
  289. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +3 -24
  290. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +3 -24
  291. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +3 -24
  292. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +3 -24
  293. nautobot/project-static/docs/user-guide/feature-guides/{contacts-and-teams.html → contact-and-team.html} +4 -25
  294. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +5 -26
  295. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +3 -24
  296. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +3 -24
  297. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +3 -24
  298. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +3 -24
  299. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +3 -24
  300. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +3 -24
  301. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +5 -26
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +3 -24
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +3 -24
  304. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +3 -24
  305. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +3 -24
  306. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +3 -24
  307. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +3 -24
  308. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +3 -24
  309. nautobot/project-static/docs/user-guide/index.html +3 -24
  310. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +3 -24
  311. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +3 -24
  312. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -24
  313. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +3 -24
  314. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +3 -24
  315. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +3 -24
  316. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +3 -24
  317. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +3 -24
  318. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +3 -24
  319. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +3 -24
  320. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +3 -24
  321. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +3 -24
  322. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +3 -24
  323. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +3 -24
  324. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +3 -24
  325. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +3 -24
  326. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +3 -24
  327. nautobot/project-static/docs/user-guide/platform-functionality/note.html +3 -24
  328. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +3 -24
  329. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +3 -24
  330. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +3 -24
  331. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +3 -24
  332. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +3 -24
  333. nautobot/project-static/docs/user-guide/platform-functionality/role.html +3 -24
  334. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -24
  335. nautobot/project-static/docs/user-guide/platform-functionality/status.html +3 -24
  336. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +3 -24
  337. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +3 -24
  338. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +3 -24
  339. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +3 -24
  340. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +3 -24
  341. nautobot/tenancy/api/urls.py +2 -1
  342. nautobot/tenancy/api/views.py +12 -0
  343. nautobot/tenancy/tables.py +1 -1
  344. nautobot/tenancy/tests/test_views.py +0 -1
  345. nautobot/users/api/urls.py +2 -1
  346. nautobot/users/api/views.py +65 -2
  347. nautobot/users/views.py +8 -8
  348. nautobot/virtualization/api/urls.py +2 -1
  349. nautobot/virtualization/api/views.py +12 -0
  350. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/METADATA +3 -3
  351. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/RECORD +356 -361
  352. nautobot/core/tests/integration/test_view_authentication.py +0 -67
  353. nautobot/dcim/management/commands/migrate_location_contacts.py +0 -218
  354. nautobot/dcim/templates/dcim/controller_create.html +0 -70
  355. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -88
  356. nautobot/ipam/tests/test_tables.py +0 -42
  357. nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +0 -8581
  358. /nautobot/dcim/templates/dcim/{controllermanageddevicegroup_retrieve.html → controllerdevicegroup_retrieve.html} +0 -0
  359. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/LICENSE.txt +0 -0
  360. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/NOTICE +0 -0
  361. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/WHEEL +0 -0
  362. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/entry_points.txt +0 -0
@@ -13,6 +13,7 @@ from rest_framework.decorators import action
13
13
  from rest_framework.mixins import ListModelMixin
14
14
  from rest_framework.permissions import IsAuthenticated
15
15
  from rest_framework.response import Response
16
+ from rest_framework.routers import APIRootView
16
17
  from rest_framework.viewsets import GenericViewSet, ViewSet
17
18
 
18
19
  from nautobot.circuits.models import Circuit
@@ -29,7 +30,7 @@ from nautobot.dcim.models import (
29
30
  ConsoleServerPort,
30
31
  ConsoleServerPortTemplate,
31
32
  Controller,
32
- ControllerManagedDeviceGroup,
33
+ ControllerDeviceGroup,
33
34
  Device,
34
35
  DeviceBay,
35
36
  DeviceBayTemplate,
@@ -75,6 +76,16 @@ from nautobot.virtualization.models import VirtualMachine
75
76
  from . import serializers
76
77
  from .exceptions import MissingFilterException
77
78
 
79
+
80
+ class DCIMRootView(APIRootView):
81
+ """
82
+ DCIM API root view
83
+ """
84
+
85
+ def get_view_name(self):
86
+ return "DCIM"
87
+
88
+
78
89
  # Mixins
79
90
 
80
91
 
@@ -380,7 +391,7 @@ class DeviceViewSet(ConfigContextQuerySetMixin, NautobotModelViewSet):
380
391
  "software_version",
381
392
  "virtual_chassis__master",
382
393
  "device_redundancy_group",
383
- "controller_managed_device_group",
394
+ "controller_device_group",
384
395
  "secrets_group",
385
396
  "status",
386
397
  ).prefetch_related("tags", "primary_ip4__nat_outside_list", "primary_ip6__nat_outside_list", "software_image_files")
@@ -775,7 +786,7 @@ class ConnectedDeviceViewSet(ViewSet):
775
786
 
776
787
  # Determine local interface from peer interface's connection
777
788
  peer_interface = get_object_or_404(
778
- Interface.objects.restrict(request.user, "view"),
789
+ Interface.objects.all(),
779
790
  device__name=peer_device_name,
780
791
  name=peer_interface_name,
781
792
  )
@@ -829,11 +840,11 @@ class ControllerViewSet(NautobotModelViewSet):
829
840
  filterset_class = filters.ControllerFilterSet
830
841
 
831
842
 
832
- class ControllerManagedDeviceGroupViewSet(NautobotModelViewSet):
833
- queryset = ControllerManagedDeviceGroup.objects.select_related(
843
+ class ControllerDeviceGroupViewSet(NautobotModelViewSet):
844
+ queryset = ControllerDeviceGroup.objects.select_related(
834
845
  "controller",
835
846
  "parent",
836
847
  ).prefetch_related("tags")
837
848
 
838
- serializer_class = serializers.ControllerManagedDeviceGroupSerializer
839
- filterset_class = filters.ControllerManagedDeviceGroupFilterSet
849
+ serializer_class = serializers.ControllerDeviceGroupSerializer
850
+ filterset_class = filters.ControllerDeviceGroupFilterSet
nautobot/dcim/factory.py CHANGED
@@ -26,7 +26,7 @@ from nautobot.dcim.choices import (
26
26
  )
27
27
  from nautobot.dcim.models import (
28
28
  Controller,
29
- ControllerManagedDeviceGroup,
29
+ ControllerDeviceGroup,
30
30
  Device,
31
31
  DeviceFamily,
32
32
  DeviceRedundancyGroup,
@@ -167,7 +167,7 @@ class DeviceFactory(PrimaryModelFactory):
167
167
  factory.Faker("pyint", min_value=1, max_value=500),
168
168
  )
169
169
 
170
- controller_managed_device_group = random_instance(ControllerManagedDeviceGroup)
170
+ controller_device_group = random_instance(ControllerDeviceGroup)
171
171
 
172
172
  has_comments = NautobotBoolIterator()
173
173
  comments = factory.Maybe("has_comments", factory.Faker("bs"))
@@ -694,19 +694,19 @@ class ControllerFactory(PrimaryModelFactory):
694
694
  location = random_instance(lambda: Location.objects.get_for_model(Controller), allow_null=False)
695
695
  tenant = random_instance(Tenant)
696
696
  external_integration = random_instance(ExternalIntegration)
697
- controller_device = factory.Maybe("has_device", random_instance(Device), None)
698
- controller_device_redundancy_group = factory.Maybe("has_device", None, random_instance(DeviceRedundancyGroup))
697
+ deployed_controller_device = factory.Maybe("has_device", random_instance(Device), None)
698
+ deployed_controller_group = factory.Maybe("has_device", None, random_instance(DeviceRedundancyGroup))
699
699
 
700
700
 
701
- class ControllerManagedDeviceGroupFactory(PrimaryModelFactory):
701
+ class ControllerDeviceGroupFactory(PrimaryModelFactory):
702
702
  class Meta:
703
- model = ControllerManagedDeviceGroup
703
+ model = ControllerDeviceGroup
704
704
 
705
705
  class Params:
706
706
  has_parent = NautobotBoolIterator()
707
707
 
708
708
  name = UniqueFaker("word")
709
- parent = factory.Maybe("has_parent", random_instance(ControllerManagedDeviceGroup), None)
709
+ parent = factory.Maybe("has_parent", random_instance(ControllerDeviceGroup), None)
710
710
  controller = factory.LazyAttribute(
711
711
  lambda o: o.parent.controller if o.parent else Controller.objects.order_by("?").first()
712
712
  )
@@ -42,7 +42,7 @@ from nautobot.dcim.models import (
42
42
  ConsoleServerPort,
43
43
  ConsoleServerPortTemplate,
44
44
  Controller,
45
- ControllerManagedDeviceGroup,
45
+ ControllerDeviceGroup,
46
46
  Device,
47
47
  DeviceBay,
48
48
  DeviceBayTemplate,
@@ -99,7 +99,7 @@ __all__ = (
99
99
  "ConsoleServerPortFilterSet",
100
100
  "ConsoleServerPortTemplateFilterSet",
101
101
  "ControllerFilterSet",
102
- "ControllerManagedDeviceGroupFilterSet",
102
+ "ControllerDeviceGroupFilterSet",
103
103
  "DeviceBayFilterSet",
104
104
  "DeviceBayTemplateFilterSet",
105
105
  "DeviceFilterSet",
@@ -918,11 +918,11 @@ class DeviceFilterSet(
918
918
  to_field_name="name",
919
919
  label="Device Redundancy Groups (name or ID)",
920
920
  )
921
- controller_managed_device_group = NaturalKeyOrPKMultipleChoiceFilter(
922
- field_name="controller_managed_device_group",
923
- queryset=ControllerManagedDeviceGroup.objects.all(),
921
+ controller_device_group = NaturalKeyOrPKMultipleChoiceFilter(
922
+ field_name="controller_device_group",
923
+ queryset=ControllerDeviceGroup.objects.all(),
924
924
  to_field_name="name",
925
- label="Controller Managed Device Groups (name or ID)",
925
+ label="Controller Device Groups (name or ID)",
926
926
  )
927
927
  virtual_chassis_member = is_virtual_chassis_member
928
928
  has_console_ports = RelatedMembershipBooleanFilter(
@@ -1842,6 +1842,7 @@ class ControllerFilterSet(
1842
1842
  NautobotFilterSet,
1843
1843
  LocatableModelFilterSetMixin,
1844
1844
  TenancyModelFilterSetMixin,
1845
+ LocalContextModelFilterSetMixin,
1845
1846
  StatusModelFilterSetMixin,
1846
1847
  RoleModelFilterSetMixin,
1847
1848
  ):
@@ -1863,15 +1864,15 @@ class ControllerFilterSet(
1863
1864
  to_field_name="name",
1864
1865
  label="External integration (name or ID)",
1865
1866
  )
1866
- controller_device = NaturalKeyOrPKMultipleChoiceFilter(
1867
+ deployed_controller_device = NaturalKeyOrPKMultipleChoiceFilter(
1867
1868
  queryset=Device.objects.all(),
1868
1869
  to_field_name="name",
1869
- label="Controller device (name or ID)",
1870
+ label="Deployed controller device (name or ID)",
1870
1871
  )
1871
- controller_device_redundancy_group = NaturalKeyOrPKMultipleChoiceFilter(
1872
+ deployed_controller_group = NaturalKeyOrPKMultipleChoiceFilter(
1872
1873
  queryset=DeviceRedundancyGroup.objects.all(),
1873
1874
  to_field_name="name",
1874
- label="Controller device redundancy group (name or ID)",
1875
+ label="Deployed controller group (name or ID)",
1875
1876
  )
1876
1877
 
1877
1878
  class Meta:
@@ -1879,8 +1880,8 @@ class ControllerFilterSet(
1879
1880
  fields = "__all__"
1880
1881
 
1881
1882
 
1882
- class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
1883
- """Filters for ControllerManagedDeviceGroup model."""
1883
+ class ControllerDeviceGroupFilterSet(NautobotFilterSet):
1884
+ """Filters for ControllerDeviceGroup model."""
1884
1885
 
1885
1886
  q = SearchFilter(
1886
1887
  filter_predicates={
@@ -1893,7 +1894,7 @@ class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
1893
1894
  label="Controller (name or ID)",
1894
1895
  )
1895
1896
  parent = NaturalKeyOrPKMultipleChoiceFilter(
1896
- queryset=ControllerManagedDeviceGroup.objects.all(),
1897
+ queryset=ControllerDeviceGroup.objects.all(),
1897
1898
  to_field_name="name",
1898
1899
  label="Parent group (name or ID)",
1899
1900
  )
@@ -1905,7 +1906,7 @@ class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
1905
1906
  )
1906
1907
 
1907
1908
  class Meta:
1908
- model = ControllerManagedDeviceGroup
1909
+ model = ControllerDeviceGroup
1909
1910
  fields = "__all__"
1910
1911
 
1911
1912
  def generate_query__subtree(self, value):
@@ -1913,7 +1914,7 @@ class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
1913
1914
  if value:
1914
1915
  params = Q(pk__in=[v.pk for v in value])
1915
1916
  filter_name = "in"
1916
- for _ in range(ControllerManagedDeviceGroup.objects.max_depth + 1):
1917
+ for _ in range(ControllerDeviceGroup.objects.max_depth + 1):
1917
1918
  filter_name = f"parent__{filter_name}"
1918
1919
  params |= Q(**{filter_name: value})
1919
1920
  return params
@@ -1921,6 +1922,6 @@ class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
1921
1922
 
1922
1923
  @extend_schema_field({"type": "string"})
1923
1924
  def _subtree(self, queryset, name, value):
1924
- """FilterSet method for getting Groups that are or are descended from a given ControllerManagedDeviceGroup(s)."""
1925
+ """FilterSet method for getting Groups that are or are descended from a given ControllerDeviceGroup(s)."""
1925
1926
  params = self.generate_query__subtree(value)
1926
1927
  return queryset.filter(params)
nautobot/dcim/forms.py CHANGED
@@ -95,7 +95,7 @@ from .models import (
95
95
  ConsoleServerPort,
96
96
  ConsoleServerPortTemplate,
97
97
  Controller,
98
- ControllerManagedDeviceGroup,
98
+ ControllerDeviceGroup,
99
99
  Device,
100
100
  DeviceBay,
101
101
  DeviceBayTemplate,
@@ -1548,9 +1548,7 @@ class DeviceForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm, LocalC
1548
1548
  },
1549
1549
  )
1550
1550
  device_redundancy_group = DynamicModelChoiceField(queryset=DeviceRedundancyGroup.objects.all(), required=False)
1551
- controller_managed_device_group = DynamicModelChoiceField(
1552
- queryset=ControllerManagedDeviceGroup.objects.all(), required=False
1553
- )
1551
+ controller_device_group = DynamicModelChoiceField(queryset=ControllerDeviceGroup.objects.all(), required=False)
1554
1552
  position = forms.IntegerField(
1555
1553
  required=False,
1556
1554
  help_text="The lowest-numbered unit occupied by the device",
@@ -1620,7 +1618,7 @@ class DeviceForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm, LocalC
1620
1618
  "rack",
1621
1619
  "device_redundancy_group",
1622
1620
  "device_redundancy_group_priority",
1623
- "controller_managed_device_group",
1621
+ "controller_device_group",
1624
1622
  "position",
1625
1623
  "face",
1626
1624
  "status",
@@ -1762,9 +1760,7 @@ class DeviceBulkEditForm(
1762
1760
  secrets_group = DynamicModelChoiceField(queryset=SecretsGroup.objects.all(), required=False)
1763
1761
  device_redundancy_group = DynamicModelChoiceField(queryset=DeviceRedundancyGroup.objects.all(), required=False)
1764
1762
  device_redundancy_group_priority = forms.IntegerField(required=False, min_value=1)
1765
- controller_managed_device_group = DynamicModelChoiceField(
1766
- queryset=ControllerManagedDeviceGroup.objects.all(), required=False
1767
- )
1763
+ controller_device_group = DynamicModelChoiceField(queryset=ControllerDeviceGroup.objects.all(), required=False)
1768
1764
  software_version = DynamicModelChoiceField(queryset=SoftwareVersion.objects.all(), required=False)
1769
1765
  software_image_files = DynamicModelMultipleChoiceField(queryset=SoftwareImageFile.objects.all(), required=False)
1770
1766
 
@@ -1782,7 +1778,7 @@ class DeviceBulkEditForm(
1782
1778
  "secrets_group",
1783
1779
  "device_redundancy_group",
1784
1780
  "device_redundancy_group_priority",
1785
- "controller_managed_device_group",
1781
+ "controller_device_group",
1786
1782
  "software_image_files",
1787
1783
  "software_version",
1788
1784
  ]
@@ -1862,8 +1858,8 @@ class DeviceFilterForm(
1862
1858
  null_option="None",
1863
1859
  )
1864
1860
  device_redundancy_group_priority = NumericArrayField(base_field=forms.IntegerField(min_value=1), required=False)
1865
- controller_managed_device_group = DynamicModelMultipleChoiceField(
1866
- queryset=ControllerManagedDeviceGroup.objects.all(),
1861
+ controller_device_group = DynamicModelMultipleChoiceField(
1862
+ queryset=ControllerDeviceGroup.objects.all(),
1867
1863
  to_field_name="name",
1868
1864
  required=False,
1869
1865
  null_option="None",
@@ -4127,30 +4123,9 @@ class SoftwareVersionForm(NautobotModelForm):
4127
4123
  fields = "__all__"
4128
4124
 
4129
4125
 
4130
- class ControllerForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm):
4126
+ class ControllerForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm, LocalContextModelForm):
4131
4127
  """Controller create/edit form."""
4132
4128
 
4133
- platform = DynamicModelChoiceField(
4134
- queryset=Platform.objects.all(),
4135
- required=False,
4136
- )
4137
- tenant = DynamicModelChoiceField(
4138
- queryset=Tenant.objects.all(),
4139
- required=False,
4140
- )
4141
- external_integration = DynamicModelChoiceField(
4142
- queryset=ExternalIntegration.objects.all(),
4143
- required=False,
4144
- )
4145
- controller_device = DynamicModelChoiceField(
4146
- queryset=Device.objects.all(),
4147
- required=False,
4148
- )
4149
- controller_device_redundancy_group = DynamicModelChoiceField(
4150
- queryset=DeviceRedundancyGroup.objects.all(),
4151
- required=False,
4152
- )
4153
-
4154
4129
  class Meta:
4155
4130
  model = Controller
4156
4131
  fields = (
@@ -4162,14 +4137,15 @@ class ControllerForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm):
4162
4137
  "tenant",
4163
4138
  "location",
4164
4139
  "external_integration",
4165
- "controller_device",
4166
- "controller_device_redundancy_group",
4140
+ "deployed_controller_device",
4141
+ "deployed_controller_group",
4167
4142
  "tags",
4168
4143
  )
4169
4144
 
4170
4145
 
4171
4146
  class ControllerFilterForm(
4172
4147
  NautobotFilterForm,
4148
+ LocalContextFilterForm,
4173
4149
  LocatableModelFilterFormMixin,
4174
4150
  TenancyFilterForm,
4175
4151
  StatusModelFilterFormMixin,
@@ -4191,15 +4167,15 @@ class ControllerFilterForm(
4191
4167
  required=False,
4192
4168
  label="External integration",
4193
4169
  )
4194
- controller_device = DynamicModelMultipleChoiceField(
4170
+ deployed_controller_device = DynamicModelMultipleChoiceField(
4195
4171
  queryset=Device.objects.all(),
4196
4172
  required=False,
4197
- label="Controller device",
4173
+ label="Deployed controller device",
4198
4174
  )
4199
- controller_device_redundancy_group = DynamicModelMultipleChoiceField(
4175
+ deployed_controller_group = DynamicModelMultipleChoiceField(
4200
4176
  queryset=DeviceRedundancyGroup.objects.all(),
4201
4177
  required=False,
4202
- label="Controller device redundancy group",
4178
+ label="Deployed controller group",
4203
4179
  )
4204
4180
  tags = TagFilterField(model)
4205
4181
  field_order = (
@@ -4212,8 +4188,8 @@ class ControllerFilterForm(
4212
4188
  "platform",
4213
4189
  "tenant",
4214
4190
  "external_integration",
4215
- "controller_device",
4216
- "controller_device_redundancy_group",
4191
+ "deployed_controller_device",
4192
+ "deployed_controller_group",
4217
4193
  "tags",
4218
4194
  )
4219
4195
 
@@ -4224,6 +4200,7 @@ class ControllerBulkEditForm(
4224
4200
  StatusModelBulkEditFormMixin,
4225
4201
  RoleModelBulkEditFormMixin,
4226
4202
  NautobotBulkEditForm,
4203
+ LocalContextModelBulkEditForm,
4227
4204
  ):
4228
4205
  """Controller bulk edit form."""
4229
4206
 
@@ -4243,11 +4220,11 @@ class ControllerBulkEditForm(
4243
4220
  queryset=ExternalIntegration.objects.all(),
4244
4221
  required=False,
4245
4222
  )
4246
- controller_device = DynamicModelChoiceField(
4223
+ deployed_controller_device = DynamicModelChoiceField(
4247
4224
  queryset=Device.objects.all(),
4248
4225
  required=False,
4249
4226
  )
4250
- controller_device_redundancy_group = DynamicModelChoiceField(
4227
+ deployed_controller_group = DynamicModelChoiceField(
4251
4228
  queryset=DeviceRedundancyGroup.objects.all(),
4252
4229
  required=False,
4253
4230
  )
@@ -4262,24 +4239,24 @@ class ControllerBulkEditForm(
4262
4239
  "platform",
4263
4240
  "tenant",
4264
4241
  "external_integration",
4265
- "controller_device",
4266
- "controller_device_redundancy_group",
4242
+ "deployed_controller_device",
4243
+ "deployed_controller_group",
4267
4244
  "tags",
4268
4245
  )
4269
4246
 
4270
4247
 
4271
- class ControllerManagedDeviceGroupForm(NautobotModelForm):
4272
- """ControllerManagedDeviceGroup create/edit form."""
4248
+ class ControllerDeviceGroupForm(NautobotModelForm):
4249
+ """ControllerDeviceGroup create/edit form."""
4273
4250
 
4274
- controller = DynamicModelChoiceField(queryset=Controller.objects.all(), required=True)
4251
+ controller = DynamicModelChoiceField(queryset=Controller.objects.all(), required=False)
4275
4252
  devices = DynamicModelMultipleChoiceField(queryset=Device.objects.all(), required=False)
4276
- parent = DynamicModelChoiceField(queryset=ControllerManagedDeviceGroup.objects.all(), required=False)
4253
+ parent = DynamicModelChoiceField(queryset=ControllerDeviceGroup.objects.all(), required=False)
4277
4254
 
4278
4255
  class Meta:
4279
- model = ControllerManagedDeviceGroup
4256
+ model = ControllerDeviceGroup
4280
4257
  fields = (
4281
- "controller",
4282
4258
  "name",
4259
+ "controller",
4283
4260
  "devices",
4284
4261
  "parent",
4285
4262
  "weight",
@@ -4298,10 +4275,13 @@ class ControllerManagedDeviceGroupForm(NautobotModelForm):
4298
4275
  return instance
4299
4276
 
4300
4277
 
4301
- class ControllerManagedDeviceGroupFilterForm(NautobotFilterForm):
4302
- """ControllerManagedDeviceGroup basic filter form."""
4278
+ class ControllerDeviceGroupFilterForm(
4279
+ LocalContextFilterForm,
4280
+ NautobotFilterForm,
4281
+ ):
4282
+ """ControllerDeviceGroup basic filter form."""
4303
4283
 
4304
- model = ControllerManagedDeviceGroup
4284
+ model = ControllerDeviceGroup
4305
4285
  q = forms.CharField(required=False, label="Search")
4306
4286
  name = forms.CharField(required=False, label="Name")
4307
4287
  controller = DynamicModelChoiceField(
@@ -4310,13 +4290,13 @@ class ControllerManagedDeviceGroupFilterForm(NautobotFilterForm):
4310
4290
  label="Controller",
4311
4291
  )
4312
4292
  parent = DynamicModelChoiceField(
4313
- queryset=ControllerManagedDeviceGroup.objects.all(),
4293
+ queryset=ControllerDeviceGroup.objects.all(),
4314
4294
  required=False,
4315
4295
  label="Parent",
4316
4296
  )
4317
4297
  weight = forms.IntegerField(required=False, label="Weight")
4318
4298
  subtree = DynamicModelMultipleChoiceField(
4319
- queryset=ControllerManagedDeviceGroup.objects.all(),
4299
+ queryset=ControllerDeviceGroup.objects.all(),
4320
4300
  to_field_name="name",
4321
4301
  required=False,
4322
4302
  )
@@ -4332,19 +4312,23 @@ class ControllerManagedDeviceGroupFilterForm(NautobotFilterForm):
4332
4312
  )
4333
4313
 
4334
4314
 
4335
- class ControllerManagedDeviceGroupBulkEditForm(TagsBulkEditFormMixin, NautobotBulkEditForm):
4336
- """ControllerManagedDeviceGroup bulk edit form."""
4315
+ class ControllerDeviceGroupBulkEditForm(
4316
+ TagsBulkEditFormMixin,
4317
+ NautobotBulkEditForm,
4318
+ LocalContextModelBulkEditForm,
4319
+ ):
4320
+ """ControllerDeviceGroup bulk edit form."""
4337
4321
 
4338
4322
  pk = forms.ModelMultipleChoiceField(
4339
- queryset=ControllerManagedDeviceGroup.objects.all(),
4323
+ queryset=ControllerDeviceGroup.objects.all(),
4340
4324
  widget=forms.MultipleHiddenInput,
4341
4325
  )
4342
4326
  controller = DynamicModelChoiceField(queryset=Controller.objects.all(), required=False)
4343
- parent = DynamicModelChoiceField(queryset=ControllerManagedDeviceGroup.objects.all(), required=False)
4327
+ parent = DynamicModelChoiceField(queryset=ControllerDeviceGroup.objects.all(), required=False)
4344
4328
  weight = forms.IntegerField(required=False)
4345
4329
 
4346
4330
  class Meta:
4347
- model = ControllerManagedDeviceGroup
4331
+ model = ControllerDeviceGroup
4348
4332
  fields = (
4349
4333
  "controller",
4350
4334
  "parent",
nautobot/dcim/homepage.py CHANGED
@@ -79,21 +79,13 @@ layout = (
79
79
  description="Represents a set of devices which share a common control plane",
80
80
  weight=400,
81
81
  ),
82
- HomePageItem(
83
- name="Controllers",
84
- link="dcim:controller_list",
85
- model=models.Controller,
86
- permissions=["dcim.view_controller"],
87
- description="Represents a network or SDN (Software-Defined Networking) controllers",
88
- weight=500,
89
- ),
90
82
  HomePageItem(
91
83
  name="Device Redundancy Groups",
92
84
  link="dcim:deviceredundancygroup_list",
93
85
  model=models.DeviceRedundancyGroup,
94
86
  permissions=["dcim.view_deviceredundancygroup"],
95
87
  description="Represents a set of devices which operate in a failover/HA group",
96
- weight=600,
88
+ weight=500,
97
89
  ),
98
90
  HomePageItem(
99
91
  name="Interface Redundancy Groups",
@@ -101,11 +93,11 @@ layout = (
101
93
  model=models.InterfaceRedundancyGroup,
102
94
  permissions=["dcim.view_interfaceredundancygroup"],
103
95
  description="Represents a set of interfaces which operate in a failover/HA group",
104
- weight=700,
96
+ weight=550,
105
97
  ),
106
98
  HomePageGroup(
107
99
  name="Connections",
108
- weight=800,
100
+ weight=600,
109
101
  items=(
110
102
  HomePageItem(
111
103
  name="Cables",