nautobot 2.4.10__py3-none-any.whl → 2.4.12__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 (439) hide show
  1. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +1 -114
  2. nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +1 -1
  3. nautobot/circuits/views.py +76 -6
  4. nautobot/cloud/navigation.py +1 -1
  5. nautobot/cloud/tests/test_views.py +13 -1
  6. nautobot/cloud/views.py +39 -9
  7. nautobot/core/celery/__init__.py +21 -0
  8. nautobot/core/celery/encoders.py +3 -0
  9. nautobot/core/forms/forms.py +4 -1
  10. nautobot/core/jobs/bulk_actions.py +8 -8
  11. nautobot/core/jobs/cleanup.py +11 -0
  12. nautobot/core/management/commands/generate_test_data.py +2 -1
  13. nautobot/core/templates/components/panel/header_extra_content_table.html +12 -1
  14. nautobot/core/templates/components/panel/panel.html +4 -0
  15. nautobot/core/templates/generic/object_retrieve.html +2 -1
  16. nautobot/core/testing/mixins.py +19 -1
  17. nautobot/core/testing/views.py +104 -8
  18. nautobot/core/tests/test_jobs.py +20 -4
  19. nautobot/core/tests/test_utils.py +17 -0
  20. nautobot/core/tests/test_views.py +2 -2
  21. nautobot/core/tests/test_views_utils.py +53 -2
  22. nautobot/core/ui/object_detail.py +5 -1
  23. nautobot/core/utils/lookup.py +4 -2
  24. nautobot/core/utils/module_loading.py +23 -0
  25. nautobot/core/views/generic.py +2 -12
  26. nautobot/core/views/mixins.py +19 -1
  27. nautobot/core/views/renderers.py +4 -13
  28. nautobot/core/views/utils.py +16 -0
  29. nautobot/dcim/api/serializers.py +13 -0
  30. nautobot/dcim/api/urls.py +1 -0
  31. nautobot/dcim/api/views.py +20 -0
  32. nautobot/dcim/apps.py +1 -0
  33. nautobot/dcim/factory.py +11 -0
  34. nautobot/dcim/filters/__init__.py +116 -0
  35. nautobot/dcim/filters/mixins.py +2 -1
  36. nautobot/dcim/forms.py +205 -19
  37. nautobot/dcim/migrations/0070_modulefamily_models.py +92 -0
  38. nautobot/dcim/models/__init__.py +2 -0
  39. nautobot/dcim/models/device_component_templates.py +14 -0
  40. nautobot/dcim/models/device_components.py +13 -1
  41. nautobot/dcim/models/devices.py +72 -0
  42. nautobot/dcim/navigation.py +16 -0
  43. nautobot/dcim/tables/__init__.py +2 -0
  44. nautobot/dcim/tables/devices.py +50 -0
  45. nautobot/dcim/tables/devicetypes.py +35 -1
  46. nautobot/dcim/tables/template_code.py +2 -0
  47. nautobot/dcim/templates/dcim/controller/base.html +1 -9
  48. nautobot/dcim/templates/dcim/controller_retrieve.html +2 -83
  49. nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +2 -25
  50. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +1 -90
  51. nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +1 -1
  52. nautobot/dcim/templates/dcim/interfaceredundancygroup_retrieve.html +1 -63
  53. nautobot/dcim/templates/dcim/location.html +2 -249
  54. nautobot/dcim/templates/dcim/location_edit.html +2 -38
  55. nautobot/dcim/templates/dcim/location_retrieve.html +249 -0
  56. nautobot/dcim/templates/dcim/location_update.html +38 -0
  57. nautobot/dcim/templates/dcim/module_update.html +1 -0
  58. nautobot/dcim/templates/dcim/modulebay_retrieve.html +93 -1
  59. nautobot/dcim/templates/dcim/modulefamily_retrieve.html +31 -0
  60. nautobot/dcim/templates/dcim/moduletype_retrieve.html +6 -0
  61. nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -160
  62. nautobot/dcim/templates/dcim/virtualchassis.html +2 -51
  63. nautobot/dcim/templates/dcim/virtualchassis_add.html +2 -22
  64. nautobot/dcim/templates/dcim/virtualchassis_create.html +22 -0
  65. nautobot/dcim/templates/dcim/virtualchassis_edit.html +2 -93
  66. nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +51 -0
  67. nautobot/dcim/templates/dcim/virtualchassis_update.html +93 -0
  68. nautobot/dcim/tests/test_api.py +35 -0
  69. nautobot/dcim/tests/test_filters.py +102 -3
  70. nautobot/dcim/tests/test_models.py +146 -0
  71. nautobot/dcim/tests/test_views.py +70 -97
  72. nautobot/dcim/urls.py +5 -80
  73. nautobot/dcim/views.py +584 -342
  74. nautobot/extras/api/views.py +9 -2
  75. nautobot/extras/datasources/git.py +9 -1
  76. nautobot/extras/forms/forms.py +9 -5
  77. nautobot/extras/jobs.py +4 -2
  78. nautobot/extras/jobs_ui.py +208 -0
  79. nautobot/extras/models/datasources.py +5 -8
  80. nautobot/extras/models/jobs.py +5 -0
  81. nautobot/extras/models/tags.py +4 -0
  82. nautobot/extras/plugins/__init__.py +3 -0
  83. nautobot/extras/tables.py +40 -3
  84. nautobot/extras/templates/extras/configcontext.html +2 -220
  85. nautobot/extras/templates/extras/configcontext_edit.html +2 -50
  86. nautobot/extras/templates/extras/configcontext_retrieve.html +2 -0
  87. nautobot/extras/templates/extras/configcontext_update.html +50 -0
  88. nautobot/extras/templates/extras/configcontextschema.html +2 -48
  89. nautobot/extras/templates/extras/configcontextschema_edit.html +2 -19
  90. nautobot/extras/templates/extras/configcontextschema_retrieve.html +48 -0
  91. nautobot/extras/templates/extras/configcontextschema_update.html +19 -0
  92. nautobot/extras/templates/extras/inc/configcontext_data.html +1 -0
  93. nautobot/extras/templates/extras/inc/configcontext_format.html +6 -0
  94. nautobot/extras/templates/extras/job_detail.html +1 -326
  95. nautobot/extras/templates/extras/job_edit.html +12 -6
  96. nautobot/extras/templates/extras/tag.html +2 -52
  97. nautobot/extras/templates/extras/tag_edit.html +2 -15
  98. nautobot/extras/templates/extras/tag_retrieve.html +2 -0
  99. nautobot/extras/templates/extras/tag_update.html +15 -0
  100. nautobot/extras/templates/extras/team_retrieve.html +2 -2
  101. nautobot/extras/tests/test_api.py +15 -15
  102. nautobot/extras/tests/test_filters.py +4 -4
  103. nautobot/extras/tests/test_jobs.py +23 -10
  104. nautobot/extras/tests/test_models.py +19 -8
  105. nautobot/extras/tests/test_plugins.py +6 -3
  106. nautobot/extras/tests/test_views.py +66 -11
  107. nautobot/extras/urls.py +4 -134
  108. nautobot/extras/views.py +186 -178
  109. nautobot/ipam/models.py +19 -4
  110. nautobot/ipam/tables.py +19 -0
  111. nautobot/ipam/templates/ipam/vlan.html +2 -84
  112. nautobot/ipam/templates/ipam/vlan_edit.html +2 -24
  113. nautobot/ipam/templates/ipam/vlan_retrieve.html +84 -0
  114. nautobot/ipam/templates/ipam/vlan_update.html +24 -0
  115. nautobot/ipam/tests/test_views.py +5 -0
  116. nautobot/ipam/urls.py +1 -21
  117. nautobot/ipam/views.py +45 -70
  118. nautobot/project-static/docs/404.html +33 -10
  119. nautobot/project-static/docs/apps/index.html +33 -10
  120. nautobot/project-static/docs/apps/nautobot-apps.html +33 -10
  121. nautobot/project-static/docs/assets/javascripts/{bundle.13a4f30d.min.js → bundle.56ea9cef.min.js} +2 -2
  122. nautobot/project-static/docs/assets/javascripts/{bundle.13a4f30d.min.js.map → bundle.56ea9cef.min.js.map} +2 -2
  123. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +33 -10
  124. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +33 -10
  125. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +33 -10
  126. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +33 -10
  127. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +33 -10
  128. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +33 -10
  129. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +33 -10
  130. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +33 -10
  131. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +33 -10
  132. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +33 -10
  133. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +33 -10
  134. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +33 -10
  135. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +33 -10
  136. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +33 -10
  137. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +33 -10
  138. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +33 -10
  139. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +33 -10
  140. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +33 -10
  141. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +33 -10
  142. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +122 -10
  143. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +33 -10
  144. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +33 -10
  145. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +33 -10
  146. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +33 -10
  147. nautobot/project-static/docs/development/apps/api/configuration-view.html +33 -10
  148. nautobot/project-static/docs/development/apps/api/database-backend-config.html +33 -10
  149. nautobot/project-static/docs/development/apps/api/models/django-admin.html +33 -10
  150. nautobot/project-static/docs/development/apps/api/models/global-search.html +33 -10
  151. nautobot/project-static/docs/development/apps/api/models/graphql.html +33 -10
  152. nautobot/project-static/docs/development/apps/api/models/index.html +33 -10
  153. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +42 -10
  154. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +33 -10
  155. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +33 -10
  156. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +33 -10
  157. nautobot/project-static/docs/development/apps/api/platform-features/index.html +33 -10
  158. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +33 -10
  159. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +33 -10
  160. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +33 -10
  161. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +34 -11
  162. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +33 -10
  163. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +33 -10
  164. nautobot/project-static/docs/development/apps/api/prometheus.html +33 -10
  165. nautobot/project-static/docs/development/apps/api/setup.html +33 -10
  166. nautobot/project-static/docs/development/apps/api/testing.html +33 -10
  167. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +33 -10
  168. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +33 -10
  169. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +33 -10
  170. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +33 -10
  171. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +33 -10
  172. nautobot/project-static/docs/development/apps/api/views/base-template.html +33 -10
  173. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +33 -10
  174. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +33 -10
  175. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +33 -10
  176. nautobot/project-static/docs/development/apps/api/views/index.html +33 -10
  177. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +33 -10
  178. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +33 -10
  179. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +33 -10
  180. nautobot/project-static/docs/development/apps/api/views/notes.html +33 -10
  181. nautobot/project-static/docs/development/apps/api/views/rest-api.html +33 -10
  182. nautobot/project-static/docs/development/apps/api/views/urls.html +33 -10
  183. nautobot/project-static/docs/development/apps/index.html +33 -10
  184. nautobot/project-static/docs/development/apps/migration/code-updates.html +33 -10
  185. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +33 -10
  186. nautobot/project-static/docs/development/apps/migration/from-v1.html +33 -10
  187. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +33 -10
  188. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +33 -10
  189. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +33 -10
  190. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +33 -10
  191. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +33 -10
  192. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +33 -10
  193. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +33 -10
  194. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +33 -10
  195. nautobot/project-static/docs/development/apps/porting-from-netbox.html +33 -10
  196. nautobot/project-static/docs/development/core/application-registry.html +33 -10
  197. nautobot/project-static/docs/development/core/best-practices.html +33 -10
  198. nautobot/project-static/docs/development/core/bootstrap-ui.html +33 -10
  199. nautobot/project-static/docs/development/core/caching.html +33 -10
  200. nautobot/project-static/docs/development/core/controllers.html +33 -10
  201. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +33 -10
  202. nautobot/project-static/docs/development/core/generic-views.html +33 -10
  203. nautobot/project-static/docs/development/core/getting-started.html +33 -10
  204. nautobot/project-static/docs/development/core/homepage.html +33 -10
  205. nautobot/project-static/docs/development/core/index.html +33 -10
  206. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +33 -10
  207. nautobot/project-static/docs/development/core/model-checklist.html +33 -10
  208. nautobot/project-static/docs/development/core/model-features.html +33 -10
  209. nautobot/project-static/docs/development/core/natural-keys.html +33 -10
  210. nautobot/project-static/docs/development/core/navigation-menu.html +33 -10
  211. nautobot/project-static/docs/development/core/release-checklist.html +33 -10
  212. nautobot/project-static/docs/development/core/role-internals.html +33 -10
  213. nautobot/project-static/docs/development/core/settings.html +33 -10
  214. nautobot/project-static/docs/development/core/style-guide.html +33 -10
  215. nautobot/project-static/docs/development/core/templates.html +33 -10
  216. nautobot/project-static/docs/development/core/testing.html +33 -10
  217. nautobot/project-static/docs/development/core/ui-component-framework.html +33 -10
  218. nautobot/project-static/docs/development/core/user-preferences.html +33 -10
  219. nautobot/project-static/docs/development/index.html +33 -10
  220. nautobot/project-static/docs/development/jobs/getting-started.html +33 -10
  221. nautobot/project-static/docs/development/jobs/index.html +33 -10
  222. nautobot/project-static/docs/development/jobs/installation.html +33 -10
  223. nautobot/project-static/docs/development/jobs/job-extensions.html +33 -10
  224. nautobot/project-static/docs/development/jobs/job-logging.html +33 -10
  225. nautobot/project-static/docs/development/jobs/job-patterns.html +33 -10
  226. nautobot/project-static/docs/development/jobs/job-structure.html +33 -10
  227. nautobot/project-static/docs/development/jobs/migration/from-v1.html +33 -10
  228. nautobot/project-static/docs/development/jobs/testing.html +33 -10
  229. nautobot/project-static/docs/index.html +33 -10
  230. nautobot/project-static/docs/insert-analytics.sh +36 -0
  231. nautobot/project-static/docs/objects.inv +0 -0
  232. nautobot/project-static/docs/overview/application_stack.html +33 -10
  233. nautobot/project-static/docs/overview/design_philosophy.html +33 -10
  234. nautobot/project-static/docs/release-notes/index.html +33 -10
  235. nautobot/project-static/docs/release-notes/version-1.0.html +33 -10
  236. nautobot/project-static/docs/release-notes/version-1.1.html +33 -10
  237. nautobot/project-static/docs/release-notes/version-1.2.html +33 -10
  238. nautobot/project-static/docs/release-notes/version-1.3.html +33 -10
  239. nautobot/project-static/docs/release-notes/version-1.4.html +33 -10
  240. nautobot/project-static/docs/release-notes/version-1.5.html +33 -10
  241. nautobot/project-static/docs/release-notes/version-1.6.html +33 -10
  242. nautobot/project-static/docs/release-notes/version-2.0.html +33 -10
  243. nautobot/project-static/docs/release-notes/version-2.1.html +33 -10
  244. nautobot/project-static/docs/release-notes/version-2.2.html +33 -10
  245. nautobot/project-static/docs/release-notes/version-2.3.html +33 -10
  246. nautobot/project-static/docs/release-notes/version-2.4.html +363 -10
  247. nautobot/project-static/docs/requirements.txt +1 -1
  248. nautobot/project-static/docs/search/search_index.json +1 -1
  249. nautobot/project-static/docs/sitemap.xml +302 -298
  250. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  251. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +33 -10
  252. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +33 -10
  253. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +33 -10
  254. nautobot/project-static/docs/user-guide/administration/configuration/index.html +33 -10
  255. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +33 -10
  256. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +33 -10
  257. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +33 -10
  258. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +33 -10
  259. nautobot/project-static/docs/user-guide/administration/guides/docker.html +33 -10
  260. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +33 -10
  261. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +33 -10
  262. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +33 -10
  263. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +33 -10
  264. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +33 -10
  265. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +33 -10
  266. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +33 -10
  267. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +33 -10
  268. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +33 -10
  269. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +33 -10
  270. nautobot/project-static/docs/user-guide/administration/installation/index.html +33 -10
  271. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +33 -10
  272. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +33 -10
  273. nautobot/project-static/docs/user-guide/administration/installation/services.html +33 -10
  274. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +33 -10
  275. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +33 -10
  276. nautobot/project-static/docs/user-guide/administration/security/index.html +33 -10
  277. nautobot/project-static/docs/user-guide/administration/security/notices.html +33 -10
  278. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +33 -10
  279. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +33 -10
  280. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +33 -10
  281. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +33 -10
  282. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +33 -10
  283. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +33 -10
  284. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +33 -10
  285. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +33 -10
  286. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +33 -10
  287. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +33 -10
  288. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +33 -10
  289. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +33 -10
  290. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +33 -10
  291. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +33 -10
  292. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +33 -10
  293. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +33 -10
  294. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +33 -10
  295. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +33 -10
  296. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +33 -10
  297. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +33 -10
  298. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +33 -10
  299. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +33 -10
  300. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +33 -10
  301. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +33 -10
  302. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +33 -10
  303. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +33 -10
  304. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +33 -10
  305. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +33 -10
  306. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +33 -10
  307. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +33 -10
  308. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +33 -10
  309. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +33 -10
  310. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +33 -10
  311. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +33 -10
  312. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +45 -22
  313. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +33 -10
  314. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +33 -10
  315. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +33 -10
  316. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +33 -10
  317. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +33 -10
  318. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +33 -10
  319. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +33 -10
  320. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +33 -10
  321. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +33 -10
  322. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +33 -10
  323. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +37 -10
  324. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +37 -10
  325. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +37 -10
  326. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +10261 -0
  327. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +36 -13
  328. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +33 -10
  329. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +33 -10
  330. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +33 -10
  331. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +33 -10
  332. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +33 -10
  333. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +33 -10
  334. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +33 -10
  335. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +33 -10
  336. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +33 -10
  337. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +33 -10
  338. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +33 -10
  339. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +33 -10
  340. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +33 -10
  341. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +33 -10
  342. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +33 -10
  343. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +33 -10
  344. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +33 -10
  345. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +33 -10
  346. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +33 -10
  347. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +33 -10
  348. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +33 -10
  349. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +33 -10
  350. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +33 -10
  351. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +33 -10
  352. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +33 -10
  353. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +33 -10
  354. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +33 -10
  355. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +33 -10
  356. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +33 -10
  357. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +33 -10
  358. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +33 -10
  359. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +33 -10
  360. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +33 -10
  361. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +33 -10
  362. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +33 -10
  363. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +33 -10
  364. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +33 -10
  365. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +33 -10
  366. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +33 -10
  367. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +33 -10
  368. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +33 -10
  369. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +33 -10
  370. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +33 -10
  371. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +33 -10
  372. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +33 -10
  373. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +33 -10
  374. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +33 -10
  375. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +33 -10
  376. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +33 -10
  377. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +33 -10
  378. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +33 -10
  379. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +33 -10
  380. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +44 -18
  381. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +33 -10
  382. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +33 -10
  383. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +33 -10
  384. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +33 -10
  385. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +33 -10
  386. nautobot/project-static/docs/user-guide/index.html +33 -10
  387. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +33 -10
  388. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +33 -10
  389. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +33 -10
  390. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +33 -10
  391. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +33 -10
  392. nautobot/project-static/docs/user-guide/platform-functionality/events.html +33 -10
  393. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +33 -10
  394. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +33 -10
  395. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +39 -11
  396. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +33 -10
  397. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +33 -10
  398. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +33 -10
  399. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +33 -10
  400. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +33 -10
  401. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +33 -10
  402. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +33 -10
  403. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +33 -10
  404. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +33 -10
  405. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +33 -10
  406. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +33 -10
  407. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +33 -10
  408. nautobot/project-static/docs/user-guide/platform-functionality/note.html +33 -10
  409. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +33 -10
  410. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +33 -10
  411. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +33 -10
  412. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +33 -10
  413. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +33 -10
  414. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +33 -10
  415. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +33 -10
  416. nautobot/project-static/docs/user-guide/platform-functionality/role.html +33 -10
  417. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +33 -10
  418. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +33 -10
  419. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +33 -10
  420. nautobot/project-static/docs/user-guide/platform-functionality/status.html +33 -10
  421. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +33 -10
  422. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +33 -10
  423. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +33 -10
  424. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +33 -10
  425. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +33 -10
  426. nautobot/tenancy/tables.py +2 -0
  427. nautobot/virtualization/tests/test_views.py +1 -1
  428. nautobot/wireless/forms.py +0 -1
  429. nautobot/wireless/models.py +1 -1
  430. nautobot/wireless/navigation.py +1 -1
  431. nautobot/wireless/tables.py +18 -3
  432. {nautobot-2.4.10.dist-info → nautobot-2.4.12.dist-info}/METADATA +4 -4
  433. {nautobot-2.4.10.dist-info → nautobot-2.4.12.dist-info}/RECORD +439 -419
  434. /nautobot/dcim/templates/dcim/{platform_edit.html → platform_create.html} +0 -0
  435. /nautobot/extras/test_jobs/{pass.py → pass_job.py} +0 -0
  436. {nautobot-2.4.10.dist-info → nautobot-2.4.12.dist-info}/LICENSE.txt +0 -0
  437. {nautobot-2.4.10.dist-info → nautobot-2.4.12.dist-info}/NOTICE +0 -0
  438. {nautobot-2.4.10.dist-info → nautobot-2.4.12.dist-info}/WHEEL +0 -0
  439. {nautobot-2.4.10.dist-info → nautobot-2.4.12.dist-info}/entry_points.txt +0 -0
