nautobot 2.4.6__py3-none-any.whl → 2.4.7__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 (347) hide show
  1. nautobot/apps/forms.py +2 -0
  2. nautobot/circuits/templates/circuits/providernetwork.html +1 -1
  3. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +2 -55
  4. nautobot/circuits/views.py +20 -23
  5. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +2 -40
  6. nautobot/cloud/views.py +12 -0
  7. nautobot/core/api/urls.py +2 -2
  8. nautobot/core/api/views.py +39 -1
  9. nautobot/core/forms/__init__.py +2 -0
  10. nautobot/core/forms/fields.py +2 -2
  11. nautobot/core/forms/widgets.py +18 -0
  12. nautobot/core/templates/widgets/sluginput.html +5 -1
  13. nautobot/core/templatetags/helpers.py +15 -1
  14. nautobot/core/testing/integration.py +6 -2
  15. nautobot/core/ui/object_detail.py +16 -3
  16. nautobot/core/utils/lookup.py +2 -2
  17. nautobot/dcim/forms.py +10 -0
  18. nautobot/dcim/models/locations.py +9 -0
  19. nautobot/dcim/templates/dcim/device_list.html +1 -1
  20. nautobot/dcim/templates/dcim/devicetype.html +1 -1
  21. nautobot/dcim/templates/dcim/manufacturer.html +1 -63
  22. nautobot/dcim/templates/dcim/module_list.html +1 -1
  23. nautobot/dcim/templates/dcim/moduletype_retrieve.html +1 -1
  24. nautobot/dcim/tests/integration/test_module_bay_position.py +125 -0
  25. nautobot/dcim/tests/test_models.py +13 -0
  26. nautobot/dcim/tests/test_views.py +4 -1
  27. nautobot/dcim/urls.py +1 -45
  28. nautobot/dcim/views.py +35 -66
  29. nautobot/extras/choices.py +4 -0
  30. nautobot/extras/filters/__init__.py +6 -0
  31. nautobot/extras/forms/forms.py +76 -8
  32. nautobot/extras/models/customfields.py +10 -9
  33. nautobot/extras/signals.py +43 -4
  34. nautobot/extras/tasks.py +4 -2
  35. nautobot/extras/templates/extras/contact_retrieve.html +1 -58
  36. nautobot/extras/templates/extras/exporttemplate.html +1 -53
  37. nautobot/extras/templates/extras/team_retrieve.html +1 -58
  38. nautobot/extras/tests/test_customfields.py +24 -0
  39. nautobot/extras/tests/test_views.py +22 -0
  40. nautobot/extras/urls.py +2 -70
  41. nautobot/extras/views.py +101 -79
  42. nautobot/ipam/tables.py +1 -0
  43. nautobot/project-static/css/base.css +5 -0
  44. nautobot/project-static/docs/404.html +0 -2
  45. nautobot/project-static/docs/apps/index.html +0 -2
  46. nautobot/project-static/docs/apps/nautobot-apps.html +0 -2
  47. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +0 -2
  48. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +0 -2
  49. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +0 -2
  50. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +0 -2
  51. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +0 -2
  52. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +0 -2
  53. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +0 -2
  54. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +0 -2
  55. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +0 -2
  56. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +0 -2
  57. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +0 -2
  58. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +0 -2
  59. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +62 -2
  60. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +0 -2
  61. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +0 -2
  62. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +0 -2
  63. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +0 -2
  64. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +0 -2
  65. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +0 -2
  66. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +0 -2
  67. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +7 -5
  68. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +0 -2
  69. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +0 -2
  70. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +0 -2
  71. nautobot/project-static/docs/development/apps/api/configuration-view.html +0 -2
  72. nautobot/project-static/docs/development/apps/api/database-backend-config.html +0 -2
  73. nautobot/project-static/docs/development/apps/api/models/django-admin.html +0 -2
  74. nautobot/project-static/docs/development/apps/api/models/global-search.html +0 -2
  75. nautobot/project-static/docs/development/apps/api/models/graphql.html +0 -2
  76. nautobot/project-static/docs/development/apps/api/models/index.html +0 -2
  77. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +0 -2
  78. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +0 -2
  79. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +0 -2
  80. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +0 -2
  81. nautobot/project-static/docs/development/apps/api/platform-features/index.html +0 -2
  82. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +0 -2
  83. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +0 -2
  84. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +0 -2
  85. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +0 -2
  86. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +0 -2
  87. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +0 -2
  88. nautobot/project-static/docs/development/apps/api/prometheus.html +0 -2
  89. nautobot/project-static/docs/development/apps/api/setup.html +0 -2
  90. nautobot/project-static/docs/development/apps/api/testing.html +0 -2
  91. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +0 -2
  92. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +0 -2
  93. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +0 -2
  94. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +0 -2
  95. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +0 -2
  96. nautobot/project-static/docs/development/apps/api/views/base-template.html +0 -2
  97. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +0 -2
  98. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +0 -2
  99. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +0 -2
  100. nautobot/project-static/docs/development/apps/api/views/index.html +0 -2
  101. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +0 -2
  102. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +0 -2
  103. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +0 -2
  104. nautobot/project-static/docs/development/apps/api/views/notes.html +0 -2
  105. nautobot/project-static/docs/development/apps/api/views/rest-api.html +0 -2
  106. nautobot/project-static/docs/development/apps/api/views/urls.html +0 -2
  107. nautobot/project-static/docs/development/apps/index.html +0 -2
  108. nautobot/project-static/docs/development/apps/migration/code-updates.html +0 -2
  109. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +0 -2
  110. nautobot/project-static/docs/development/apps/migration/from-v1.html +0 -2
  111. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +0 -2
  112. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +0 -2
  113. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +0 -2
  114. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +0 -2
  115. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +0 -2
  116. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +0 -2
  117. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +0 -2
  118. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +0 -2
  119. nautobot/project-static/docs/development/apps/porting-from-netbox.html +0 -2
  120. nautobot/project-static/docs/development/core/application-registry.html +0 -2
  121. nautobot/project-static/docs/development/core/best-practices.html +0 -2
  122. nautobot/project-static/docs/development/core/bootstrap-ui.html +0 -2
  123. nautobot/project-static/docs/development/core/caching.html +0 -2
  124. nautobot/project-static/docs/development/core/controllers.html +0 -2
  125. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +0 -2
  126. nautobot/project-static/docs/development/core/generic-views.html +0 -2
  127. nautobot/project-static/docs/development/core/getting-started.html +0 -2
  128. nautobot/project-static/docs/development/core/homepage.html +0 -2
  129. nautobot/project-static/docs/development/core/index.html +0 -2
  130. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +0 -2
  131. nautobot/project-static/docs/development/core/model-checklist.html +0 -2
  132. nautobot/project-static/docs/development/core/model-features.html +0 -2
  133. nautobot/project-static/docs/development/core/natural-keys.html +0 -2
  134. nautobot/project-static/docs/development/core/navigation-menu.html +0 -2
  135. nautobot/project-static/docs/development/core/release-checklist.html +0 -2
  136. nautobot/project-static/docs/development/core/role-internals.html +0 -2
  137. nautobot/project-static/docs/development/core/settings.html +0 -2
  138. nautobot/project-static/docs/development/core/style-guide.html +0 -2
  139. nautobot/project-static/docs/development/core/templates.html +0 -2
  140. nautobot/project-static/docs/development/core/testing.html +0 -2
  141. nautobot/project-static/docs/development/core/ui-component-framework.html +0 -2
  142. nautobot/project-static/docs/development/core/user-preferences.html +0 -2
  143. nautobot/project-static/docs/development/index.html +0 -2
  144. nautobot/project-static/docs/development/jobs/index.html +0 -2
  145. nautobot/project-static/docs/development/jobs/migration/from-v1.html +0 -2
  146. nautobot/project-static/docs/index.html +0 -2
  147. nautobot/project-static/docs/objects.inv +0 -0
  148. nautobot/project-static/docs/overview/application_stack.html +0 -2
  149. nautobot/project-static/docs/overview/design_philosophy.html +0 -2
  150. nautobot/project-static/docs/release-notes/index.html +0 -2
  151. nautobot/project-static/docs/release-notes/version-1.0.html +0 -2
  152. nautobot/project-static/docs/release-notes/version-1.1.html +0 -2
  153. nautobot/project-static/docs/release-notes/version-1.2.html +0 -2
  154. nautobot/project-static/docs/release-notes/version-1.3.html +0 -2
  155. nautobot/project-static/docs/release-notes/version-1.4.html +0 -2
  156. nautobot/project-static/docs/release-notes/version-1.5.html +0 -2
  157. nautobot/project-static/docs/release-notes/version-1.6.html +0 -2
  158. nautobot/project-static/docs/release-notes/version-2.0.html +0 -2
  159. nautobot/project-static/docs/release-notes/version-2.1.html +0 -2
  160. nautobot/project-static/docs/release-notes/version-2.2.html +0 -2
  161. nautobot/project-static/docs/release-notes/version-2.3.html +0 -2
  162. nautobot/project-static/docs/release-notes/version-2.4.html +138 -2
  163. nautobot/project-static/docs/search/search_index.json +1 -1
  164. nautobot/project-static/docs/sitemap.xml +290 -290
  165. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  166. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +0 -2
  167. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +0 -2
  168. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +0 -2
  169. nautobot/project-static/docs/user-guide/administration/configuration/index.html +0 -2
  170. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +0 -2
  171. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +0 -2
  172. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +0 -2
  173. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +0 -2
  174. nautobot/project-static/docs/user-guide/administration/guides/docker.html +0 -2
  175. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +0 -2
  176. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +0 -2
  177. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +0 -2
  178. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +0 -2
  179. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +0 -2
  180. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +0 -2
  181. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +0 -2
  182. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +0 -2
  183. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +0 -2
  184. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +0 -2
  185. nautobot/project-static/docs/user-guide/administration/installation/index.html +0 -2
  186. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +0 -2
  187. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +0 -2
  188. nautobot/project-static/docs/user-guide/administration/installation/services.html +0 -2
  189. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +0 -2
  190. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +0 -2
  191. nautobot/project-static/docs/user-guide/administration/security/index.html +0 -2
  192. nautobot/project-static/docs/user-guide/administration/security/notices.html +0 -2
  193. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +0 -2
  194. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +0 -2
  195. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +0 -2
  196. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +0 -2
  197. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +0 -2
  198. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +0 -2
  199. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +0 -2
  200. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +0 -2
  201. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +0 -2
  202. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +0 -2
  203. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +0 -2
  204. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +0 -2
  205. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +0 -2
  206. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +0 -2
  207. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +0 -2
  208. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +0 -2
  209. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +0 -2
  210. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +0 -2
  211. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +0 -2
  212. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +0 -2
  213. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +0 -2
  214. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +0 -2
  215. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +0 -2
  216. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +0 -2
  217. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +0 -2
  218. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +0 -2
  219. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +0 -2
  220. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +0 -2
  221. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +0 -2
  222. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +0 -2
  223. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +0 -2
  224. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +0 -2
  225. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +0 -2
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +0 -2
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +0 -2
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +0 -2
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +0 -2
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +0 -2
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +0 -2
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +0 -2
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +0 -2
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +0 -2
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +0 -2
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +0 -2
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +0 -2
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +0 -2
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +0 -2
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +0 -2
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +0 -2
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +0 -2
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +0 -2
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +0 -2
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +0 -2
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +0 -2
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +0 -2
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +0 -2
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +0 -2
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +0 -2
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +0 -2
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +0 -2
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +0 -2
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +0 -2
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +0 -2
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +0 -2
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +0 -2
  258. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +0 -2
  259. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +0 -2
  260. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +0 -2
  261. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +0 -2
  262. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +0 -2
  263. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +0 -2
  264. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +0 -2
  265. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +0 -2
  266. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +0 -2
  267. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +0 -2
  268. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +0 -2
  269. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +0 -2
  270. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +0 -2
  271. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +0 -2
  272. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +0 -2
  273. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +0 -2
  274. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +0 -2
  275. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +0 -2
  276. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +0 -2
  277. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +0 -2
  278. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +0 -2
  279. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +0 -2
  280. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +0 -2
  281. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +0 -2
  282. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +0 -2
  283. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +0 -2
  284. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +0 -2
  285. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +0 -2
  286. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +0 -2
  287. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +0 -2
  288. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +0 -2
  289. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +0 -2
  290. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +0 -2
  291. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +0 -2
  292. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +0 -2
  293. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +0 -2
  294. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +0 -2
  295. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +0 -2
  296. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +0 -2
  297. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +0 -2
  298. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +0 -2
  299. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -2
  300. nautobot/project-static/docs/user-guide/index.html +0 -2
  301. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +0 -2
  302. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +0 -2
  303. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +0 -2
  304. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +0 -2
  305. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +0 -2
  306. nautobot/project-static/docs/user-guide/platform-functionality/events.html +0 -2
  307. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +0 -2
  308. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +0 -2
  309. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +0 -2
  310. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +0 -2
  311. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +0 -2
  312. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +0 -2
  313. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +0 -2
  314. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +0 -2
  315. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +0 -2
  316. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +0 -2
  317. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +0 -2
  318. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -2
  319. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +0 -2
  320. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +0 -2
  321. nautobot/project-static/docs/user-guide/platform-functionality/note.html +0 -2
  322. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +0 -2
  323. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +0 -2
  324. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +0 -2
  325. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +0 -2
  326. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +0 -2
  327. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +0 -2
  328. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +0 -2
  329. nautobot/project-static/docs/user-guide/platform-functionality/role.html +0 -2
  330. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +0 -2
  331. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +0 -2
  332. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +0 -2
  333. nautobot/project-static/docs/user-guide/platform-functionality/status.html +0 -2
  334. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +0 -2
  335. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +0 -2
  336. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +0 -2
  337. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +0 -2
  338. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +0 -2
  339. nautobot/project-static/js/forms.js +88 -37
  340. nautobot/project-static/js/homepage_layout.js +12 -3
  341. {nautobot-2.4.6.dist-info → nautobot-2.4.7.dist-info}/METADATA +1 -1
  342. {nautobot-2.4.6.dist-info → nautobot-2.4.7.dist-info}/RECORD +346 -346
  343. nautobot/dcim/templates/dcim/modulebay_create.html +0 -39
  344. {nautobot-2.4.6.dist-info → nautobot-2.4.7.dist-info}/LICENSE.txt +0 -0
  345. {nautobot-2.4.6.dist-info → nautobot-2.4.7.dist-info}/NOTICE +0 -0
  346. {nautobot-2.4.6.dist-info → nautobot-2.4.7.dist-info}/WHEEL +0 -0
  347. {nautobot-2.4.6.dist-info → nautobot-2.4.7.dist-info}/entry_points.txt +0 -0
