nautobot 2.4.8__py3-none-any.whl → 2.4.9__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 (364) hide show
  1. nautobot/circuits/templates/circuits/circuittype.html +1 -1
  2. nautobot/circuits/templates/circuits/circuittype_retrieve.html +1 -39
  3. nautobot/circuits/views.py +18 -23
  4. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +4 -111
  5. nautobot/cloud/views.py +56 -25
  6. nautobot/core/celery/schedulers.py +1 -0
  7. nautobot/core/filters.py +1 -1
  8. nautobot/core/graphql/schema.py +1 -0
  9. nautobot/core/jobs/__init__.py +14 -3
  10. nautobot/core/tables.py +13 -6
  11. nautobot/core/testing/views.py +27 -2
  12. nautobot/core/tests/test_jobs.py +113 -0
  13. nautobot/core/tests/test_ui.py +53 -1
  14. nautobot/core/tests/test_utils.py +11 -0
  15. nautobot/core/ui/object_detail.py +19 -12
  16. nautobot/core/utils/filtering.py +3 -0
  17. nautobot/core/views/renderers.py +1 -1
  18. nautobot/dcim/forms.py +10 -0
  19. nautobot/dcim/templates/dcim/devicefamily_retrieve.html +1 -43
  20. nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +1 -59
  21. nautobot/dcim/templates/dcim/devicetype.html +2 -217
  22. nautobot/dcim/templates/dcim/devicetype_edit.html +2 -32
  23. nautobot/dcim/templates/dcim/devicetype_retrieve.html +217 -0
  24. nautobot/dcim/templates/dcim/devicetype_update.html +32 -0
  25. nautobot/dcim/templates/dcim/inc/rack_elevation.html +1 -1
  26. nautobot/dcim/templates/dcim/modulebay_retrieve.html +1 -84
  27. nautobot/dcim/templates/dcim/rack_elevation.html +14 -0
  28. nautobot/dcim/templates/dcim/rackreservation_retrieve.html +0 -68
  29. nautobot/dcim/tests/integration/test_fileinputpicker.py +1 -1
  30. nautobot/dcim/urls.py +1 -36
  31. nautobot/dcim/views.py +133 -81
  32. nautobot/extras/api/views.py +4 -6
  33. nautobot/extras/migrations/0024_job_data_migration.py +1 -1
  34. nautobot/extras/models/jobs.py +78 -62
  35. nautobot/extras/tables.py +11 -1
  36. nautobot/extras/templates/extras/computedfield_retrieve.html +1 -55
  37. nautobot/extras/templates/extras/inc/job_tiles.html +1 -1
  38. nautobot/extras/templates/extras/jobresult.html +1 -1
  39. nautobot/extras/templates/extras/metadatatype_retrieve.html +1 -66
  40. nautobot/extras/templates/extras/scheduledjob.html +25 -9
  41. nautobot/extras/tests/test_api.py +1 -1
  42. nautobot/extras/tests/test_views.py +15 -2
  43. nautobot/extras/utils.py +18 -16
  44. nautobot/extras/views.py +65 -26
  45. nautobot/ipam/tables.py +3 -4
  46. nautobot/project-static/docs/404.html +4 -4
  47. nautobot/project-static/docs/apps/index.html +4 -4
  48. nautobot/project-static/docs/apps/nautobot-apps.html +4 -4
  49. nautobot/project-static/docs/assets/javascripts/{bundle.c8b220af.min.js → bundle.13a4f30d.min.js} +4 -4
  50. nautobot/project-static/docs/assets/javascripts/{bundle.c8b220af.min.js.map → bundle.13a4f30d.min.js.map} +2 -2
  51. nautobot/project-static/docs/assets/javascripts/workers/{search.f8cc74c7.min.js → search.d50fe291.min.js} +2 -2
  52. nautobot/project-static/docs/assets/javascripts/workers/{search.f8cc74c7.min.js.map → search.d50fe291.min.js.map} +1 -1
  53. nautobot/project-static/docs/assets/stylesheets/{main.2afb09e1.min.css → main.342714a4.min.css} +1 -1
  54. nautobot/project-static/docs/assets/stylesheets/{main.2afb09e1.min.css.map → main.342714a4.min.css.map} +1 -1
  55. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +4 -4
  56. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +4 -4
  57. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +4 -4
  58. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +4 -4
  59. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +4 -4
  60. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +4 -4
  61. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +4 -4
  62. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +4 -4
  63. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +4 -4
  64. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +4 -4
  65. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +4 -4
  66. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +4 -4
  67. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +4 -4
  68. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +4 -4
  69. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +4 -4
  70. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +4 -4
  71. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +4 -4
  72. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +4 -4
  73. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +4 -4
  74. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +4 -4
  75. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +6 -8
  76. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +4 -4
  77. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +36 -6
  78. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +4 -4
  79. nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -4
  80. nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -4
  81. nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -4
  82. nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -4
  83. nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -4
  84. nautobot/project-static/docs/development/apps/api/models/index.html +4 -4
  85. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -4
  86. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -4
  87. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -4
  88. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -4
  89. nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -4
  90. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -4
  91. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -4
  92. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -4
  93. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -4
  94. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +4 -4
  95. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -4
  96. nautobot/project-static/docs/development/apps/api/prometheus.html +4 -4
  97. nautobot/project-static/docs/development/apps/api/setup.html +4 -4
  98. nautobot/project-static/docs/development/apps/api/testing.html +4 -4
  99. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -4
  100. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -4
  101. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -4
  102. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -4
  103. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -4
  104. nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -4
  105. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -4
  106. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -4
  107. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -4
  108. nautobot/project-static/docs/development/apps/api/views/index.html +4 -4
  109. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -4
  110. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -4
  111. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -4
  112. nautobot/project-static/docs/development/apps/api/views/notes.html +4 -4
  113. nautobot/project-static/docs/development/apps/api/views/rest-api.html +4 -4
  114. nautobot/project-static/docs/development/apps/api/views/urls.html +4 -4
  115. nautobot/project-static/docs/development/apps/index.html +4 -4
  116. nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -4
  117. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -4
  118. nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -4
  119. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -4
  120. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -4
  121. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -4
  122. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -4
  123. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +4 -4
  124. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -4
  125. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +4 -4
  126. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -4
  127. nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -4
  128. nautobot/project-static/docs/development/core/application-registry.html +4 -4
  129. nautobot/project-static/docs/development/core/best-practices.html +4 -4
  130. nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -4
  131. nautobot/project-static/docs/development/core/caching.html +4 -4
  132. nautobot/project-static/docs/development/core/controllers.html +4 -4
  133. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +41 -55
  134. nautobot/project-static/docs/development/core/generic-views.html +4 -4
  135. nautobot/project-static/docs/development/core/getting-started.html +4 -4
  136. nautobot/project-static/docs/development/core/homepage.html +4 -4
  137. nautobot/project-static/docs/development/core/index.html +4 -4
  138. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +4 -4
  139. nautobot/project-static/docs/development/core/model-checklist.html +4 -4
  140. nautobot/project-static/docs/development/core/model-features.html +4 -4
  141. nautobot/project-static/docs/development/core/natural-keys.html +4 -4
  142. nautobot/project-static/docs/development/core/navigation-menu.html +4 -4
  143. nautobot/project-static/docs/development/core/release-checklist.html +4 -4
  144. nautobot/project-static/docs/development/core/role-internals.html +4 -4
  145. nautobot/project-static/docs/development/core/settings.html +4 -4
  146. nautobot/project-static/docs/development/core/style-guide.html +4 -4
  147. nautobot/project-static/docs/development/core/templates.html +4 -4
  148. nautobot/project-static/docs/development/core/testing.html +4 -4
  149. nautobot/project-static/docs/development/core/ui-component-framework.html +4 -4
  150. nautobot/project-static/docs/development/core/user-preferences.html +4 -4
  151. nautobot/project-static/docs/development/index.html +4 -4
  152. nautobot/project-static/docs/development/jobs/getting-started.html +4 -4
  153. nautobot/project-static/docs/development/jobs/index.html +4 -4
  154. nautobot/project-static/docs/development/jobs/installation.html +4 -4
  155. nautobot/project-static/docs/development/jobs/job-extensions.html +4 -4
  156. nautobot/project-static/docs/development/jobs/job-logging.html +4 -4
  157. nautobot/project-static/docs/development/jobs/job-patterns.html +4 -4
  158. nautobot/project-static/docs/development/jobs/job-structure.html +4 -4
  159. nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -4
  160. nautobot/project-static/docs/development/jobs/testing.html +4 -4
  161. nautobot/project-static/docs/index.html +4 -4
  162. nautobot/project-static/docs/overview/application_stack.html +4 -4
  163. nautobot/project-static/docs/overview/design_philosophy.html +4 -4
  164. nautobot/project-static/docs/release-notes/index.html +4 -4
  165. nautobot/project-static/docs/release-notes/version-1.0.html +4 -4
  166. nautobot/project-static/docs/release-notes/version-1.1.html +4 -4
  167. nautobot/project-static/docs/release-notes/version-1.2.html +4 -4
  168. nautobot/project-static/docs/release-notes/version-1.3.html +4 -4
  169. nautobot/project-static/docs/release-notes/version-1.4.html +4 -4
  170. nautobot/project-static/docs/release-notes/version-1.5.html +4 -4
  171. nautobot/project-static/docs/release-notes/version-1.6.html +4 -4
  172. nautobot/project-static/docs/release-notes/version-2.0.html +4 -4
  173. nautobot/project-static/docs/release-notes/version-2.1.html +4 -4
  174. nautobot/project-static/docs/release-notes/version-2.2.html +4 -4
  175. nautobot/project-static/docs/release-notes/version-2.3.html +4 -4
  176. nautobot/project-static/docs/release-notes/version-2.4.html +190 -4
  177. nautobot/project-static/docs/requirements.txt +1 -1
  178. nautobot/project-static/docs/search/search_index.json +1 -1
  179. nautobot/project-static/docs/sitemap.xml +298 -298
  180. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  181. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -4
  182. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -4
  183. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +4 -4
  184. nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -4
  185. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -4
  186. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +4 -4
  187. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -4
  188. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -4
  189. nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -4
  190. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -4
  191. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -4
  192. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -4
  193. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -4
  194. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -4
  195. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +4 -4
  196. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -4
  197. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -4
  198. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -4
  199. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +4 -4
  200. nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -4
  201. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +4 -4
  202. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -4
  203. nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -4
  204. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -4
  205. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -4
  206. nautobot/project-static/docs/user-guide/administration/security/index.html +4 -4
  207. nautobot/project-static/docs/user-guide/administration/security/notices.html +4 -4
  208. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -4
  209. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -4
  210. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -4
  211. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -4
  212. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -4
  213. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -4
  214. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -4
  215. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +4 -4
  216. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -4
  217. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -4
  218. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -4
  219. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -4
  220. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -4
  221. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -4
  222. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -4
  223. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -4
  224. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -4
  225. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -4
  226. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -4
  227. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -4
  228. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -4
  229. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -4
  230. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -4
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -4
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -4
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -4
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -4
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -4
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -4
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -4
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -4
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -4
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -4
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -4
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -4
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -4
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -4
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -4
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -4
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -4
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -4
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -4
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -4
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -4
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -4
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -4
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -4
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -4
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -4
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -4
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -4
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -4
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -4
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -4
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -4
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -4
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -4
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -4
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -4
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -4
  268. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -4
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -4
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -4
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -4
  272. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -4
  273. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +4 -4
  274. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -4
  275. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -4
  276. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -4
  277. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -4
  278. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -4
  279. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -4
  280. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -4
  281. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -4
  282. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -4
  283. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -4
  284. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -4
  285. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -4
  286. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +4 -4
  287. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -4
  288. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -4
  289. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -4
  290. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -4
  291. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -4
  292. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -4
  293. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -4
  294. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -4
  295. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -4
  296. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -4
  297. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -4
  298. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -4
  299. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -4
  300. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -4
  301. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -4
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -4
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -4
  304. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -4
  305. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -4
  306. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -4
  307. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -4
  308. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -4
  309. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +4 -4
  310. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -4
  311. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -4
  312. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -4
  313. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +4 -4
  314. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +4 -4
  315. nautobot/project-static/docs/user-guide/index.html +4 -4
  316. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -4
  317. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +4 -4
  318. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -4
  319. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -4
  320. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -4
  321. nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -4
  322. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -4
  323. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -4
  324. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -4
  325. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -4
  326. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -4
  327. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -4
  328. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +4 -4
  329. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -4
  330. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +4 -4
  331. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -4
  332. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -4
  333. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +4 -4
  334. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +4 -4
  335. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -4
  336. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -4
  337. nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -4
  338. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -4
  339. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +4 -4
  340. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -4
  341. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -4
  342. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +4 -4
  343. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +4 -4
  344. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -4
  345. nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -4
  346. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -4
  347. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -4
  348. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -4
  349. nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -4
  350. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -4
  351. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -4
  352. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -4
  353. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -4
  354. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -4
  355. nautobot/project-static/js/forms.js +0 -14
  356. nautobot/wireless/tables.py +1 -0
  357. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +1 -55
  358. nautobot/wireless/views.py +33 -28
  359. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/METADATA +3 -3
  360. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/RECORD +364 -361
  361. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/LICENSE.txt +0 -0
  362. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/NOTICE +0 -0
  363. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/WHEEL +0 -0
  364. {nautobot-2.4.8.dist-info → nautobot-2.4.9.dist-info}/entry_points.txt +0 -0