@@ -1,22 +1,2 @@
1
- {% extends 'generic/object_create.html' %}
2
- {% load form_helpers %}
3
-
4
- {% block form %}
5
- <div class="panel panel-default">
6
- <div class="panel-heading"><strong>Virtual Chassis</strong></div>
7
- <div class="panel-body">
8
- {% render_field form.name %}
9
- {% render_field form.domain %}
10
- </div>
11
- </div>
12
- <div class="panel panel-default">
13
- <div class="panel-heading"><strong>Member Devices</strong></div>
14
- <div class="panel-body">
15
- {% render_field form.location %}
16
- {% render_field form.rack %}
17
- {% render_field form.members %}
18
- {% render_field form.initial_position %}
19
- </div>
20
- </div>
21
- {% include 'inc/extras_features_edit_form_fields.html' %}
22
- {% endblock %}
1
+ {% extends 'dcim/virtualchassis_create.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -0,0 +1,22 @@
1
+ {% extends 'generic/object_create.html' %}
2
+ {% load form_helpers %}
3
+
4
+ {% block form %}
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading"><strong>Virtual Chassis</strong></div>
7
+ <div class="panel-body">
8
+ {% render_field form.name %}
9
+ {% render_field form.domain %}
10
+ </div>
11
+ </div>
12
+ <div class="panel panel-default">
13
+ <div class="panel-heading"><strong>Member Devices</strong></div>
14
+ <div class="panel-body">
15
+ {% render_field form.location %}
16
+ {% render_field form.rack %}
17
+ {% render_field form.members %}
18
+ {% render_field form.initial_position %}
19
+ </div>
20
+ </div>
21
+ {% include 'inc/extras_features_edit_form_fields.html' %}
22
+ {% endblock %}
@@ -1,93 +1,2 @@
1
- {% extends 'base.html' %}
2
- {% load helpers %}
3
- {% load form_helpers %}
4
-
5
- {% block content %}
6
- <form action="" method="post" enctype="multipart/form-data" class="form form-horizontal">
7
- {% csrf_token %}
8
- {{ pk_form.pk }}
9
- {{ formset.management_form }}
10
- <div class="row">
11
- <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
12
- <h3>{% block title %}{% if vc_form.instance %}Editing {{ vc_form.instance }}{% else %}New Virtual Chassis{% endif %}{% endblock %}</h3>
13
- {% if vc_form.non_field_errors %}
14
- <div class="panel panel-danger">
15
- <div class="panel-heading"><strong>Errors</strong></div>
16
- <div class="panel-body">
17
- {{ vc_form.non_field_errors }}
18
- </div>
19
- </div>
20
- {% endif %}
21
- <div class="panel panel-default">
22
- <div class="panel-heading"><strong>Virtual Chassis</strong></div>
23
- <div class="table panel-body">
24
- {% render_field vc_form.name %}
25
- {% render_field vc_form.domain %}
26
- {% render_field vc_form.master %}
27
- </div>
28
- </div>
29
- {% include 'inc/extras_features_edit_form_fields.html' with form=vc_form %}
30
- <div class="panel panel-default">
31
- <div class="panel-heading"><strong>Members</strong></div>
32
- <table class="table panel-body">
33
- <thead>
34
- <tr>
35
- <th>Device</th>
36
- <th>Rack/Unit</th>
37
- <th>Serial</th>
38
- <th>Position</th>
39
- <th>Priority</th>
40
- <th></th>
41
- </tr>
42
- </thead>
43
- <tbody>
44
- {% for form in formset %}
45
- {% for field in form.hidden_fields %}
46
- {{ field }}
47
- {% endfor %}
48
- {% with device=form.instance virtual_chassis=vc_form.instance %}
49
- <tr>
50
- <td>{{ device|hyperlinked_object }}</td>
51
- <td>
52
- {% if device.rack %}
53
- {{ device.rack }} / {{ device.position }}
54
- {% else %}
55
- <span class="text-muted">&mdash;</span>
56
- {% endif %}
57
- </td>
58
- <td>{{ device.serial|placeholder }}</td>
59
- <td>
60
- {{ form.vc_position }}
61
- {% if form.vc_position.errors %}
62
- <br /><small class="text-danger">{{ form.vc_position.errors.0 }}</small>
63
- {% endif %}
64
- </td>
65
- <td>
66
- {{ form.vc_priority }}
67
- {% if form.vc_priority.errors %}
68
- <br /><small class="text-danger">{{ form.vc_priority.errors.0 }}</small>
69
- {% endif %}
70
- </td>
71
- <td>
72
- {% if virtual_chassis.present_in_database %}
73
- <a href="{% url 'dcim:virtualchassis_remove_member' pk=device.pk %}?return_url={% url 'dcim:virtualchassis_edit' pk=virtual_chassis.pk %}" class="btn btn-danger btn-xs{% if virtual_chassis.master == device %} disabled{% endif %}">
74
- <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span>
75
- </a>
76
- {% endif %}
77
- </td>
78
- </tr>
79
- {% endwith %}
80
- {% endfor %}
81
- </tbody>
82
- </table>
83
- </div>
84
- </div>
85
- </div>
86
- <div class="row">
87
- <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1 text-right">
88
- <button type="submit" name="_update" class="btn btn-primary">Update</button>
89
- <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
90
- </div>
91
- </div>
92
- </form>
93
- {% endblock %}
1
+ {% extends "virtualchassis_update.html" %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -0,0 +1,51 @@
1
+ {% extends 'generic/object_retrieve.html' %}
2
+ {% load helpers %}
3
+
4
+ {% block content_left_page %}
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading">
7
+ <strong>Virtual Chassis</strong>
8
+ </div>
9
+ <table class="table table-hover panel-body attr-table">
10
+ <tr>
11
+ <td>Domain</td>
12
+ <td>{{ object.domain|placeholder }}</td>
13
+ </tr>
14
+ <tr>
15
+ <td>Master</td>
16
+ <td>{{ object.master|hyperlinked_object }}</td>
17
+ </tr>
18
+ </table>
19
+ </div>
20
+ {% endblock content_left_page %}
21
+
22
+ {% block content_right_page %}
23
+ <div class="panel panel-default">
24
+ <div class="panel-heading">
25
+ <strong>Members</strong>
26
+ </div>
27
+ <table class="table table-hover panel-body attr-table">
28
+ <tr>
29
+ <th>Device</th>
30
+ <th>Position</th>
31
+ <th>Master</th>
32
+ <th>Priority</th>
33
+ </tr>
34
+ {% for vc_member in members %}
35
+ <tr{% if vc_member == device %} class="info"{% endif %}>
36
+ <td>{{ vc_member|hyperlinked_object }}</td>
37
+ <td><span class="badge badge-default">{{ vc_member.vc_position }}</span></td>
38
+ <td>{% if object.master == vc_member %}{{ True | render_boolean }}{% endif %}</td>
39
+ <td>{{ vc_member.vc_priority|placeholder }}</td>
40
+ </tr>
41
+ {% endfor %}
42
+ </table>
43
+ {% if perms.dcim.change_virtualchassis %}
44
+ <div class="panel-footer text-right noprint">
45
+ <a href="{% url 'dcim:virtualchassis_add_member' pk=object.pk %}?location={{ object.master.location.pk }}&rack={{ object.master.rack.pk }}" class="btn btn-primary btn-xs">
46
+ <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add Member
47
+ </a>
48
+ </div>
49
+ {% endif %}
50
+ </div>
51
+ {% endblock content_right_page %}
@@ -0,0 +1,93 @@
1
+ {% extends 'base.html' %}
2
+ {% load helpers %}
3
+ {% load form_helpers %}
4
+
5
+ {% block content %}
6
+ <form action="" method="post" enctype="multipart/form-data" class="form form-horizontal">
7
+ {% csrf_token %}
8
+ {{ pk_form.pk }}
9
+ {{ formset.management_form }}
10
+ <div class="row">
11
+ <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
12
+ <h3>{% block title %}{% if vc_form.instance %}Editing {{ vc_form.instance }}{% else %}New Virtual Chassis{% endif %}{% endblock %}</h3>
13
+ {% if vc_form.non_field_errors %}
14
+ <div class="panel panel-danger">
15
+ <div class="panel-heading"><strong>Errors</strong></div>
16
+ <div class="panel-body">
17
+ {{ vc_form.non_field_errors }}
18
+ </div>
19
+ </div>
20
+ {% endif %}
21
+ <div class="panel panel-default">
22
+ <div class="panel-heading"><strong>Virtual Chassis</strong></div>
23
+ <div class="table panel-body">
24
+ {% render_field vc_form.name %}
25
+ {% render_field vc_form.domain %}
26
+ {% render_field vc_form.master %}
27
+ </div>
28
+ </div>
29
+ {% include 'inc/extras_features_edit_form_fields.html' with form=vc_form %}
30
+ <div class="panel panel-default">
31
+ <div class="panel-heading"><strong>Members</strong></div>
32
+ <table class="table panel-body">
33
+ <thead>
34
+ <tr>
35
+ <th>Device</th>
36
+ <th>Rack/Unit</th>
37
+ <th>Serial</th>
38
+ <th>Position</th>
39
+ <th>Priority</th>
40
+ <th></th>
41
+ </tr>
42
+ </thead>
43
+ <tbody>
44
+ {% for form in formset %}
45
+ {% for field in form.hidden_fields %}
46
+ {{ field }}
47
+ {% endfor %}
48
+ {% with device=form.instance virtual_chassis=vc_form.instance %}
49
+ <tr>
50
+ <td>{{ device|hyperlinked_object }}</td>
51
+ <td>
52
+ {% if device.rack %}
53
+ {{ device.rack }} / {{ device.position }}
54
+ {% else %}
55
+ <span class="text-muted">&mdash;</span>
56
+ {% endif %}
57
+ </td>
58
+ <td>{{ device.serial|placeholder }}</td>
59
+ <td>
60
+ {{ form.vc_position }}
61
+ {% if form.vc_position.errors %}
62
+ <br /><small class="text-danger">{{ form.vc_position.errors.0 }}</small>
63
+ {% endif %}
64
+ </td>
65
+ <td>
66
+ {{ form.vc_priority }}
67
+ {% if form.vc_priority.errors %}
68
+ <br /><small class="text-danger">{{ form.vc_priority.errors.0 }}</small>
69
+ {% endif %}
70
+ </td>
71
+ <td>
72
+ {% if virtual_chassis.present_in_database %}
73
+ <a href="{% url 'dcim:virtualchassis_remove_member' pk=device.pk %}?return_url={% url 'dcim:virtualchassis_edit' pk=virtual_chassis.pk %}" class="btn btn-danger btn-xs{% if virtual_chassis.master == device %} disabled{% endif %}">
74
+ <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span>
75
+ </a>
76
+ {% endif %}
77
+ </td>
78
+ </tr>
79
+ {% endwith %}
80
+ {% endfor %}
81
+ </tbody>
82
+ </table>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ <div class="row">
87
+ <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1 text-right">
88
+ <button type="submit" name="_update" class="btn btn-primary">Update</button>
89
+ <a href="{{ return_url }}" class="btn btn-default">Cancel</a>
90
+ </div>
91
+ </div>
92
+ </form>
93
+ {% endblock %}
@@ -50,6 +50,7 @@ from nautobot.dcim.models import (
50
50
  Module,
51
51
  ModuleBay,
52
52
  ModuleBayTemplate,
53
+ ModuleFamily,
53
54
  ModuleType,
54
55
  Platform,
55
56
  PowerFeed,
@@ -1388,15 +1389,18 @@ class ModuleBayTemplateTest(Mixins.ModularDeviceComponentTemplateMixin, Mixins.B
1388
1389
  @classmethod
1389
1390
  def setUpTestData(cls):
1390
1391
  super().setUpTestData()
1392
+ cls.module_family = ModuleFamily.objects.create(name="Test Module Family")
1391
1393
 
1392
1394
  cls.create_data = [
1393
1395
  {
1394
1396
  "device_type": cls.device_type.pk,
1395
1397
  "name": "Test1",
1398
+ "module_family": cls.module_family.pk,
1396
1399
  },
1397
1400
  {
1398
1401
  "module_type": cls.module_type.pk,
1399
1402
  "name": "Test2",
1403
+ "module_family": cls.module_family.pk,
1400
1404
  },
1401
1405
  {
1402
1406
  "device_type": cls.device_type.pk,
@@ -3792,3 +3796,34 @@ class InterfaceVDCAssignmentTestCase(APIViewTestCases.APIViewTestCase):
3792
3796
  def test_docs(self):
3793
3797
  """Skip: InterfaceVDCAssignment has no docs yet"""
3794
3798
  # TODO(timizuo): Add docs for Interface VDC Assignment
3799
+
3800
+
3801
+ class ModuleFamilyTest(APIViewTestCases.APIViewTestCase):
3802
+ """Test the ModuleFamily API."""
3803
+
3804
+ model = ModuleFamily
3805
+ brief_fields = ["display", "id", "name", "url"]
3806
+ create_data = [
3807
+ {
3808
+ "name": "Module Family 4",
3809
+ "description": "Fourth family",
3810
+ },
3811
+ {
3812
+ "name": "Module Family 5",
3813
+ "description": "Fifth family",
3814
+ },
3815
+ {
3816
+ "name": "Module Family 6",
3817
+ "description": "Sixth family",
3818
+ },
3819
+ ]
3820
+ bulk_update_data = {
3821
+ "description": "New description",
3822
+ }
3823
+
3824
+ @classmethod
3825
+ def setUpTestData(cls):
3826
+ """Create test data for API tests."""
3827
+ ModuleFamily.objects.create(name="Module Family 1", description="First family")
3828
+ ModuleFamily.objects.create(name="Module Family 2", description="Second family")
3829
+ ModuleFamily.objects.create(name="Module Family 3", description="Third family")
@@ -52,6 +52,7 @@ from nautobot.dcim.filters import (
52
52
  ManufacturerFilterSet,
53
53
  ModuleBayFilterSet,
54
54
  ModuleBayTemplateFilterSet,
55
+ ModuleFamilyFilterSet,
55
56
  ModuleFilterSet,
56
57
  ModuleTypeFilterSet,
57
58
  PlatformFilterSet,
@@ -100,6 +101,7 @@ from nautobot.dcim.models import (
100
101
  Module,
101
102
  ModuleBay,
102
103
  ModuleBayTemplate,
104
+ ModuleFamily,
103
105
  ModuleType,
104
106
  Platform,
105
107
  PowerFeed,
@@ -573,12 +575,20 @@ def common_test_data(cls):
573
575
  label="devicebay3",
574
576
  description="Device Bay Description 3",
575
577
  )
578
+
579
+ cls.module_families = (
580
+ ModuleFamily.objects.create(name="Module Family 1"),
581
+ ModuleFamily.objects.create(name="Module Family 2"),
582
+ ModuleFamily.objects.create(name="Module Family 3"),
583
+ )
576
584
  ModuleBayTemplate.objects.create(
577
585
  device_type=device_types[0],
578
586
  name="device test module bay 1",
579
587
  position=1,
580
588
  label="devicemodulebay1",
581
589
  description="device test module bay 1 description",
590
+ module_family=cls.module_families[0],
591
+ requires_first_party_modules=True,
582
592
  )
583
593
  ModuleBayTemplate.objects.create(
584
594
  device_type=device_types[1],
@@ -586,13 +596,16 @@ def common_test_data(cls):
586
596
  position=2,
587
597
  label="devicemodulebay2",
588
598
  description="device test module bay 2 description",
599
+ module_family=cls.module_families[1],
600
+ requires_first_party_modules=False,
589
601
  )
590
602
  ModuleBayTemplate.objects.create(
591
603
  device_type=device_types[2],
592
604
  name="device test module bay 3",
593
605
  position=3,
594
606
  label="devicemodulebay3",
595
- description="device test module bay 3 description",
607
+ description="device test module bay 3 without a module family",
608
+ requires_first_party_modules=True,
596
609
  )
597
610
  secrets_groups = (
598
611
  SecretsGroup.objects.create(name="Secrets group 1"),
@@ -667,10 +680,16 @@ def common_test_data(cls):
667
680
  manufacturer=cls.manufacturers[0], model="Filter Test Module Type 1", comments="Module Type 1"
668
681
  ),
669
682
  ModuleType.objects.create(
670
- manufacturer=cls.manufacturers[1], model="Filter Test Module Type 2", comments="Module Type 2"
683
+ manufacturer=cls.manufacturers[1],
684
+ model="Filter Test Module Type 2",
685
+ comments="Module Type 2",
686
+ module_family=cls.module_families[0],
671
687
  ),
672
688
  ModuleType.objects.create(
673
- manufacturer=cls.manufacturers[2], model="Filter Test Module Type 3", comments="Module Type 3"
689
+ manufacturer=cls.manufacturers[2],
690
+ model="Filter Test Module Type 3",
691
+ comments="Module Type 3",
692
+ module_family=cls.module_families[1],
674
693
  ),
675
694
  )
676
695
 
@@ -715,6 +734,7 @@ def common_test_data(cls):
715
734
  name=f"Test Filters Module Module Bay {i+1}",
716
735
  position=i + 1,
717
736
  module_type=module_types[i % 2],
737
+ requires_first_party_modules=(i % 2 == 0), # True for even indices, False for odd
718
738
  )
719
739
 
720
740
  module_roles = Role.objects.get_for_model(Module)
@@ -4055,6 +4075,18 @@ class ModuleTestCase(
4055
4075
  Interface.objects.filter(pk=interfaces[0].pk).update(mac_address="00-00-00-00-00-01")
4056
4076
  Interface.objects.filter(pk=interfaces[1].pk).update(mac_address="00-00-00-00-00-02")
4057
4077
 
4078
+ def test_compatible_with_module_bay(self):
4079
+ """Test filtering modules that are compatible with a specific module bay based on module family."""
4080
+ module_bay = ModuleBay.objects.filter(module_family__isnull=False).first()
4081
+ compatible_modules = Module.objects.filter(module_type__module_family=module_bay.module_family)
4082
+ params = {"compatible_with_module_bay": module_bay.pk}
4083
+ self.assertQuerysetEqualAndNotEmpty(self.filterset(params).qs, compatible_modules)
4084
+
4085
+ # Test with module bay that has no module family - should return ALL modules
4086
+ module_bay_no_family = ModuleBay.objects.filter(module_family__isnull=True).first()
4087
+ params = {"compatible_with_module_bay": module_bay_no_family.pk}
4088
+ self.assertQuerysetEqual(self.filterset(params).qs, self.queryset, ordered=False)
4089
+
4058
4090
 
4059
4091
  class ModuleTypeTestCase(FilterTestCases.FilterTestCase):
4060
4092
  queryset = ModuleType.objects.all()
@@ -4080,12 +4112,26 @@ class ModuleTypeTestCase(FilterTestCases.FilterTestCase):
4080
4112
  ("rear_port_templates", "rear_port_templates__id"),
4081
4113
  ("rear_port_templates", "rear_port_templates__name"),
4082
4114
  ("module_bay_templates", "module_bay_templates__id"),
4115
+ ("module_family", "module_family__id"),
4116
+ ("module_family", "module_family__name"),
4083
4117
  ]
4084
4118
 
4085
4119
  @classmethod
4086
4120
  def setUpTestData(cls):
4087
4121
  common_test_data(cls)
4088
4122
 
4123
+ def test_compatible_with_module_bay(self):
4124
+ """Test filtering module types that are compatible with a specific module bay based on module family."""
4125
+ module_bay = ModuleBay.objects.filter(module_family__isnull=False).first()
4126
+ compatible_module_types = ModuleType.objects.filter(module_family=module_bay.module_family)
4127
+ params = {"compatible_with_module_bay": module_bay.pk}
4128
+ self.assertQuerysetEqualAndNotEmpty(self.filterset(params).qs, compatible_module_types)
4129
+
4130
+ # Test with module bay that has no module family - should return ALL module types
4131
+ module_bay_no_family = ModuleBay.objects.filter(module_family__isnull=True).first()
4132
+ params = {"compatible_with_module_bay": module_bay_no_family.pk}
4133
+ self.assertQuerysetEqual(self.filterset(params).qs, self.queryset, ordered=False)
4134
+
4089
4135
 
4090
4136
  class ModuleBayTemplateTestCase(FilterTestCases.FilterTestCase):
4091
4137
  queryset = ModuleBayTemplate.objects.all()
@@ -4097,6 +4143,8 @@ class ModuleBayTemplateTestCase(FilterTestCases.FilterTestCase):
4097
4143
  ("label",),
4098
4144
  ("module_type", "module_type__id"),
4099
4145
  ("module_type", "module_type__model"),
4146
+ ("module_family", "module_family__id"),
4147
+ ("module_family", "module_family__name"),
4100
4148
  ("name",),
4101
4149
  ("position",),
4102
4150
  ]
@@ -4105,6 +4153,21 @@ class ModuleBayTemplateTestCase(FilterTestCases.FilterTestCase):
4105
4153
  def setUpTestData(cls):
4106
4154
  common_test_data(cls)
4107
4155
 
4156
+ def test_requires_first_party_modules(self):
4157
+ # TODO: Not a generic_filter_test because this is a boolean filter but not a RelatedMembershipBooleanFilter
4158
+ with self.subTest():
4159
+ params = {"requires_first_party_modules": True}
4160
+ self.assertQuerysetEqual(
4161
+ self.filterset(params, self.queryset).qs,
4162
+ self.queryset.filter(requires_first_party_modules=True),
4163
+ )
4164
+ with self.subTest():
4165
+ params = {"requires_first_party_modules": False}
4166
+ self.assertQuerysetEqual(
4167
+ self.filterset(params, self.queryset).qs,
4168
+ self.queryset.filter(requires_first_party_modules=False),
4169
+ )
4170
+
4108
4171
 
4109
4172
  class ModuleBayTestCase(FilterTestCases.FilterTestCase):
4110
4173
  queryset = ModuleBay.objects.all()
@@ -4268,3 +4331,39 @@ class InterfaceVDCAssignmentTestCase(FilterTestCases.FilterTestCase):
4268
4331
  status=interface_status,
4269
4332
  ),
4270
4333
  )
4334
+
4335
+
4336
+ class ModuleFamilyTestCase(FilterTestCases.FilterTestCase):
4337
+ """Test cases for the ModuleFamilyFilterSet."""
4338
+
4339
+ queryset = ModuleFamily.objects.all()
4340
+ filterset = ModuleFamilyFilterSet
4341
+ generic_filter_tests = [
4342
+ ("name",),
4343
+ ("description",),
4344
+ ("module_types", "module_types__id"),
4345
+ ("module_types", "module_types__model"),
4346
+ ]
4347
+
4348
+ @classmethod
4349
+ def setUpTestData(cls):
4350
+ """Create test data for filter tests."""
4351
+ manufacturers = (
4352
+ Manufacturer.objects.create(name="Manufacturer 1"),
4353
+ Manufacturer.objects.create(name="Manufacturer 2"),
4354
+ )
4355
+
4356
+ cls.module_families = (
4357
+ ModuleFamily.objects.create(name="Module Family 1", description="First family"),
4358
+ ModuleFamily.objects.create(name="Module Family 2", description="Second family"),
4359
+ ModuleFamily.objects.create(name="Module Family 3", description="Third family"),
4360
+ )
4361
+
4362
+ cls.module_types = (
4363
+ ModuleType.objects.create(
4364
+ manufacturer=manufacturers[0], model="Model 1", module_family=cls.module_families[0]
4365
+ ),
4366
+ ModuleType.objects.create(
4367
+ manufacturer=manufacturers[1], model="Model 2", module_family=cls.module_families[1]
4368
+ ),
4369
+ )