@@ -1,59 +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>Contact</strong>
8
- </div>
9
- <table class="table table-hover panel-body attr-table">
10
- <tr>
11
- <td>Name</td>
12
- <td>{{ object.name }}</td>
13
- </tr>
14
- <tr>
15
- <td>Phone</td>
16
- <td>{{ object.phone|hyperlinked_phone_number }}</td>
17
- </tr>
18
- <tr>
19
- <td>E-mail</td>
20
- <td>{{ object.email|hyperlinked_email }}</td>
21
- </tr>
22
- <tr>
23
- <td>Address</td>
24
- <td>
25
- {% if object.address %}
26
- <div class="pull-right noprint">
27
- <a href="https://maps.google.com/?q={{ object.address|urlencode }}" target="_blank" class="btn btn-primary btn-xs">
28
- <i class="mdi mdi-map-marker"></i> Map it
29
- </a>
30
- </div>
31
- <span>{{ object.address|linebreaksbr }}</span>
32
- {% else %}
33
- <span class="text-muted">&mdash;</span>
34
- {% endif %}
35
- </td>
36
- </tr>
37
- </table>
38
- </div>
39
- <div class="panel panel-default">
40
- <div class="panel-heading">
41
- <strong>Comments</strong>
42
- </div>
43
- <div class="panel-body rendered-markdown">
44
- {% if object.comments %}
45
- {{ object.comments|render_markdown }}
46
- {% else %}
47
- <span class="text-muted">None</span>
48
- {% endif %}
49
- </div>
50
- </div>
51
- {% endblock %}
52
-
53
- {% block content_right_page %}
54
- {% include 'panel_table.html' with table=teams_table heading='Assigned Teams' %}
55
- {% endblock %}
56
-
57
- {% block content_full_width_page %}
58
- {% include 'panel_table.html' with table=contact_associations_table heading='Contact For' %}
59
- {% endblock %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,54 +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>Details</strong>
8
- </div>
9
-
10
- <table class="table table-hover panel-body attr-table">
11
- <tr>
12
- <td>Name</td>
13
- <td><span>{{ object.name }}</span></td>
14
- </tr>
15
- <tr>
16
- <td>Owner</td>
17
- <td>{{ object.owner|hyperlinked_object }}</td>
18
- </tr>
19
- <tr>
20
- <td>Description</td>
21
- <td>{{ object.description|placeholder }}</td>
22
- </tr>
23
- </table>
24
- </div>
25
-
26
- <div class="panel panel-default">
27
- <div class="panel-heading">
28
- <strong>Template</strong>
29
- </div>
30
- <table class="table table-hover panel-body attr-table">
31
- <tr>
32
- <td>Object Type</td>
33
- <td><span>{{ object.content_type }}</span></td>
34
- </tr>
35
- <tr>
36
- <td>Mime Type</td>
37
- <td><span>{{ object.mime_type }}</span></td>
38
- </tr>
39
- <tr>
40
- <td>File Extension</td>
41
- <td><span>{{ object.file_extension }}</span></td>
42
- </tr>
43
- </table>
44
- </div>
45
- {% endblock content_left_page %}
46
-
47
- {% block content_right_page %}
48
- <div class="panel panel-default">
49
- <div class="panel-heading">
50
- <strong>Code Template</strong>
51
- </div>
52
- {% if object.template_code %} <pre>{{ object.template_code }}</pre> {% else %} {{ None }} {% endif %}
53
- </div>
54
- {% endblock content_right_page %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,59 +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>Team</strong>
8
- </div>
9
- <table class="table table-hover panel-body attr-table">
10
- <tr>
11
- <td>Name</td>
12
- <td>{{ object.name }}</td>
13
- </tr>
14
- <tr>
15
- <td>Phone</td>
16
- <td>{{ object.phone|hyperlinked_phone_number }}</td>
17
- </tr>
18
- <tr>
19
- <td>E-mail</td>
20
- <td>{{ object.email|hyperlinked_email }}</td>
21
- </tr>
22
- <tr>
23
- <td>Address</td>
24
- <td>
25
- {% if object.address %}
26
- <div class="pull-right noprint">
27
- <a href="https://maps.google.com/?q={{ object.address|urlencode }}" target="_blank" class="btn btn-primary btn-xs">
28
- <i class="mdi mdi-map-marker"></i> Map it
29
- </a>
30
- </div>
31
- <span>{{ object.address|linebreaksbr }}</span>
32
- {% else %}
33
- <span class="text-muted">&mdash;</span>
34
- {% endif %}
35
- </td>
36
- </tr>
37
- </table>
38
- </div>
39
- <div class="panel panel-default">
40
- <div class="panel-heading">
41
- <strong>Comments</strong>
42
- </div>
43
- <div class="panel-body rendered-markdown">
44
- {% if object.comments %}
45
- {{ object.comments|render_markdown }}
46
- {% else %}
47
- <span class="text-muted">None</span>
48
- {% endif %}
49
- </div>
50
- </div>
51
- {% endblock %}
52
-
53
- {% block content_right_page %}
54
- {% include 'panel_table.html' with table=contacts_table heading='Assigned Contacts' %}
55
- {% endblock %}
56
-
57
- {% block content_full_width_page %}
58
- {% include 'panel_table.html' with table=contact_associations_table heading='Contact For' %}
59
- {% endblock %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -2083,6 +2083,30 @@ class CustomFieldBackgroundTasks(TransactionTestCase):
2083
2083
  self.assertEqual(oc_list[0].change_context_detail, "delete custom field data")
2084
2084
  self.assertEqual(oc_list[0].user, self.user)
2085
2085
 
2086
+ def test_clear_custom_field_data_task(self):
2087
+ obj_type = ContentType.objects.get_for_model(Location)
2088
+ cf_1 = CustomField.objects.create(label="CF1", type=CustomFieldTypeChoices.TYPE_TEXT)
2089
+ cf_1.content_types.set([obj_type])
2090
+ location_type = LocationType.objects.create(name="Root Type 2")
2091
+ location_status = Status.objects.get_for_model(Location).first()
2092
+ location = Location.objects.create(
2093
+ name="Location 1",
2094
+ location_type=location_type,
2095
+ status=location_status,
2096
+ _custom_field_data={"cf1": "foo"},
2097
+ )
2098
+
2099
+ with web_request_context(self.user):
2100
+ cf_1.content_types.clear()
2101
+ location.refresh_from_db()
2102
+ self.assertNotIn("cf1", location.cf)
2103
+
2104
+ oc_list = get_changes_for_model(location)
2105
+ self.assertEqual(len(oc_list), 1)
2106
+ self.assertEqual(oc_list[0].changed_object, location)
2107
+ self.assertEqual(oc_list[0].change_context_detail, "delete custom field data from existing content types")
2108
+ self.assertEqual(oc_list[0].user, self.user)
2109
+
2086
2110
  def test_update_custom_field_choice_data_task(self):
2087
2111
  obj_type = ContentType.objects.get_for_model(Location)
2088
2112
  cf = CustomField(
@@ -1069,12 +1069,14 @@ class ExportTemplateTestCase(
1069
1069
  ViewTestCases.GetObjectViewTestCase,
1070
1070
  ViewTestCases.GetObjectChangelogViewTestCase,
1071
1071
  ViewTestCases.ListObjectsViewTestCase,
1072
+ ViewTestCases.BulkEditObjectsViewTestCase,
1072
1073
  ):
1073
1074
  model = ExportTemplate
1074
1075
 
1075
1076
  @classmethod
1076
1077
  def setUpTestData(cls):
1077
1078
  obj_type = ContentType.objects.get_for_model(Location)
1079
+ obj_type_1 = ContentType.objects.get_for_model(Interface)
1078
1080
 
1079
1081
  templates = (
1080
1082
  ExportTemplate(
@@ -1102,6 +1104,12 @@ class ExportTemplateTestCase(
1102
1104
  "content_type": obj_type.pk,
1103
1105
  "template_code": "template-4 test4",
1104
1106
  }
1107
+ cls.bulk_edit_data = {
1108
+ "content_type": obj_type_1.pk,
1109
+ "description": "Updated template description",
1110
+ "mime_type": "application/json",
1111
+ "file_extension": "json",
1112
+ }
1105
1113
 
1106
1114
 
1107
1115
  class ExternalIntegrationTestCase(ViewTestCases.PrimaryObjectViewTestCase):
@@ -3376,6 +3384,7 @@ class RelationshipTestCase(
3376
3384
  ViewTestCases.GetObjectChangelogViewTestCase,
3377
3385
  ViewTestCases.ListObjectsViewTestCase,
3378
3386
  RequiredRelationshipTestMixin,
3387
+ ViewTestCases.BulkEditObjectsViewTestCase,
3379
3388
  ):
3380
3389
  model = Relationship
3381
3390
  slug_source = "label"
@@ -3422,6 +3431,19 @@ class RelationshipTestCase(
3422
3431
  "destination_hidden": True,
3423
3432
  "destination_filter": None,
3424
3433
  }
3434
+ cls.bulk_edit_data = {
3435
+ "description": "This is a relationship between VLANs and Interfaces.",
3436
+ "type": "many-to-many",
3437
+ "source_type": vlan_type.pk,
3438
+ "source_label": "Interfaces",
3439
+ "source_hidden": False,
3440
+ "source_filter": '{"status": ["' + status.name + '"]}',
3441
+ "destination_type": interface_type.pk,
3442
+ "destination_label": "VLANs",
3443
+ "destination_hidden": True,
3444
+ "destination_filter": None,
3445
+ "advanced_ui": True,
3446
+ }
3425
3447
 
3426
3448
  cls.slug_test_object = "Primary Interface"
3427
3449
 
nautobot/extras/urls.py CHANGED
@@ -9,7 +9,6 @@ from nautobot.extras.models import (
9
9
  CustomField,
10
10
  CustomLink,
11
11
  DynamicGroup,
12
- ExportTemplate,
13
12
  GitRepository,
14
13
  GraphQLQuery,
15
14
  Job,
@@ -26,11 +25,13 @@ app_name = "extras"
26
25
  router = NautobotUIViewSetRouter()
27
26
  router.register("contacts", views.ContactUIViewSet)
28
27
  router.register("contact-associations", views.ContactAssociationUIViewSet)
28
+ router.register("export-templates", views.ExportTemplateUIViewSet)
29
29
  router.register("external-integrations", views.ExternalIntegrationUIViewSet)
30
30
  router.register("job-buttons", views.JobButtonUIViewSet)
31
31
  router.register("job-queues", views.JobQueueUIViewSet)
32
32
  router.register("metadata-types", views.MetadataTypeUIViewSet)
33
33
  router.register("object-metadata", views.ObjectMetadataUIViewSet)
34
+ router.register("relationships", views.RelationshipUIViewSet)
34
35
  router.register("roles", views.RoleUIViewSet)
35
36
  router.register("saved-views", views.SavedViewUIViewSet)
36
37
  router.register("secrets", views.SecretUIViewSet)
@@ -268,49 +269,6 @@ urlpatterns = [
268
269
  name="dynamicgroup_notes",
269
270
  kwargs={"model": DynamicGroup},
270
271
  ),
271
- # Export Templates
272
- path(
273
- "export-templates/",
274
- views.ExportTemplateListView.as_view(),
275
- name="exporttemplate_list",
276
- ),
277
- path(
278
- "export-templates/add/",
279
- views.ExportTemplateEditView.as_view(),
280
- name="exporttemplate_add",
281
- ),
282
- path(
283
- "export-templates/delete/",
284
- views.ExportTemplateBulkDeleteView.as_view(),
285
- name="exporttemplate_bulk_delete",
286
- ),
287
- path(
288
- "export-templates/<uuid:pk>/",
289
- views.ExportTemplateView.as_view(),
290
- name="exporttemplate",
291
- ),
292
- path(
293
- "export-templates/<uuid:pk>/edit/",
294
- views.ExportTemplateEditView.as_view(),
295
- name="exporttemplate_edit",
296
- ),
297
- path(
298
- "export-templates/<uuid:pk>/delete/",
299
- views.ExportTemplateDeleteView.as_view(),
300
- name="exporttemplate_delete",
301
- ),
302
- path(
303
- "export-templates/<uuid:pk>/changelog/",
304
- views.ObjectChangeLogView.as_view(),
305
- name="exporttemplate_changelog",
306
- kwargs={"model": ExportTemplate},
307
- ),
308
- path(
309
- "export-templates/<uuid:pk>/notes/",
310
- views.ObjectNotesView.as_view(),
311
- name="exporttemplate_notes",
312
- kwargs={"model": ExportTemplate},
313
- ),
314
272
  # Git repositories
315
273
  path(
316
274
  "git-repositories/",
@@ -512,32 +470,6 @@ urlpatterns = [
512
470
  path("notes/<uuid:pk>/edit/", views.NoteEditView.as_view(), name="note_edit"),
513
471
  path("notes/<uuid:pk>/delete/", views.NoteDeleteView.as_view(), name="note_delete"),
514
472
  # Custom relationships
515
- path("relationships/", views.RelationshipListView.as_view(), name="relationship_list"),
516
- path(
517
- "relationships/add/",
518
- views.RelationshipEditView.as_view(),
519
- name="relationship_add",
520
- ),
521
- path(
522
- "relationships/delete/",
523
- views.RelationshipBulkDeleteView.as_view(),
524
- name="relationship_bulk_delete",
525
- ),
526
- path(
527
- "relationships/<uuid:pk>/",
528
- views.RelationshipView.as_view(),
529
- name="relationship",
530
- ),
531
- path(
532
- "relationships/<uuid:pk>/edit/",
533
- views.RelationshipEditView.as_view(),
534
- name="relationship_edit",
535
- ),
536
- path(
537
- "relationships/<uuid:pk>/delete/",
538
- views.RelationshipDeleteView.as_view(),
539
- name="relationship_delete",
540
- ),
541
473
  path(
542
474
  "relationships/<uuid:pk>/changelog/",
543
475
  views.ObjectChangeLogView.as_view(),
nautobot/extras/views.py CHANGED
@@ -31,9 +31,10 @@ from nautobot.core.forms import restrict_form_fields
31
31
  from nautobot.core.models.querysets import count_related
32
32
  from nautobot.core.models.utils import pretty_print_query, serialize_object_v2
33
33
  from nautobot.core.tables import ButtonsColumn
34
+ from nautobot.core.templatetags import helpers
34
35
  from nautobot.core.ui import object_detail
35
36
  from nautobot.core.ui.choices import SectionChoices
36
- from nautobot.core.ui.object_detail import ObjectDetailContent, ObjectFieldsPanel
37
+ from nautobot.core.ui.object_detail import ObjectDetailContent, ObjectFieldsPanel, ObjectTextPanel
37
38
  from nautobot.core.utils.config import get_settings_or_config
38
39
  from nautobot.core.utils.lookup import (
39
40
  get_filterset_for_model,
@@ -407,22 +408,37 @@ class ContactUIViewSet(NautobotUIViewSet):
407
408
  serializer_class = serializers.ContactSerializer
408
409
  table_class = tables.ContactTable
409
410
 
410
- def get_extra_context(self, request, instance):
411
- context = super().get_extra_context(request, instance)
412
- if self.action == "retrieve":
413
- teams = instance.teams.restrict(request.user, "view")
414
- teams_table = tables.TeamTable(teams, orderable=False)
415
- teams_table.columns.hide("actions")
416
- paginate = {"paginator_class": EnhancedPaginator, "per_page": get_paginate_count(request)}
417
- RequestConfig(request, paginate).configure(teams_table)
418
- context["teams_table"] = teams_table
419
-
420
- # TODO: need some consistent ordering of contact_associations
421
- associations = instance.contact_associations.restrict(request.user, "view")
422
- associations_table = tables.ContactAssociationTable(associations, orderable=False)
423
- RequestConfig(request, paginate).configure(associations_table)
424
- context["contact_associations_table"] = associations_table
425
- return context
411
+ object_detail_content = object_detail.ObjectDetailContent(
412
+ panels=(
413
+ object_detail.ObjectFieldsPanel(
414
+ weight=100,
415
+ section=SectionChoices.LEFT_HALF,
416
+ fields="__all__",
417
+ value_transforms={
418
+ "address": [helpers.render_address],
419
+ "email": [helpers.hyperlinked_email],
420
+ "phone": [helpers.hyperlinked_phone_number],
421
+ },
422
+ ),
423
+ object_detail.ObjectsTablePanel(
424
+ weight=100,
425
+ section=SectionChoices.RIGHT_HALF,
426
+ table_class=tables.TeamTable,
427
+ table_filter="contacts",
428
+ table_title="Assigned Teams",
429
+ exclude_columns=["actions"],
430
+ add_button_route=None,
431
+ ),
432
+ object_detail.ObjectsTablePanel(
433
+ weight=200,
434
+ section=SectionChoices.FULL_WIDTH,
435
+ table_class=tables.ContactAssociationTable,
436
+ table_filter="contact",
437
+ table_title="Contact For",
438
+ add_button_route=None,
439
+ ),
440
+ ),
441
+ )
426
442
 
427
443
 
428
444
  class ContactAssociationUIViewSet(
@@ -959,30 +975,38 @@ class ObjectDynamicGroupsView(generic.GenericView):
959
975
  #
960
976
 
961
977
 
962
- class ExportTemplateListView(generic.ObjectListView):
963
- queryset = ExportTemplate.objects.all()
964
- table = tables.ExportTemplateTable
965
- filterset = filters.ExportTemplateFilterSet
966
- filterset_form = forms.ExportTemplateFilterForm
967
- action_buttons = ("add",)
968
-
969
-
970
- class ExportTemplateView(generic.ObjectView):
971
- queryset = ExportTemplate.objects.all()
972
-
973
-
974
- class ExportTemplateEditView(generic.ObjectEditView):
975
- queryset = ExportTemplate.objects.all()
976
- model_form = forms.ExportTemplateForm
977
-
978
-
979
- class ExportTemplateDeleteView(generic.ObjectDeleteView):
978
+ class ExportTemplateUIViewSet(NautobotUIViewSet):
979
+ bulk_update_form_class = forms.ExportTemplateBulkEditForm
980
+ filterset_class = filters.ExportTemplateFilterSet
981
+ filterset_form_class = forms.ExportTemplateFilterForm
982
+ form_class = forms.ExportTemplateForm
980
983
  queryset = ExportTemplate.objects.all()
984
+ serializer_class = serializers.ExportTemplateSerializer
985
+ table_class = tables.ExportTemplateTable
981
986
 
982
-
983
- class ExportTemplateBulkDeleteView(generic.BulkDeleteView):
984
- queryset = ExportTemplate.objects.all()
985
- table = tables.ExportTemplateTable
987
+ object_detail_content = ObjectDetailContent(
988
+ panels=[
989
+ ObjectFieldsPanel(
990
+ label="Details",
991
+ section=SectionChoices.LEFT_HALF,
992
+ weight=100,
993
+ fields=["name", "owner", "description"],
994
+ ),
995
+ ObjectFieldsPanel(
996
+ label="Template",
997
+ section=SectionChoices.LEFT_HALF,
998
+ weight=200,
999
+ fields=["content_type", "mime_type", "file_extension"],
1000
+ ),
1001
+ ObjectTextPanel(
1002
+ label="Code Template",
1003
+ section=SectionChoices.RIGHT_HALF,
1004
+ weight=100,
1005
+ object_field="template_code",
1006
+ render_as=ObjectTextPanel.RenderOptions.CODE,
1007
+ ),
1008
+ ]
1009
+ )
986
1010
 
987
1011
 
988
1012
  #
@@ -2403,16 +2427,15 @@ class ObjectNotesView(generic.GenericView):
2403
2427
  #
2404
2428
 
2405
2429
 
2406
- class RelationshipListView(generic.ObjectListView):
2430
+ class RelationshipUIViewSet(NautobotUIViewSet):
2431
+ bulk_update_form_class = forms.RelationshipBulkEditForm
2432
+ filterset_class = filters.RelationshipFilterSet
2433
+ filterset_form_class = forms.RelationshipFilterForm
2434
+ form_class = forms.RelationshipForm
2435
+ serializer_class = serializers.RelationshipSerializer
2436
+ table_class = tables.RelationshipTable
2407
2437
  queryset = Relationship.objects.all()
2408
- filterset = filters.RelationshipFilterSet
2409
- filterset_form = forms.RelationshipFilterForm
2410
- table = tables.RelationshipTable
2411
- action_buttons = ("add",)
2412
-
2413
2438
 
2414
- class RelationshipView(generic.ObjectView):
2415
- queryset = Relationship.objects.all()
2416
2439
  object_detail_content = ObjectDetailContent(
2417
2440
  panels=(
2418
2441
  ObjectFieldsPanel(
@@ -2447,22 +2470,6 @@ class RelationshipView(generic.ObjectView):
2447
2470
  )
2448
2471
 
2449
2472
 
2450
- class RelationshipEditView(generic.ObjectEditView):
2451
- queryset = Relationship.objects.all()
2452
- model_form = forms.RelationshipForm
2453
- template_name = "extras/relationship_edit.html"
2454
-
2455
-
2456
- class RelationshipBulkDeleteView(generic.BulkDeleteView):
2457
- queryset = Relationship.objects.all()
2458
- table = tables.RelationshipTable
2459
- filterset = filters.RelationshipFilterSet
2460
-
2461
-
2462
- class RelationshipDeleteView(generic.ObjectDeleteView):
2463
- queryset = Relationship.objects.all()
2464
-
2465
-
2466
2473
  class RelationshipAssociationListView(generic.ObjectListView):
2467
2474
  queryset = RelationshipAssociation.objects.all()
2468
2475
  filterset = filters.RelationshipAssociationFilterSet
@@ -3021,22 +3028,37 @@ class TeamUIViewSet(NautobotUIViewSet):
3021
3028
  serializer_class = serializers.TeamSerializer
3022
3029
  table_class = tables.TeamTable
3023
3030
 
3024
- def get_extra_context(self, request, instance):
3025
- context = super().get_extra_context(request, instance)
3026
- if self.action == "retrieve":
3027
- contacts = instance.contacts.restrict(request.user, "view")
3028
- contacts_table = tables.ContactTable(contacts, orderable=False)
3029
- contacts_table.columns.hide("actions")
3030
- paginate = {"paginator_class": EnhancedPaginator, "per_page": get_paginate_count(request)}
3031
- RequestConfig(request, paginate).configure(contacts_table)
3032
- context["contacts_table"] = contacts_table
3033
-
3034
- # TODO: need some consistent ordering of contact_associations
3035
- associations = instance.contact_associations.restrict(request.user, "view")
3036
- associations_table = tables.ContactAssociationTable(associations, orderable=False)
3037
- RequestConfig(request, paginate).configure(associations_table)
3038
- context["contact_associations_table"] = associations_table
3039
- return context
3031
+ object_detail_content = object_detail.ObjectDetailContent(
3032
+ panels=(
3033
+ object_detail.ObjectFieldsPanel(
3034
+ weight=100,
3035
+ section=SectionChoices.LEFT_HALF,
3036
+ fields="__all__",
3037
+ value_transforms={
3038
+ "address": [helpers.render_address],
3039
+ "email": [helpers.hyperlinked_email],
3040
+ "phone": [helpers.hyperlinked_phone_number],
3041
+ },
3042
+ ),
3043
+ object_detail.ObjectsTablePanel(
3044
+ weight=100,
3045
+ section=SectionChoices.RIGHT_HALF,
3046
+ table_class=tables.ContactTable,
3047
+ table_filter="teams",
3048
+ table_title="Assigned Contacts",
3049
+ exclude_columns=["actions"],
3050
+ add_button_route=None,
3051
+ ),
3052
+ object_detail.ObjectsTablePanel(
3053
+ weight=200,
3054
+ section=SectionChoices.FULL_WIDTH,
3055
+ table_class=tables.ContactAssociationTable,
3056
+ table_filter="team",
3057
+ table_title="Contact For",
3058
+ add_button_route=None,
3059
+ ),
3060
+ )
3061
+ )
3040
3062
 
3041
3063
 
3042
3064
  #
nautobot/ipam/tables.py CHANGED
@@ -709,6 +709,7 @@ class VLANTable(StatusTableMixin, RoleTableMixin, BaseTable):
709
709
  location_count = LinkedCountColumn(
710
710
  viewname="dcim:location_list",
711
711
  url_params={"vlans": "pk"},
712
+ display_field="name",
712
713
  verbose_name="Locations",
713
714
  )
714
715
  tenant = TenantColumn()
@@ -890,6 +890,11 @@ td span.hover_copy:hover .hover_copy_button {
890
890
  cursor: move;
891
891
  }
892
892
 
893
+ /* Make text in homepage panels selectable */
894
+ #draggable-homepage-panels .list-group-item {
895
+ user-select: text !important;
896
+ }
897
+
893
898
  /* Make panel being dragged opaque */
894
899
  .dragging {
895
900
  opacity: 0.5;
@@ -9171,8 +9171,6 @@
9171
9171
 
9172
9172
  <script src="/projects/core/en/stable/assets/javascripts/bundle.60a45f97.min.js"></script>
9173
9173
 
9174
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9175
-
9176
9174
 
9177
9175
  </body>
9178
9176
  </html>
@@ -9338,8 +9338,6 @@
9338
9338
 
9339
9339
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
9340
9340
 
9341
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9342
-
9343
9341
 
9344
9342
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9345
9343
  document$.subscribe(() => { lightbox.reload() });
@@ -9271,8 +9271,6 @@
9271
9271
 
9272
9272
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
9273
9273
 
9274
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9275
-
9276
9274
 
9277
9275
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9278
9276
  document$.subscribe(() => { lightbox.reload() });
@@ -9539,8 +9539,6 @@ Relationships, etc.</p>
9539
9539
 
9540
9540
  <script src="../../../assets/javascripts/bundle.60a45f97.min.js"></script>
9541
9541
 
9542
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9543
-
9544
9542
 
9545
9543
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9546
9544
  document$.subscribe(() => { lightbox.reload() });
@@ -9407,8 +9407,6 @@
9407
9407
 
9408
9408
  <script src="../../../assets/javascripts/bundle.60a45f97.min.js"></script>
9409
9409
 
9410
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9411
-
9412
9410
 
9413
9411
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9414
9412
  document$.subscribe(() => { lightbox.reload() });