@@ -3,10 +3,13 @@
3
3
  from unittest.mock import patch
4
4
 
5
5
  from django.template import Context
6
+ from django.test import RequestFactory
6
7
 
7
8
  from nautobot.core.templatetags.helpers import HTML_NONE
8
9
  from nautobot.core.testing import TestCase
9
- from nautobot.core.ui.object_detail import BaseTextPanel, DataTablePanel, Panel
10
+ from nautobot.core.ui.object_detail import BaseTextPanel, DataTablePanel, ObjectsTablePanel, Panel
11
+ from nautobot.dcim.models import DeviceRedundancyGroup
12
+ from nautobot.dcim.tables.devices import DeviceTable
10
13
 
11
14
 
12
15
  class DataTablePanelTest(TestCase):
@@ -148,3 +151,52 @@ class BaseTextPanelTest(TestCase):
148
151
  panel = BaseTextPanel(weight=100)
149
152
  with self.assertRaises(NotImplementedError):
150
153
  panel.get_value({})
154
+
155
+
156
+ class ObjectsTablePanelTest(TestCase):
157
+ def setUp(self):
158
+ super().setUp()
159
+ self.factory = RequestFactory()
160
+ self.request = self.factory.get("/")
161
+ self.request.user = self.user
162
+
163
+ def test_include_exclude_columns(self):
164
+ panel = ObjectsTablePanel(
165
+ weight=100,
166
+ table_class=DeviceTable,
167
+ table_attribute="devices_sorted",
168
+ related_field_name="device_redundancy_group",
169
+ include_columns=[
170
+ "device_redundancy_group_priority",
171
+ ],
172
+ exclude_columns=[
173
+ "rack",
174
+ ],
175
+ )
176
+ redundancy_group = DeviceRedundancyGroup.objects.first()
177
+ context = {
178
+ "request": self.request,
179
+ "object": redundancy_group,
180
+ }
181
+ result = panel.get_extra_context(context)
182
+ columns = result["body_content_table"].columns
183
+ self.assertIn("device_redundancy_group_priority", [col.name for col in columns])
184
+ self.assertNotIn("rack", [col.name for col in columns])
185
+
186
+ def test_invalid_include_columns(self):
187
+ with self.assertRaises(ValueError) as context:
188
+ panel = ObjectsTablePanel(
189
+ weight=100,
190
+ table_class=DeviceTable,
191
+ table_attribute="devices_sorted",
192
+ related_field_name="device_redundancy_group",
193
+ include_columns=["non_existent_column"],
194
+ )
195
+ redundancy_group = DeviceRedundancyGroup.objects.first()
196
+ context_data = {
197
+ "request": self.request,
198
+ "object": redundancy_group,
199
+ }
200
+ panel.get_extra_context(context_data)
201
+
202
+ self.assertIn("non-existent column `non_existent_column`", str(context.exception))
@@ -714,6 +714,17 @@ class LookupRelatedFunctionTest(TestCase):
714
714
  form_field.queryset, extras_utils.ChangeLoggedModelsQuery().as_queryset()
