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
@@ -1,4 +1,4 @@
1
- # Generated by Django 3.2.24 on 2024-03-22 15:36
1
+ # Generated by Django 3.2.24 on 2024-03-08 10:18
2
2
 
3
3
  import uuid
4
4
 
@@ -9,13 +9,16 @@ import django.db.models.deletion
9
9
  import nautobot.core.models.fields
10
10
  import nautobot.core.models.tree_queries
11
11
  import nautobot.extras.models.mixins
12
+ import nautobot.extras.models.models
12
13
  import nautobot.extras.models.roles
13
14
  import nautobot.extras.models.statuses
15
+ import nautobot.extras.utils
14
16
 
15
17
 
16
18
  class Migration(migrations.Migration):
17
19
  dependencies = [
18
20
  ("extras", "0106_populate_default_statuses_and_roles_for_contact_associations"),
21
+ ("contenttypes", "0002_remove_content_type_name"),
19
22
  ("tenancy", "0009_update_all_charfields_max_length_to_255"),
20
23
  ("dcim", "0056_update_all_charfields_max_length_to_255"),
21
24
  ]
@@ -36,24 +39,29 @@ class Migration(migrations.Migration):
36
39
  "_custom_field_data",
37
40
  models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder),
38
41
  ),
42
+ (
43
+ "local_config_context_data",
44
+ models.JSONField(blank=True, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
45
+ ),
46
+ ("local_config_context_data_owner_object_id", models.UUIDField(blank=True, default=None, null=True)),
39
47
  ("name", models.CharField(max_length=255, unique=True)),
40
48
  ("description", models.CharField(blank=True, max_length=255)),
41
49
  (
42
- "controller_device",
50
+ "deployed_controller_device",
43
51
  models.ForeignKey(
44
52
  blank=True,
45
53
  null=True,
46
- on_delete=django.db.models.deletion.PROTECT,
54
+ on_delete=django.db.models.deletion.SET_NULL,
47
55
  related_name="controllers",
48
56
  to="dcim.device",
49
57
  ),
50
58
  ),
51
59
  (
52
- "controller_device_redundancy_group",
60
+ "deployed_controller_group",
53
61
  models.ForeignKey(
54
62
  blank=True,
55
63
  null=True,
56
- on_delete=django.db.models.deletion.PROTECT,
64
+ on_delete=django.db.models.deletion.SET_NULL,
57
65
  related_name="controllers",
58
66
  to="dcim.deviceredundancygroup",
59
67
  ),
@@ -63,11 +71,33 @@ class Migration(migrations.Migration):
63
71
  models.ForeignKey(
64
72
  blank=True,
65
73
  null=True,
66
- on_delete=django.db.models.deletion.PROTECT,
74
+ on_delete=django.db.models.deletion.SET_NULL,
67
75
  related_name="controllers",
68
76
  to="extras.externalintegration",
69
77
  ),
70
78
  ),
79
+ (
80
+ "local_config_context_data_owner_content_type",
81
+ nautobot.core.models.fields.ForeignKeyWithAutoRelatedName(
82
+ blank=True,
83
+ default=None,
84
+ limit_choices_to=nautobot.extras.utils.FeatureQuery("config_context_owners"),
85
+ null=True,
86
+ on_delete=django.db.models.deletion.CASCADE,
87
+ related_name="controllers",
88
+ to="contenttypes.contenttype",
89
+ ),
90
+ ),
91
+ (
92
+ "local_config_context_schema",
93
+ nautobot.core.models.fields.ForeignKeyWithAutoRelatedName(
94
+ blank=True,
95
+ null=True,
96
+ on_delete=django.db.models.deletion.SET_NULL,
97
+ related_name="controllers",
98
+ to="extras.configcontextschema",
99
+ ),
100
+ ),
71
101
  (
72
102
  "location",
73
103
  models.ForeignKey(
@@ -119,10 +149,11 @@ class Migration(migrations.Migration):
119
149
  models.Model,
120
150
  nautobot.extras.models.mixins.DynamicGroupMixin,
121
151
  nautobot.extras.models.mixins.NotesMixin,
152
+ nautobot.extras.models.models.ConfigContextSchemaValidationMixin,
122
153
  ),
123
154
  ),
124
155
  migrations.CreateModel(
125
- name="ControllerManagedDeviceGroup",
156
+ name="ControllerDeviceGroup",
126
157
  fields=[
127
158
  (
128
159
  "id",
@@ -136,16 +167,43 @@ class Migration(migrations.Migration):
136
167
  "_custom_field_data",
137
168
  models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder),
138
169
  ),
170
+ (
171
+ "local_config_context_data",
172
+ models.JSONField(blank=True, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
173
+ ),
174
+ ("local_config_context_data_owner_object_id", models.UUIDField(blank=True, default=None, null=True)),
139
175
  ("name", models.CharField(max_length=255, unique=True)),
140
176
  ("weight", models.PositiveIntegerField(default=1000)),
141
177
  (
142
178
  "controller",
143
179
  models.ForeignKey(
144
180
  on_delete=django.db.models.deletion.CASCADE,
145
- related_name="controller_managed_device_groups",
181
+ related_name="controller_device_groups",
146
182
  to="dcim.controller",
147
183
  ),
148
184
  ),
185
+ (
186
+ "local_config_context_data_owner_content_type",
187
+ nautobot.core.models.fields.ForeignKeyWithAutoRelatedName(
188
+ blank=True,
189
+ default=None,
190
+ limit_choices_to=nautobot.extras.utils.FeatureQuery("config_context_owners"),
191
+ null=True,
192
+ on_delete=django.db.models.deletion.CASCADE,
193
+ related_name="controller_device_groups",
194
+ to="contenttypes.contenttype",
195
+ ),
196
+ ),
197
+ (
198
+ "local_config_context_schema",
199
+ nautobot.core.models.fields.ForeignKeyWithAutoRelatedName(
200
+ blank=True,
201
+ null=True,
202
+ on_delete=django.db.models.deletion.SET_NULL,
203
+ related_name="controller_device_groups",
204
+ to="extras.configcontextschema",
205
+ ),
206
+ ),
149
207
  (
150
208
  "parent",
151
209
  models.ForeignKey(
@@ -153,7 +211,7 @@ class Migration(migrations.Migration):
153
211
  null=True,
154
212
  on_delete=django.db.models.deletion.CASCADE,
155
213
  related_name="children",
156
- to="dcim.controllermanageddevicegroup",
214
+ to="dcim.controllerdevicegroup",
157
215
  ),
158
216
  ),
159
217
  ("tags", nautobot.core.models.fields.TagsField(through="extras.TaggedItem", to="extras.Tag")),
@@ -165,6 +223,7 @@ class Migration(migrations.Migration):
165
223
  models.Model,
166
224
  nautobot.extras.models.mixins.DynamicGroupMixin,
167
225
  nautobot.extras.models.mixins.NotesMixin,
226
+ nautobot.extras.models.models.ConfigContextSchemaValidationMixin,
168
227
  ),
169
228
  managers=[
170
229
  ("objects", nautobot.core.models.tree_queries.TreeManager()),
@@ -172,13 +231,13 @@ class Migration(migrations.Migration):
172
231
  ),
173
232
  migrations.AddField(
174
233
  model_name="device",
175
- name="controller_managed_device_group",
234
+ name="controller_device_group",
176
235
  field=models.ForeignKey(
177
236
  blank=True,
178
237
  null=True,
179
238
  on_delete=django.db.models.deletion.SET_NULL,
180
239
  related_name="devices",
181
- to="dcim.controllermanageddevicegroup",
240
+ to="dcim.controllerdevicegroup",
182
241
  ),
183
242
  ),
184
243
  ]
@@ -27,7 +27,7 @@ from .device_components import (
27
27
  )
28
28
  from .devices import (
29
29
  Controller,
30
- ControllerManagedDeviceGroup,
30
+ ControllerDeviceGroup,
31
31
  Device,
32
32
  DeviceFamily,
33
33
  DeviceRedundancyGroup,
@@ -53,7 +53,7 @@ __all__ = (
53
53
  "ConsoleServerPort",
54
54
  "ConsoleServerPortTemplate",
55
55
  "Controller",
56
- "ControllerManagedDeviceGroup",
56
+ "ControllerDeviceGroup",
57
57
  "Device",
58
58
  "DeviceBay",
59
59
  "DeviceBayTemplate",
@@ -43,7 +43,7 @@ from .device_components import (
43
43
 
44
44
  __all__ = (
45
45
  "Controller",
46
- "ControllerManagedDeviceGroup",
46
+ "ControllerDeviceGroup",
47
47
  "Device",
48
48
  "DeviceRedundancyGroup",
49
49
  "DeviceType",
@@ -592,8 +592,8 @@ class Device(PrimaryModel, ConfigContextModel):
592
592
  verbose_name="Software Image Files",
593
593
  help_text="Override the software image files associated with the software version for this device",
594
594
  )
595
- controller_managed_device_group = models.ForeignKey(
596
- to="dcim.ControllerManagedDeviceGroup",
595
+ controller_device_group = models.ForeignKey(
596
+ to="dcim.ControllerDeviceGroup",
597
597
  on_delete=models.SET_NULL,
598
598
  related_name="devices",
599
599
  blank=True,
@@ -1247,7 +1247,7 @@ class SoftwareVersion(PrimaryModel):
1247
1247
  "statuses",
1248
1248
  "webhooks",
1249
1249
  )
1250
- class Controller(PrimaryModel):
1250
+ class Controller(PrimaryModel, ConfigContextModel):
1251
1251
  """Represents an entity that manages or controls one or more devices, acting as a central point of control.
1252
1252
 
1253
1253
  A Controller can be deployed to a single device or a group of devices represented by a DeviceRedundancyGroup.
@@ -1278,21 +1278,21 @@ class Controller(PrimaryModel):
1278
1278
  )
1279
1279
  external_integration = models.ForeignKey(
1280
1280
  to="extras.ExternalIntegration",
1281
- on_delete=models.PROTECT,
1281
+ on_delete=models.SET_NULL,
1282
1282
  related_name="controllers",
1283
1283
  blank=True,
1284
1284
  null=True,
1285
1285
  )
1286
- controller_device = models.ForeignKey(
1286
+ deployed_controller_device = models.ForeignKey(
1287
1287
  to="dcim.Device",
1288
- on_delete=models.PROTECT,
1288
+ on_delete=models.SET_NULL,
1289
1289
  related_name="controllers",
1290
1290
  blank=True,
1291
1291
  null=True,
1292
1292
  )
1293
- controller_device_redundancy_group = models.ForeignKey(
1293
+ deployed_controller_group = models.ForeignKey(
1294
1294
  to="dcim.DeviceRedundancyGroup",
1295
- on_delete=models.PROTECT,
1295
+ on_delete=models.SET_NULL,
1296
1296
  related_name="controllers",
1297
1297
  blank=True,
1298
1298
  null=True,
@@ -1307,10 +1307,12 @@ class Controller(PrimaryModel):
1307
1307
  def clean(self):
1308
1308
  super().clean()
1309
1309
 
1310
- if self.controller_device and self.controller_device_redundancy_group:
1310
+ if self.deployed_controller_device and self.deployed_controller_group:
1311
1311
  raise ValidationError(
1312
1312
  {
1313
- "controller_device": ("Cannot assign both a device and a device redundancy group to a controller."),
1313
+ "deployed_controller_device": (
1314
+ "Cannot assign both a device and a device redundancy group to a controller."
1315
+ ),
1314
1316
  },
1315
1317
  )
1316
1318
 
@@ -1329,7 +1331,7 @@ class Controller(PrimaryModel):
1329
1331
  "graphql",
1330
1332
  "webhooks",
1331
1333
  )
1332
- class ControllerManagedDeviceGroup(TreeModel, PrimaryModel):
1334
+ class ControllerDeviceGroup(TreeModel, PrimaryModel, ConfigContextModel):
1333
1335
  """Represents a mapping of controlled devices to a specific controller.
1334
1336
 
1335
1337
  This model allows for the organization of controlled devices into hierarchical groups for structured representation.
@@ -1347,7 +1349,7 @@ class ControllerManagedDeviceGroup(TreeModel, PrimaryModel):
1347
1349
  controller = models.ForeignKey(
1348
1350
  to="dcim.Controller",
1349
1351
  on_delete=models.CASCADE,
1350
- related_name="controller_managed_device_groups",
1352
+ related_name="controller_device_groups",
1351
1353
  blank=False,
1352
1354
  null=False,
1353
1355
  help_text="Controller that manages the devices in this group",
@@ -1371,7 +1373,7 @@ class ControllerManagedDeviceGroup(TreeModel, PrimaryModel):
1371
1373
  if self.controller == self._original_controller and self.parent == self._original_parent:
1372
1374
  return
1373
1375
 
1374
- if self.parent and self.controller and self.controller != self.parent.controller:
1376
+ if self.parent and self.controller and self.parent.controller and self.controller != self.parent.controller:
1375
1377
  raise ValidationError(
1376
1378
  {"controller": "Controller device group must have the same controller as the parent group."}
1377
1379
  )
@@ -1,3 +1,5 @@
1
+ from collections import OrderedDict
2
+
1
3
  from django.conf import settings
2
4
  from django.contrib.contenttypes.fields import GenericRelation
3
5
  from django.contrib.contenttypes.models import ContentType
@@ -273,7 +275,7 @@ class Rack(PrimaryModel):
273
275
  contains a height attribute for the device
274
276
  """
275
277
 
276
- elevation = {}
278
+ elevation = OrderedDict()
277
279
  for u in self.units:
278
280
  elevation[u] = {
279
281
  "id": u,
@@ -18,33 +18,33 @@ menu_items = (
18
18
  weight=150,
19
19
  items=(
20
20
  NavMenuItem(
21
- link="dcim:location_list",
22
- name="Locations",
21
+ link="dcim:locationtype_list",
22
+ name="Location Types",
23
23
  weight=100,
24
24
  permissions=[
25
- "dcim.view_location",
25
+ "dcim.view_locationtype",
26
26
  ],
27
27
  buttons=(
28
28
  NavMenuAddButton(
29
- link="dcim:location_add",
29
+ link="dcim:locationtype_add",
30
30
  permissions=[
31
- "dcim.add_location",
31
+ "dcim.add_locationtype",
32
32
  ],
33
33
  ),
34
34
  ),
35
35
  ),
36
36
  NavMenuItem(
37
- link="dcim:locationtype_list",
38
- name="Location Types",
37
+ link="dcim:location_list",
38
+ name="Locations",
39
39
  weight=200,
40
40
  permissions=[
41
- "dcim.view_locationtype",
41
+ "dcim.view_location",
42
42
  ],
43
43
  buttons=(
44
44
  NavMenuAddButton(
45
- link="dcim:locationtype_add",
45
+ link="dcim:location_add",
46
46
  permissions=[
47
- "dcim.add_locationtype",
47
+ "dcim.add_location",
48
48
  ],
49
49
  ),
50
50
  ),
@@ -211,33 +211,33 @@ menu_items = (
211
211
  ),
212
212
  ),
213
213
  NavMenuItem(
214
- link="dcim:devicefamily_list",
215
- name="Device Families",
214
+ link="dcim:manufacturer_list",
215
+ name="Manufacturers",
216
216
  weight=200,
217
217
  permissions=[
218
- "dcim.view_devicefamily",
218
+ "dcim.view_manufacturer",
219
219
  ],
220
220
  buttons=(
221
221
  NavMenuAddButton(
222
- link="dcim:devicefamily_add",
222
+ link="dcim:manufacturer_add",
223
223
  permissions=[
224
- "dcim.add_devicefamily",
224
+ "dcim.add_manufacturer",
225
225
  ],
226
226
  ),
227
227
  ),
228
228
  ),
229
229
  NavMenuItem(
230
- link="dcim:manufacturer_list",
231
- name="Manufacturers",
230
+ link="dcim:devicefamily_list",
231
+ name="Device Families",
232
232
  weight=300,
233
233
  permissions=[
234
- "dcim.view_manufacturer",
234
+ "dcim.view_devicefamily",
235
235
  ],
236
236
  buttons=(
237
237
  NavMenuAddButton(
238
- link="dcim:manufacturer_add",
238
+ link="dcim:devicefamily_add",
239
239
  permissions=[
240
- "dcim.add_manufacturer",
240
+ "dcim.add_devicefamily",
241
241
  ],
242
242
  ),
243
243
  ),
@@ -319,12 +319,20 @@ menu_items = (
319
319
  ),
320
320
  ),
321
321
  NavMenuItem(
322
- link="dcim:controllermanageddevicegroup_list",
323
- name="Managed Device Groups",
322
+ link="dcim:controllerdevicegroup_list",
323
+ name="Controller Device Groups",
324
324
  weight=200,
325
325
  permissions=[
326
- "dcim.view_controllermanageddevicegroup",
326
+ "dcim.view_controllerdevicegroup",
327
327
  ],
328
+ buttons=(
329
+ NavMenuAddButton(
330
+ link="dcim:controllerdevicegroup_add",
331
+ permissions=[
332
+ "dcim.add_controllerdevicegroup",
333
+ ],
334
+ ),
335
+ ),
328
336
  ),
329
337
  ),
330
338
  ),
nautobot/dcim/signals.py CHANGED
@@ -11,7 +11,7 @@ from nautobot.core.signals import disable_for_loaddata
11
11
  from .models import (
12
12
  Cable,
13
13
  CablePath,
14
- ControllerManagedDeviceGroup,
14
+ ControllerDeviceGroup,
15
15
  Device,
16
16
  DeviceRedundancyGroup,
17
17
  Interface,
@@ -290,17 +290,17 @@ def prevent_adding_tagged_vlans_with_incorrect_mode_or_site(sender, instance, ac
290
290
 
291
291
 
292
292
  #
293
- # ControllerManagedDeviceGroup
293
+ # ControllerDeviceGroup
294
294
  #
295
295
 
296
296
 
297
- @receiver(post_save, sender=ControllerManagedDeviceGroup)
298
- def handle_controller_managed_device_group_controller_change(instance, raw=False, **_):
299
- """Update descendants when the top level `ControllerManagedDeviceGroup.controller` changes."""
297
+ @receiver(post_save, sender=ControllerDeviceGroup)
298
+ def handle_controller_device_group_controller_change(instance, raw=False, **_):
299
+ """Update descendants when the top level `ControllerDeviceGroup.controller` changes."""
300
300
  if instance.parent or instance._original_controller == instance.controller:
301
301
  return
302
302
 
303
- logger = logging.getLogger(__name__ + ".ControllerManagedDeviceGroup")
303
+ logger = logging.getLogger(__name__ + ".ControllerDeviceGroup")
304
304
 
305
305
  if raw:
306
306
  logger.debug("Skipping controller update for imported controller device group %s", instance)
@@ -8,7 +8,7 @@ from .cables import CableTable
8
8
  from .devices import (
9
9
  ConsolePortTable,
10
10
  ConsoleServerPortTable,
11
- ControllerManagedDeviceGroupTable,
11
+ ControllerDeviceGroupTable,
12
12
  ControllerTable,
13
13
  DeviceBayTable,
14
14
  DeviceConsolePortTable,
@@ -66,7 +66,7 @@ __all__ = (
66
66
  "ConsoleServerPortTable",
67
67
  "ConsoleServerPortTemplateTable",
68
68
  "ControllerTable",
69
- "ControllerManagedDeviceGroupTable",
69
+ "ControllerDeviceGroupTable",
70
70
  "DeviceBayTable",
71
71
  "DeviceBayTemplateTable",
72
72
  "DeviceConsolePortTable",
@@ -14,7 +14,7 @@ from nautobot.dcim.models import (
14
14
  ConsolePort,
15
15
  ConsoleServerPort,
16
16
  Controller,
17
- ControllerManagedDeviceGroup,
17
+ ControllerDeviceGroup,
18
18
  Device,
19
19
  DeviceBay,
20
20
  DeviceRedundancyGroup,
@@ -60,7 +60,7 @@ __all__ = (
60
60
  "ConsolePortTable",
61
61
  "ConsoleServerPortTable",
62
62
  "ControllerTable",
63
- "ControllerManagedDeviceGroupTable",
63
+ "ControllerDeviceGroupTable",
64
64
  "DeviceBayTable",
65
65
  "DeviceConsolePortTable",
66
66
  "DeviceConsoleServerPortTable",
@@ -164,7 +164,7 @@ class DeviceTable(StatusTableMixin, RoleTableMixin, BaseTable):
164
164
  device_redundancy_group_priority = tables.TemplateColumn(
165
165
  template_code="""{% if record.device_redundancy_group %}<span class="badge badge-default">{{ record.device_redundancy_group_priority|default:'None' }}</span>{% else %}—{% endif %}"""
166
166
  )
167
- controller_managed_device_group = tables.Column(linkify=True)
167
+ controller_device_group = tables.Column(linkify=True)
168
168
  secrets_group = tables.Column(linkify=True)
169
169
  tags = TagColumn(url_name="dcim:device_list")
170
170
 
@@ -193,7 +193,7 @@ class DeviceTable(StatusTableMixin, RoleTableMixin, BaseTable):
193
193
  "vc_priority",
194
194
  "device_redundancy_group",
195
195
  "device_redundancy_group_priority",
196
- "controller_managed_device_group",
196
+ "controller_device_group",
197
197
  "secrets_group",
198
198
  "tags",
199
199
  )
@@ -1142,8 +1142,8 @@ class ControllerTable(BaseTable):
1142
1142
  role = tables.Column(linkify=True)
1143
1143
  tenant = TenantColumn()
1144
1144
  external_integration = tables.Column(linkify=True)
1145
- controller_device = tables.Column(linkify=True)
1146
- controller_device_redundancy_group = tables.Column(linkify=True)
1145
+ deployed_controller_device = tables.Column(linkify=True)
1146
+ deployed_controller_group = tables.Column(linkify=True)
1147
1147
  tags = TagColumn(url_name="dcim:controller_list")
1148
1148
  actions = ButtonsColumn(Controller)
1149
1149
 
@@ -1160,8 +1160,8 @@ class ControllerTable(BaseTable):
1160
1160
  "role",
1161
1161
  "tenant",
1162
1162
  "external_integration",
1163
- "controller_device",
1164
- "controller_device_redundancy_group",
1163
+ "deployed_controller_device",
1164
+ "deployed_controller_group",
1165
1165
  "tags",
1166
1166
  "actions",
1167
1167
  )
@@ -1173,25 +1173,28 @@ class ControllerTable(BaseTable):
1173
1173
  "platform",
1174
1174
  "role",
1175
1175
  "tenant",
1176
+ "external_integration",
1177
+ "deployed_controller_device",
1178
+ "deployed_controller_group",
1176
1179
  "actions",
1177
1180
  )
1178
1181
 
1179
1182
 
1180
- class ControllerManagedDeviceGroupTable(BaseTable):
1183
+ class ControllerDeviceGroupTable(BaseTable):
1181
1184
  """Table for list view."""
1182
1185
 
1183
1186
  pk = ToggleColumn()
1184
1187
  name = tables.TemplateColumn(template_code=TREE_LINK, attrs={"td": {"class": "text-nowrap"}})
1185
1188
  weight = tables.Column()
1186
1189
  controller = tables.Column(linkify=True)
1187
- tags = TagColumn(url_name="dcim:controllermanageddevicegroup_list")
1188
- actions = ButtonsColumn(ControllerManagedDeviceGroup)
1190
+ tags = TagColumn(url_name="dcim:controllerdevicegroup_list")
1191
+ actions = ButtonsColumn(ControllerDeviceGroup)
1189
1192
  device_count = tables.TemplateColumn(template_code=LINKED_RECORD_COUNT, verbose_name="Devices")
1190
1193
 
1191
1194
  class Meta(BaseTable.Meta):
1192
1195
  """Meta attributes."""
1193
1196
 
1194
- model = ControllerManagedDeviceGroup
1197
+ model = ControllerDeviceGroup
1195
1198
  fields = (
1196
1199
  "pk",
1197
1200
  "name",
@@ -91,7 +91,7 @@ LINKED_RECORD_COUNT = """
91
91
 
92
92
  TREE_LINK = """
93
93
  {% load helpers %}
94
- {% tree_hierarchy_ui_representation record.tree_depth|as_range table.hide_hierarchy_ui %}
94
+ {% tree_hierarchy_ui_representation record.tree_depth|as_range table.order_by %}
95
95
  <a href="{{ record.get_absolute_url }}">{{ record.name }}</a>
96
96
  """
97
97
 
@@ -22,6 +22,10 @@
22
22
  <td>Role</td>
23
23
  <td>{{ object.role|hyperlinked_object }}</td>
24
24
  </tr>
25
+ <tr>
26
+ <td>Description</td>
27
+ <td>{{ object.description|placeholder }}</td>
28
+ </tr>
25
29
  <tr>
26
30
  <td>Location</td>
27
31
  <td>{{ object.location|hyperlinked_object }}</td>
@@ -31,55 +35,34 @@
31
35
  <td>{{ object.platform|hyperlinked_object }}</td>
32
36
  </tr>
33
37
  <tr>
34
- <td>Tenant</td>
35
- <td>
36
- {% if object.tenant and object.tenant.tenant_group %}
37
- {{ object.tenant.tenant_group|hyperlinked_object }} /
38
- {% endif %}
39
- {{ object.tenant|hyperlinked_object }}
40
- </td>
38
+ <td>Role</td>
39
+ <td>{{ object.role|hyperlinked_object }}</td>
41
40
  </tr>
42
41
  <tr>
43
- <td>Description</td>
44
- <td>{{ object.description|placeholder }}</td>
42
+ <td>Tenant</td>
43
+ <td>{{ object.tenant|hyperlinked_object }}</td>
45
44
  </tr>
46
- </table>
47
- </div>
48
- </div>
49
- {% endblock content_left_page %}
50
-
51
- {% block content_right_page %}
52
- <div class="panel panel-default">
53
- <div class="panel-heading">
54
- <strong>Integration</strong>
55
- </div>
56
- <div class="table-responsive">
57
- <table class="table table-hover panel-body attr-table">
58
45
  <tr>
59
46
  <td>External Integration</td>
60
47
  <td>{{ object.external_integration|hyperlinked_object }}</td>
61
48
  </tr>
62
- {% if object.controller_device %}
63
- <tr>
64
- <td>Controller Device</td>
65
- <td>{{ object.controller_device|hyperlinked_object }}</td>
66
- </tr>
67
- {% endif %}
68
- {% if object.controller_device_redundancy_group %}
69
- <tr>
70
- <td>Controller Device Redundancy Group</td>
71
- <td>{{ object.controller_device_redundancy_group|hyperlinked_object }}</td>
72
- </tr>
73
- {% endif %}
49
+ <tr>
50
+ <td>Deployed Controller Device</td>
51
+ <td>{{ object.deployed_controller_device|hyperlinked_object }}</td>
52
+ </tr>
53
+ <tr>
54
+ <td>Deployed Controller Group</td>
55
+ <td>{{ object.deployed_controller_group|hyperlinked_object }}</td>
56
+ </tr>
74
57
  </table>
75
58
  </div>
76
59
  </div>
77
- {% endblock content_right_page %}
60
+ {% endblock content_left_page %}
78
61
 
79
62
  {% block content_full_width_page %}
80
63
  <div class="panel panel-default">
81
64
  <div class="panel-heading">
82
- <strong>Managed Devices</strong>
65
+ <strong>Devices</strong>
83
66
  </div>
84
67
  {% include 'responsive_table.html' with table=devices_table %}
85
68
  </div>