715
715
  )
716
716
 
717
+ form_field = filtering.get_filterset_parameter_form_field(
718
+ extras_models.ObjectMetadata, "assigned_object_type"
719
+ )
720
+ self.assertIsInstance(form_field, forms.MultipleContentTypeField)
721
+ self.assertQuerysetEqualAndNotEmpty(
722
+ form_field.queryset,
723
+ ContentType.objects.filter(extras_utils.FeatureQuery("metadata").get_query()).order_by(
724
+ "app_label", "model"
725
+ ),
726
+ )
727
+
717
728
  with self.subTest("Test prefers_id"):
718
729
  form_field = filtering.get_filterset_parameter_form_field(dcim_models.Device, "location")
719
730
  self.assertEqual("id", form_field.to_field_name)
@@ -728,9 +728,7 @@ class ObjectsTablePanel(Panel):
728
728
  table_title (str, optional): The title to display in the panel heading for the table.
729
729
  If None, defaults to the plural verbose name of the table model.
730
730
  include_columns (list, optional): A list of field names to include in the table display.
731
- If provided, only these fields will be displayed in the table.
732
731
  exclude_columns (list, optional): A list of field names to exclude from the table display.
733
- Mutually exclusive with `include_columns`.
734
732
  add_button_route (str, optional): The route used to generate the "add" button URL. Defaults to "default",
735
733
  which uses the default table's model `add` route.
736
734
  add_permissions (list, optional): A list of permissions required for the "add" button to be displayed.
@@ -777,8 +775,6 @@ class ObjectsTablePanel(Panel):
777
775
  self.order_by_fields = order_by_fields
778
776
  self.table_title = table_title
779
777
  self.max_display_count = max_display_count
780
- if exclude_columns and include_columns:
781
- raise ValueError("You can only specify either `exclude_columns` or `include_columns`")
782
778
  self.include_columns = include_columns
783
779
  self.exclude_columns = exclude_columns
784
780
  self.add_button_route = add_button_route
@@ -878,14 +874,17 @@ class ObjectsTablePanel(Panel):
878
874
  # to redirect the user back to the correct tab after editing/deleteing an object
879
875
  body_content_table.columns["actions"].column.extra_context["return_url_extra"] = f"?tab={self.tab_id}"
880
876
 
881
- if self.exclude_columns or self.include_columns:
877
+ if self.exclude_columns:
882
878
  for column in body_content_table.columns:
883
- if (self.exclude_columns and column.name in self.exclude_columns) or (
884
- self.include_columns and column.name not in self.include_columns
885
- ):
879
+ if column.name in self.exclude_columns:
886
880
  body_content_table.columns.hide(column.name)
887
- else:
888
- body_content_table.columns.show(column.name)
881
+
882
+ if self.include_columns:
883
+ for column in self.include_columns:
884
+ if column not in body_content_table.base_columns:
885
+ raise ValueError(f"You are specifying a non-existent column `{column}`")
886
+ body_content_table.columns.show(column)
887
+
889
888
  # Enable bulk action toggle if the user has appropriate permissions
890
889
  user = request.user
891
890
  if self.enable_bulk_actions and (
@@ -906,10 +905,18 @@ class ObjectsTablePanel(Panel):
906
905
  body_content_table_model = body_content_table.Meta.model
907
906
  related_field_name = self.related_field_name or self.table_filter or obj._meta.model_name
908
907
 
908
+ list_url = getattr(self.table_class, "list_url", None)
909
+ if not list_url:
910
+ list_url = get_route_for_model(body_content_table_model, "list")
911
+
909
912
  try:
910
- list_route = reverse(get_route_for_model(body_content_table_model, "list"))
911
- body_content_table_list_url = f"{list_route}?{related_field_name}={obj.pk}"
913
+ list_route = reverse(list_url)
912
914
  except NoReverseMatch:
915
+ list_route = None
916
+
917
+ if list_route:
918
+ body_content_table_list_url = f"{list_route}?{related_field_name}={obj.pk}"
919
+ else:
913
920
  body_content_table_list_url = None
914
921
 
915
922
  body_content_table_add_url = self._get_table_add_url(context)
@@ -135,11 +135,14 @@ def get_filterset_parameter_form_field(model, parameter, filterset=None):
135
135
  from nautobot.core.models.fields import slugify_dashes_to_underscores # Avoid circular import
136
136
 
137
137
  plural_name = slugify_dashes_to_underscores(model._meta.verbose_name_plural)
138
+
138
139
  # Cable-connectable models use "cable_terminations", not "cables", as the feature name
139
140
  if plural_name == "cables":
140
141
  plural_name = "cable_terminations"
141
142
  elif plural_name == "metadata_types":
142
143
  plural_name = "metadata"
144
+ elif plural_name == "object_metadata":
145
+ plural_name = "metadata"
143
146
  try:
144
147
  form_field = MultipleContentTypeField(choices_as_strings=True, feature=plural_name)
145
148
  except KeyError:
@@ -301,7 +301,7 @@ class NautobotHTMLRenderer(renderers.BrowsableAPIRenderer):
301
301
  # If the view does not have a object_detail_content attribute, set it to None.
302
302
  context["object_detail_content"] = None
303
303
  context.update(common_detail_view_context(request, instance))
304
- elif view.action == "list":
304
+ if view.action == "list":
305
305
  # Construct valid actions for list view.
306
306
  valid_actions = self.validate_action_buttons(view, request)
307
307
  # Query SavedViews for dropdown button
nautobot/dcim/forms.py CHANGED
@@ -727,6 +727,16 @@ class RackReservationForm(NautobotModelForm, TenancyForm):
727
727
  "tags",
728
728
  ]
729
729
 
730
+ def __init__(self, *args, **kwargs):
731
+ super().__init__(*args, **kwargs)
732
+
733
+ rack = getattr(self.instance, "rack", None)
734
+ if rack:
735
+ if not self.initial.get("location"):
736
+ self.initial["location"] = rack.location
737
+ if not self.initial.get("rack_group"):
738
+ self.initial["rack_group"] = rack.rack_group
739
+
730
740
 
731
741
  class RackReservationBulkEditForm(TagsBulkEditFormMixin, NautobotBulkEditForm):
732
742
  pk = forms.ModelMultipleChoiceField(queryset=RackReservation.objects.all(), widget=forms.MultipleHiddenInput())
@@ -1,44 +1,2 @@
1
1
  {% extends 'generic/object_retrieve.html' %}
2
-
3
- {% block content_left_page %}
4
- <div class="panel panel-default">
5
- <div class="panel-heading">
6
- <strong>Device Family</strong>
7
- </div>
8
- <table class="table table-hover panel-body attr-table">
9
- <tr>
10
- <td>Name</td>
11
- <td>{{ object.name }}</a></td>
12
- </tr>
13
- <tr>
14
- <td>Description</td>
15
- <td>{{ object.description }}</a></td>
16
- </tr>
17
- <tr>
18
- <td>Device Types</td>
19
- <td><a href="{% url 'dcim:devicetype_list' %}?device_family={{ object.name }}">{{ device_type_count }}</a></td>
20
- </tr>
21
- <tr>
22
- <td>Total Devices</td>
23
- <td><a href="{% url 'dcim:device_list' %}?device_family={{ object.name }}">{{ total_devices }}</a></td>
24
- </tr>
25
- </table>
26
- </div>
27
- {% endblock %}
28
-
29
- {% block content_full_width_page %}
30
- <div class="panel panel-default">
31
- <div class="panel-heading">
32
- <strong>Device Types</strong>
33
- </div>
34
- {% include 'panel_table.html' with table=device_type_table %}
35
- {% if perms.dcim.add_devicetype %}
36
- <div class="panel-footer text-right noprint">
37
- <a href="{% url 'dcim:devicetype_add' %}?device_family={{ object.pk }}" class="btn btn-xs btn-primary">
38
- <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add Device Type
39
- </a>
40
- </div>
41
- {% endif %}
42
- </div>
43
- {% include 'inc/paginator.html' with paginator=device_type_table.paginator page=device_type_table.page %}
44
- {% endblock content_full_width_page %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,60 +1,2 @@
1
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>Device Redundancy Group</strong>
8
- </div>
9
- <table class="table table-hover panel-body attr-table">
10
- <tr>
11
- <td>Status</td>
12
- <td>
13
- {{ object.status| hyperlinked_object_with_color }}
14
- </td>
15
- </tr>
16
- <tr>
17
- <td>Description</td>
18
- <td>{{ object.description }}</td>
19
- </tr>
20
- <tr>
21
- <td>Failover Strategy</td>
22
- <td>{{ object.get_failover_strategy_display }}</td>
23
- </tr>
24
- <tr>
25
- <td>Secrets Group</td>
26
- <td>{{ object.secrets_group|hyperlinked_object }}</td>
27
- </tr>
28
- </table>
29
- </div>
30
- {% endblock content_left_page %}
31
-
32
- {% block content_right_page %}
33
- <div class="panel panel-default">
34
- <div class="panel-heading">
35
- <strong>Comments</strong>
36
- </div>
37
- <div class="panel-body rendered-markdown">
38
- {% if object.comments %}
39
- {{ object.comments|render_markdown }}
40
- {% else %}
41
- <span class="text-muted">None</span>
42
- {% endif %}
43
- </div>
44
- </div>
45
- {% endblock content_right_page %}
46
-
47
- {% block content_full_width_page %}
48
- <div class="panel panel-default">
49
- <div class="panel-heading">
50
- <strong>Controllers</strong>
51
- </div>
52
- {% include 'responsive_table.html' with table=controllers_table %}
53
- </div>
54
- <div class="panel panel-default">
55
- <div class="panel-heading">
56
- <strong>Devices</strong>
57
- </div>
58
- {% include 'responsive_table.html' with table=devices_table %}
59
- </div>
60
- {% endblock content_full_width_page %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,217 +1,2 @@
1
- {% extends 'generic/object_retrieve.html' %}
2
- {% load buttons %}
3
- {% load helpers %}
4
- {% load plugins %}
5
-
6
- {% block extra_breadcrumbs %}
7
- <li><a href="{% url 'dcim:devicetype_list' %}?manufacturer={{ object.manufacturer.name }}">{{ object.manufacturer }}</a></li>
8
- {% endblock extra_breadcrumbs %}
9
-
10
- {% block extra_buttons %}
11
- {% if perms.dcim.change_devicetype %}
12
- <div class="btn-group">
13
- <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" id="device-type-add-components-button">
14
- <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add Components <span class="caret"></span>
15
- </button>
16
- <ul class="dropdown-menu">
17
- {% if perms.dcim.add_consoleporttemplate %}
18
- <li><a href="{% url 'dcim:consoleporttemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=consoleports">Console Ports</a></li>
19
- {% endif %}
20
- {% if perms.dcim.add_consoleserverporttemplate %}
21
- <li><a href="{% url 'dcim:consoleserverporttemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=consoleserverports">Console Server Ports</a></li>
22
- {% endif %}
23
- {% if perms.dcim.add_powerporttemplate %}
24
- <li><a href="{% url 'dcim:powerporttemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=powerports">Power Ports</a></li>
25
- {% endif %}
26
- {% if perms.dcim.add_poweroutlettemplate %}
27
- <li><a href="{% url 'dcim:poweroutlettemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=poweroutlets">Power Outlets</a></li>
28
- {% endif %}
29
- {% if perms.dcim.add_interfacetemplate %}
30
- <li><a href="{% url 'dcim:interfacetemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=interfaces">Interfaces</a></li>
31
- {% endif %}
32
- {% if perms.dcim.add_frontporttemplate %}
33
- <li><a href="{% url 'dcim:frontporttemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=frontports">Front Ports</a></li>
34
- {% endif %}
35
- {% if perms.dcim.add_rearporttemplate %}
36
- <li><a href="{% url 'dcim:rearporttemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=rearports">Rear Ports</a></li>
37
- {% endif %}
38
- {% if perms.dcim.add_devicebaytemplate %}
39
- <li><a href="{% url 'dcim:devicebaytemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=devicebays">Device Bays</a></li>
40
- {% endif %}
41
- {% if perms.dcim.add_modulebaytemplate %}
42
- <li><a href="{% url 'dcim:modulebaytemplate_add' %}?device_type={{ object.pk }}&return_url={{ object.get_absolute_url }}%3Ftab=modulebays">Module Bays</a></li>
43
- {% endif %}
44
- </ul>
45
- </div>
46
- {% endif %}
47
- {% endblock extra_buttons %}
48
-
49
- {% block title %}{{ object.manufacturer }} {{ object.model }}{% endblock title %}
50
-
51
- {% block extra_nav_tabs %}
52
- <li role="presentation" {% if request.GET.tab == 'interfaces' %} class="active"{% endif %}>
53
- <a href="{{ object.get_absolute_url }}#interfaces" onclick="switch_tab(this.href)" aria-controls="interfaces" role="tab" data-toggle="tab">
54
- Interfaces {% badge interface_table.rows|length %}
55
- </a>
56
- </li>
57
- <li role="presentation" {% if request.GET.tab == 'frontports' %} class="active"{% endif %}>
58
- <a href="{{ object.get_absolute_url }}#frontports" onclick="switch_tab(this.href)" aria-controls="frontports" role="tab" data-toggle="tab">
59
- Front Ports {% badge front_port_table.rows|length %}
60
- </a>
61
- </li>
62
- <li role="presentation" {% if request.GET.tab == 'rearports' %} class="active"{% endif %}>
63
- <a href="{{ object.get_absolute_url }}#rearports" onclick="switch_tab(this.href)" aria-controls="rearports" role="tab" data-toggle="tab">
64
- Rear Ports {% badge rear_port_table.rows|length %}
65
- </a>
66
- </li>
67
- <li role="presentation" {% if request.GET.tab == 'consoleports' %} class="active"{% endif %}>
68
- <a href="{{ object.get_absolute_url }}#consoleports" onclick="switch_tab(this.href)" aria-controls="consoleports" role="tab" data-toggle="tab">
69
- Console Ports {% badge consoleport_table.rows|length %}
70
- </a>
71
- </li>
72
- <li role="presentation" {% if request.GET.tab == 'consoleserverports' %} class="active"{% endif %}>
73
- <a href="{{ object.get_absolute_url }}#consoleserverports" onclick="switch_tab(this.href)" aria-controls="consoleserverports" role="tab" data-toggle="tab">
74
- Console Server Ports {% badge consoleserverport_table.rows|length %}
75
- </a>
76
- </li>
77
- <li role="presentation" {% if request.GET.tab == 'powerports' %} class="active"{% endif %}>
78
- <a href="{{ object.get_absolute_url }}#powerports" onclick="switch_tab(this.href)" aria-controls="powerports" role="tab" data-toggle="tab">
79
- Power Ports {% badge powerport_table.rows|length %}
80
- </a>
81
- </li>
82
- <li role="presentation" {% if request.GET.tab == 'poweroutlets' %} class="active"{% endif %}>
83
- <a href="{{ object.get_absolute_url }}#poweroutlets" onclick="switch_tab(this.href)" aria-controls="poweroutlets" role="tab" data-toggle="tab">
84
- Power Outlets {% badge poweroutlet_table.rows|length %}
85
- </a>
86
- </li>
87
- <li role="presentation"{% if request.GET.tab == 'devicebays' %} class="active"{% endif %}>
88
- <a href="{{ object.get_absolute_url }}#devicebays" onclick="switch_tab(this.href)" aria-controls="devicebays" role="tab" data-toggle="tab">
89
- Device Bays {% badge devicebay_table.rows|length %}
90
- </a>
91
- </li>
92
- <li role="presentation"{% if request.GET.tab == 'modulebays' %} class="active"{% endif %}>
93
- <a href="{{ object.get_absolute_url }}#modulebays" onclick="switch_tab(this.href)" aria-controls="modulebays" role="tab" data-toggle="tab">
94
- Module Bays {% badge modulebay_table.rows|length %}
95
- </a>
96
- </li>
97
- {% endblock extra_nav_tabs %}
98
-
99
- {% block content_left_page %}
100
- <div class="panel panel-default">
101
- <div class="panel-heading">
102
- <strong>Chassis</strong>
103
- </div>
104
- <table class="table table-hover panel-body attr-table">
105
- <tr>
106
- <td>Manufacturer</td>
107
- <td><a href="{% url 'dcim:devicetype_list' %}?manufacturer={{ object.manufacturer.name }}">{{ object.manufacturer }}</a></td>
108
- </tr>
109
- <tr>
110
- <td>Device Family</td>
111
- <td>
112
- {{ object.device_family | hyperlinked_object }}
113
- </td>
114
- </tr>
115
- <tr>
116
- <td>Model Name</td>
117
- <td>
118
- {{ object.model }}<br/>
119
- </td>
120
- </tr>
121
- <tr>
122
- <td>Part Number</td>
123
- <td>{{ object.part_number|placeholder }}</td>
124
- </tr>
125
- <tr>
126
- <td>Height (U)</td>
127
- <td>{{ object.u_height }}</td>
128
- </tr>
129
- <tr>
130
- <td>Full Depth</td>
131
- <td>{{ object.is_full_depth | render_boolean }}</td>
132
- </tr>
133
- <tr>
134
- <td>Parent/Child</td>
135
- <td>
136
- {{ object.get_subdevice_role_display|placeholder }}
137
- </td>
138
- </tr>
139
- <tr>
140
- <td>Front Image</td>
141
- <td>
142
- {% if object.front_image %}
143
- <a href="{{ object.front_image.url }}">
144
- <img src="{{ object.front_image.url }}" alt="{{ object.front_image.name }}" class="img-responsive" />
145
- </a>
146
- {% else %}
147
- <span class="text-muted">&mdash;</span>
148
- {% endif %}
149
- </td>
150
- </tr>
151
- <tr>
152
- <td>Rear Image</td>
153
- <td>
154
- {% if object.rear_image %}
155
- <a href="{{ object.rear_image.url }}">
156
- <img src="{{ object.rear_image.url }}" alt="{{ object.rear_image.name }}" class="img-responsive" />
157
- </a>
158
- {% else %}
159
- <span class="text-muted">&mdash;</span>
160
- {% endif %}
161
- </td>
162
- </tr>
163
- <tr>
164
- <td>Device Instances</td>
165
- <td><a href="{% url 'dcim:device_list' %}?device_type={{ object.pk }}">{{ instance_count }}</a></td>
166
- </tr>
167
- </table>
168
- </div>
169
- {% endblock content_left_page %}
170
-
171
- {% block content_right_page %}
172
- <div class="panel panel-default">
173
- <div class="panel-heading">
174
- <strong>Comments</strong>
175
- </div>
176
- <div class="panel-body rendered-markdown">
177
- {% if object.comments %}
178
- {{ object.comments|render_markdown }}
179
- {% else %}
180
- <span class="text-muted">None</span>
181
- {% endif %}
182
- </div>
183
- </div>
184
- {% if object.software_image_files.count %}
185
- {% include 'panel_table.html' with table=software_image_files_table heading='Software Image Files' %}
186
- {% endif %}
187
- {% endblock content_right_page %}
188
-
189
- {% block extra_tab_content %}
190
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'interfaces' %}active{% else %}fade{% endif %}" id="interfaces">
191
- {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' tab='interfaces' %}
192
- </div>
193
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'frontports' %}active{% else %}fade{% endif %}" id="frontports">
194
- {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' tab='frontports' %}
195
- </div>
196
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'rearports' %}active{% else %}fade{% endif %}" id="rearports">
197
- {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' tab='rearports' %}
198
- </div>
199
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'consoleports' %}active{% else %}fade{% endif %}" id="consoleports">
200
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' tab='consoleports' %}
201
- </div>
202
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'consoleserverports' %}active{% else %}fade{% endif %}" id="consoleserverports">
203
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' tab='consoleserverports' %}
204
- </div>
205
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'powerports' %}active{% else %}fade{% endif %}" id="powerports">
206
- {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' tab='powerports' %}
207
- </div>
208
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'poweroutlets' %}active{% else %}fade{% endif %}" id="poweroutlets">
209
- {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' tab='poweroutlets' %}
210
- </div>
211
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'devicebays' %}active{% else %}fade{% endif %}" id="devicebays">
212
- {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' tab='devicebays' %}
213
- </div>
214
- <div role="tabpanel" class="tab-pane {% if request.GET.tab == 'modulebays' %}active{% else %}fade{% endif %}" id="modulebays">
215
- {% include 'dcim/inc/devicetype_component_table.html' with table=modulebay_table title='Module Bays' tab='modulebays' %}
216
- </div>
217
- {% endblock extra_tab_content %}
1
+ {% extends 'dcim/devicetype_retrieve.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,32 +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>Device Type</strong></div>
7
- <div class="panel-body">
8
- {% render_field form.manufacturer %}
9
- {% render_field form.device_family %}
10
- {% render_field form.model %}
11
- {% render_field form.part_number %}
12
- {% render_field form.u_height %}
13
- {% render_field form.is_full_depth %}
14
- {% render_field form.subdevice_role %}
15
- {% render_field form.software_image_files %}
16
- </div>
17
- </div>
18
- <div class="panel panel-default">
19
- <div class="panel-heading"><strong>Rack Images</strong></div>
20
- <div class="panel-body">
21
- {% render_field form.front_image %}
22
- {% render_field form.rear_image %}
23
- </div>
24
- </div>
25
- {% include 'inc/extras_features_edit_form_fields.html' %}
26
- <div class="panel panel-default">
27
- <div class="panel-heading"><strong>Comments</strong></div>
28
- <div class="panel-body">
29
- {% render_field form.comments %}
30
- </div>
31
- </div>
32
- {% endblock %}
1
+ {% extends "dcim/devicetype_update.html" %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}