nautobot 2.2.3__py3-none-any.whl → 2.2.5__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 (327) hide show
  1. nautobot/circuits/forms.py +15 -0
  2. nautobot/circuits/navigation.py +9 -1
  3. nautobot/circuits/views.py +2 -0
  4. nautobot/core/filters.py +11 -0
  5. nautobot/core/settings.py +6 -4
  6. nautobot/core/settings.yaml +54 -19
  7. nautobot/core/templates/admin/base.html +2 -2
  8. nautobot/core/templates/base_django.html +2 -2
  9. nautobot/core/templates/buttons/export.html +47 -47
  10. nautobot/core/templates/inc/javascript.html +3 -0
  11. nautobot/core/templates/inc/media.html +3 -0
  12. nautobot/core/templates/login.html +2 -2
  13. nautobot/core/templates/nautobot_config.py.j2 +2 -0
  14. nautobot/core/testing/filters.py +24 -1
  15. nautobot/core/testing/views.py +13 -1
  16. nautobot/core/tests/test_jobs.py +79 -2
  17. nautobot/core/tests/test_views.py +33 -0
  18. nautobot/core/views/mixins.py +4 -0
  19. nautobot/core/views/utils.py +18 -1
  20. nautobot/dcim/filters/__init__.py +1 -1
  21. nautobot/dcim/forms.py +23 -4
  22. nautobot/dcim/tables/devicetypes.py +15 -4
  23. nautobot/dcim/tests/test_views.py +323 -55
  24. nautobot/dcim/views.py +26 -20
  25. nautobot/extras/api/serializers.py +17 -6
  26. nautobot/extras/api/views.py +2 -2
  27. nautobot/extras/context_managers.py +3 -0
  28. nautobot/extras/filters/__init__.py +15 -1
  29. nautobot/extras/forms/forms.py +33 -0
  30. nautobot/extras/forms/mixins.py +0 -6
  31. nautobot/extras/signals.py +6 -1
  32. nautobot/extras/tests/test_api.py +24 -2
  33. nautobot/extras/tests/test_context_managers.py +51 -1
  34. nautobot/extras/tests/test_filters.py +69 -0
  35. nautobot/extras/tests/test_forms.py +0 -3
  36. nautobot/extras/tests/test_views.py +48 -4
  37. nautobot/extras/utils.py +2 -1
  38. nautobot/extras/views.py +47 -31
  39. nautobot/ipam/forms.py +18 -0
  40. nautobot/ipam/tests/test_views.py +9 -2
  41. nautobot/ipam/views.py +17 -6
  42. nautobot/project-static/docs/404.html +107 -51
  43. nautobot/project-static/docs/apps/index.html +107 -51
  44. nautobot/project-static/docs/apps/nautobot-apps.html +107 -51
  45. nautobot/project-static/docs/assets/_mkdocstrings.css +6 -1
  46. nautobot/project-static/docs/assets/extra.css +7 -0
  47. nautobot/project-static/docs/assets/javascripts/bundle.ebd0bdb7.min.js +29 -0
  48. nautobot/project-static/docs/assets/javascripts/bundle.ebd0bdb7.min.js.map +7 -0
  49. nautobot/project-static/docs/assets/stylesheets/main.6543a935.min.css +1 -0
  50. nautobot/project-static/docs/assets/stylesheets/main.6543a935.min.css.map +1 -0
  51. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +107 -51
  52. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +107 -51
  53. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +107 -51
  54. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +107 -51
  55. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +107 -51
  56. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +107 -51
  57. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +107 -51
  58. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +107 -51
  59. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +107 -51
  60. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +107 -51
  61. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +107 -51
  62. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +107 -51
  63. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +107 -51
  64. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +107 -51
  65. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +107 -51
  66. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +107 -51
  67. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +107 -51
  68. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +107 -51
  69. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +107 -51
  70. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +107 -51
  71. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +107 -51
  72. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +107 -51
  73. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +107 -51
  74. nautobot/project-static/docs/development/apps/api/configuration-view.html +110 -54
  75. nautobot/project-static/docs/development/apps/api/database-backend-config.html +110 -54
  76. nautobot/project-static/docs/development/apps/api/models/django-admin.html +107 -51
  77. nautobot/project-static/docs/development/apps/api/models/global-search.html +110 -54
  78. nautobot/project-static/docs/development/apps/api/models/graphql.html +113 -57
  79. nautobot/project-static/docs/development/apps/api/models/index.html +107 -51
  80. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +113 -57
  81. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +107 -51
  82. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +111 -55
  83. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +107 -51
  84. nautobot/project-static/docs/development/apps/api/platform-features/index.html +107 -51
  85. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +110 -54
  86. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +110 -54
  87. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +110 -54
  88. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +110 -54
  89. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +107 -51
  90. nautobot/project-static/docs/development/apps/api/prometheus.html +110 -54
  91. nautobot/project-static/docs/development/apps/api/setup.html +107 -51
  92. nautobot/project-static/docs/development/apps/api/testing.html +113 -57
  93. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +110 -54
  94. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +110 -54
  95. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +107 -51
  96. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +107 -51
  97. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +113 -57
  98. nautobot/project-static/docs/development/apps/api/views/base-template.html +107 -51
  99. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +110 -54
  100. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +107 -51
  101. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +110 -54
  102. nautobot/project-static/docs/development/apps/api/views/index.html +107 -51
  103. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +113 -57
  104. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +122 -66
  105. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +110 -54
  106. nautobot/project-static/docs/development/apps/api/views/notes.html +110 -54
  107. nautobot/project-static/docs/development/apps/api/views/rest-api.html +107 -51
  108. nautobot/project-static/docs/development/apps/api/views/urls.html +107 -51
  109. nautobot/project-static/docs/development/apps/index.html +128 -72
  110. nautobot/project-static/docs/development/apps/migration/code-updates.html +107 -51
  111. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +107 -51
  112. nautobot/project-static/docs/development/apps/migration/from-v1.html +109 -53
  113. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +107 -51
  114. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +107 -51
  115. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +107 -51
  116. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +107 -51
  117. nautobot/project-static/docs/development/apps/porting-from-netbox.html +110 -54
  118. nautobot/project-static/docs/development/core/application-registry.html +120 -64
  119. nautobot/project-static/docs/development/core/best-practices.html +122 -66
  120. nautobot/project-static/docs/development/core/bootstrap-ui.html +107 -51
  121. nautobot/project-static/docs/development/core/caching.html +107 -51
  122. nautobot/project-static/docs/development/core/controllers.html +107 -51
  123. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +113 -57
  124. nautobot/project-static/docs/development/core/generic-views.html +110 -54
  125. nautobot/project-static/docs/development/core/getting-started.html +137 -81
  126. nautobot/project-static/docs/development/core/homepage.html +110 -54
  127. nautobot/project-static/docs/development/core/index.html +107 -51
  128. nautobot/project-static/docs/development/core/model-checklist.html +107 -51
  129. nautobot/project-static/docs/development/core/model-features.html +107 -51
  130. nautobot/project-static/docs/development/core/natural-keys.html +110 -54
  131. nautobot/project-static/docs/development/core/navigation-menu.html +107 -51
  132. nautobot/project-static/docs/development/core/release-checklist.html +107 -51
  133. nautobot/project-static/docs/development/core/role-internals.html +107 -51
  134. nautobot/project-static/docs/development/core/settings.html +107 -51
  135. nautobot/project-static/docs/development/core/style-guide.html +110 -54
  136. nautobot/project-static/docs/development/core/templates.html +113 -57
  137. nautobot/project-static/docs/development/core/testing.html +126 -70
  138. nautobot/project-static/docs/development/core/user-preferences.html +107 -51
  139. nautobot/project-static/docs/development/index.html +107 -51
  140. nautobot/project-static/docs/development/jobs/index.html +173 -117
  141. nautobot/project-static/docs/development/jobs/migration/from-v1.html +110 -54
  142. nautobot/project-static/docs/docker/index.html +3 -3
  143. nautobot/project-static/docs/index.html +125 -69
  144. nautobot/project-static/docs/installation/selinux-troubleshooting.html +3 -3
  145. nautobot/project-static/docs/release-notes/index.html +107 -51
  146. nautobot/project-static/docs/release-notes/version-1.0.html +108 -52
  147. nautobot/project-static/docs/release-notes/version-1.1.html +107 -51
  148. nautobot/project-static/docs/release-notes/version-1.2.html +109 -53
  149. nautobot/project-static/docs/release-notes/version-1.3.html +108 -52
  150. nautobot/project-static/docs/release-notes/version-1.4.html +109 -53
  151. nautobot/project-static/docs/release-notes/version-1.5.html +118 -62
  152. nautobot/project-static/docs/release-notes/version-1.6.html +721 -285
  153. nautobot/project-static/docs/release-notes/version-2.0.html +113 -57
  154. nautobot/project-static/docs/release-notes/version-2.1.html +107 -51
  155. nautobot/project-static/docs/release-notes/version-2.2.html +503 -120
  156. nautobot/project-static/docs/requirements.txt +4 -4
  157. nautobot/project-static/docs/search/search_index.json +1 -1
  158. nautobot/project-static/docs/sitemap.xml +262 -262
  159. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  160. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +107 -51
  161. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +107 -51
  162. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +109 -53
  163. nautobot/project-static/docs/user-guide/administration/configuration/index.html +108 -52
  164. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +254 -167
  165. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +113 -57
  166. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +107 -51
  167. nautobot/project-static/docs/user-guide/administration/guides/caching.html +113 -57
  168. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +107 -51
  169. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +107 -51
  170. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +107 -51
  171. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +113 -57
  172. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +108 -52
  173. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +107 -51
  174. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +107 -51
  175. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +171 -112
  176. nautobot/project-static/docs/user-guide/administration/installation/docker.html +13 -8626
  177. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +117 -61
  178. nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +13 -8614
  179. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +252 -165
  180. nautobot/project-static/docs/user-guide/administration/installation/index.html +165 -192
  181. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +411 -691
  182. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +249 -230
  183. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +13 -8118
  184. nautobot/project-static/docs/user-guide/administration/installation/services.html +351 -241
  185. nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +8684 -0
  186. nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +8672 -0
  187. nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +8176 -0
  188. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +110 -54
  189. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +110 -54
  190. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +155 -99
  191. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +107 -51
  192. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +109 -53
  193. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +107 -51
  194. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +107 -51
  195. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +108 -52
  196. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +107 -51
  197. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +107 -51
  198. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +107 -70
  199. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +115 -59
  200. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +113 -57
  201. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +107 -51
  202. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +107 -51
  203. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +107 -51
  204. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +107 -51
  205. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +110 -54
  206. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +107 -51
  207. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +110 -54
  208. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +110 -54
  209. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +110 -54
  210. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +110 -54
  211. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +107 -51
  212. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +107 -51
  213. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +115 -59
  214. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +110 -54
  215. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +110 -54
  216. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +110 -54
  217. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +110 -54
  218. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +117 -61
  219. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +110 -54
  220. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +110 -54
  221. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +119 -63
  222. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +110 -54
  223. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +110 -54
  224. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +113 -57
  225. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +113 -57
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +113 -57
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +107 -51
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +113 -57
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +107 -51
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +110 -54
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +110 -54
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +107 -51
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +110 -54
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +110 -54
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +107 -51
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +107 -51
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +107 -51
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +110 -54
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +110 -54
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +110 -54
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +110 -54
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +107 -51
  243. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +113 -57
  244. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +110 -54
  245. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +110 -54
  246. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +110 -54
  247. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +125 -69
  248. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +113 -57
  249. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +128 -72
  250. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +110 -54
  251. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +107 -51
  252. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +110 -54
  253. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +116 -60
  254. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +107 -51
  255. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +113 -57
  256. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +107 -51
  257. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +110 -54
  258. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +107 -51
  259. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +107 -51
  260. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +107 -51
  261. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +107 -51
  262. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +113 -57
  263. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +113 -57
  264. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +107 -51
  265. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +113 -57
  266. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +110 -54
  267. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +107 -51
  268. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +107 -51
  269. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +108 -52
  270. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +107 -51
  271. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +107 -51
  272. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +107 -51
  273. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +107 -51
  274. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +108 -52
  275. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +110 -54
  276. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +113 -57
  277. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +107 -51
  278. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +110 -54
  279. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +107 -51
  280. nautobot/project-static/docs/user-guide/index.html +109 -53
  281. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +107 -51
  282. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +113 -57
  283. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +128 -72
  284. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +107 -51
  285. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +125 -69
  286. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +107 -51
  287. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +110 -54
  288. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +125 -69
  289. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +110 -54
  290. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +107 -51
  291. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +107 -51
  292. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +128 -72
  293. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +114 -58
  294. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +113 -57
  295. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +110 -54
  296. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +121 -65
  297. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +109 -53
  298. nautobot/project-static/docs/user-guide/platform-functionality/note.html +110 -54
  299. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +116 -60
  300. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +110 -54
  301. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +131 -75
  302. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +149 -93
  303. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +110 -54
  304. nautobot/project-static/docs/user-guide/platform-functionality/role.html +108 -84
  305. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +116 -60
  306. nautobot/project-static/docs/user-guide/platform-functionality/status.html +119 -63
  307. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +110 -54
  308. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +137 -81
  309. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +110 -54
  310. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +107 -51
  311. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +110 -54
  312. nautobot/project-static/js/forms.js +2 -1
  313. nautobot/tenancy/forms.py +9 -0
  314. nautobot/tenancy/views.py +3 -6
  315. nautobot/virtualization/forms.py +18 -6
  316. nautobot/virtualization/templates/virtualization/clustertype.html +2 -2
  317. nautobot/virtualization/views.py +7 -9
  318. {nautobot-2.2.3.dist-info → nautobot-2.2.5.dist-info}/METADATA +2 -2
  319. {nautobot-2.2.3.dist-info → nautobot-2.2.5.dist-info}/RECORD +323 -320
  320. nautobot/project-static/docs/assets/javascripts/bundle.bd41221c.min.js +0 -29
  321. nautobot/project-static/docs/assets/javascripts/bundle.bd41221c.min.js.map +0 -7
  322. nautobot/project-static/docs/assets/stylesheets/main.bcfcd587.min.css +0 -1
  323. nautobot/project-static/docs/assets/stylesheets/main.bcfcd587.min.css.map +0 -1
  324. {nautobot-2.2.3.dist-info → nautobot-2.2.5.dist-info}/LICENSE.txt +0 -0
  325. {nautobot-2.2.3.dist-info → nautobot-2.2.5.dist-info}/NOTICE +0 -0
  326. {nautobot-2.2.3.dist-info → nautobot-2.2.5.dist-info}/WHEEL +0 -0
  327. {nautobot-2.2.3.dist-info → nautobot-2.2.5.dist-info}/entry_points.txt +0 -0
@@ -4,9 +4,9 @@ from django.contrib.contenttypes.models import ContentType
4
4
  import yaml
5
5
 
6
6
  from nautobot.core.testing import create_job_result_and_run_job, TransactionTestCase
7
- from nautobot.dcim.models import DeviceType, Manufacturer
7
+ from nautobot.dcim.models import DeviceType, Location, LocationType, Manufacturer
8
8
  from nautobot.extras.choices import JobResultStatusChoices, LogLevelChoices
9
- from nautobot.extras.models import ExportTemplate, JobLogEntry, Status
9
+ from nautobot.extras.models import Contact, ContactAssociation, ExportTemplate, JobLogEntry, Role, Status
10
10
  from nautobot.users.models import ObjectPermission
11
11
 
12
12
 
@@ -256,3 +256,80 @@ class ImportObjectsTestCase(TransactionTestCase):
256
256
  self.assertEqual(log_successes[3].message, 'Row 5: Created record "test_status4"')
257
257
  self.assertTrue(Status.objects.filter(name="test_status4").exists())
258
258
  self.assertEqual(log_successes[4].message, "Created 4 status object(s) from 5 row(s) of data")
259
+
260
+ def test_csv_import_contact_assignment(self):
261
+ location_types_csv = "\n".join(["name", "ContactAssignmentImportTestLocationType"])
262
+ locations_csv = "\n".join(
263
+ [
264
+ "location_type__name,name,status__name",
265
+ "ContactAssignmentImportTestLocationType,ContactAssignmentImportTestLocation1,Active",
266
+ "ContactAssignmentImportTestLocationType,ContactAssignmentImportTestLocation2,Active",
267
+ ]
268
+ )
269
+ roles_csv = "\n".join(
270
+ [
271
+ "name,content_types",
272
+ "ContactAssignmentImportTestLocation-On Site,extras.contactassociation",
273
+ ]
274
+ )
275
+ contacts_csv = "\n".join(["name,email", "Bob-ContactAssignmentImportTestLocation,bob@example.com"])
276
+
277
+ location_types_job_result = create_job_result_and_run_job(
278
+ "nautobot.core.jobs",
279
+ "ImportObjects",
280
+ content_type=ContentType.objects.get_for_model(LocationType).pk,
281
+ csv_data=location_types_csv,
282
+ )
283
+ self.assertEqual(location_types_job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
284
+
285
+ location_type_count = LocationType.objects.filter(name="ContactAssignmentImportTestLocationType").count()
286
+ self.assertEqual(location_type_count, 1, f"Unexpected count of LocationTypes {location_type_count}")
287
+
288
+ locations_job_result = create_job_result_and_run_job(
289
+ "nautobot.core.jobs",
290
+ "ImportObjects",
291
+ content_type=ContentType.objects.get_for_model(Location).pk,
292
+ csv_data=locations_csv,
293
+ )
294
+ self.assertEqual(locations_job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
295
+
296
+ location_count = Location.objects.filter(location_type__name="ContactAssignmentImportTestLocationType").count()
297
+ self.assertEqual(location_count, 2, f"Unexpected count of Locations {location_count}")
298
+
299
+ contacts_job_result = create_job_result_and_run_job(
300
+ "nautobot.core.jobs",
301
+ "ImportObjects",
302
+ content_type=ContentType.objects.get_for_model(Contact).pk,
303
+ csv_data=contacts_csv,
304
+ )
305
+ self.assertEqual(contacts_job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
306
+
307
+ contact_count = Contact.objects.filter(name="Bob-ContactAssignmentImportTestLocation").count()
308
+ self.assertEqual(contact_count, 1, f"Unexpected number of contacts {contact_count}")
309
+
310
+ roles_job_result = create_job_result_and_run_job(
311
+ "nautobot.core.jobs",
312
+ "ImportObjects",
313
+ content_type=ContentType.objects.get_for_model(Role).pk,
314
+ csv_data=roles_csv,
315
+ )
316
+ self.assertEqual(roles_job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
317
+
318
+ role_count = Role.objects.filter(name="ContactAssignmentImportTestLocation-On Site").count()
319
+ self.assertEqual(role_count, 1, f"Unexpected number of role values {role_count}")
320
+
321
+ associations = ["associated_object_id,associated_object_type,status__name,role__name,contact__name"]
322
+ for location in Location.objects.filter(location_type__name="ContactAssignmentImportTestLocationType"):
323
+ associations.append(
324
+ f"{location.pk},dcim.location,Active,ContactAssignmentImportTestLocation-On Site,Bob-ContactAssignmentImportTestLocation"
325
+ )
326
+ associations_csv = "\n".join(associations)
327
+
328
+ associations_job_result = create_job_result_and_run_job(
329
+ "nautobot.core.jobs",
330
+ "ImportObjects",
331
+ content_type=ContentType.objects.get_for_model(ContactAssociation).pk,
332
+ csv_data=associations_csv,
333
+ )
334
+
335
+ self.assertEqual(associations_job_result.status, JobResultStatusChoices.STATUS_SUCCESS)
@@ -146,6 +146,39 @@ class HomeViewTestCase(TestCase):
146
146
  response_content = response.content.decode(response.charset).replace("\n", "")
147
147
  self.assertNotRegex(response_content, footer_hostname_version_pattern)
148
148
 
149
+ def test_banners_markdown(self):
150
+ url = reverse("home")
151
+ with override_settings(
152
+ BANNER_TOP="# Hello world",
153
+ BANNER_BOTTOM="[info](https://nautobot.com)",
154
+ ):
155
+ response = self.client.get(url)
156
+ self.assertInHTML("<h1>Hello world</h1>", response.content.decode(response.charset))
157
+ self.assertInHTML(
158
+ '<a href="https://nautobot.com" rel="noopener noreferrer">info</a>',
159
+ response.content.decode(response.charset),
160
+ )
161
+
162
+ with override_settings(BANNER_LOGIN="_Welcome to Nautobot!_"):
163
+ self.client.logout()
164
+ response = self.client.get(reverse("login"))
165
+ self.assertInHTML("<em>Welcome to Nautobot!</em>", response.content.decode(response.charset))
166
+
167
+ def test_banners_no_xss(self):
168
+ url = reverse("home")
169
+ with override_settings(
170
+ BANNER_TOP='<script>alert("Hello from above!");</script>',
171
+ BANNER_BOTTOM='<script>alert("Hello from below!");</script>',
172
+ ):
173
+ response = self.client.get(url)
174
+ self.assertNotIn("Hello from above", response.content.decode(response.charset))
175
+ self.assertNotIn("Hello from below", response.content.decode(response.charset))
176
+
177
+ with override_settings(BANNER_LOGIN='<script>alert("Welcome to Nautobot!");</script>'):
178
+ self.client.logout()
179
+ response = self.client.get(reverse("login"))
180
+ self.assertNotIn("Welcome to Nautobot!", response.content.decode(response.charset))
181
+
149
182
 
150
183
  @override_settings(BRANDING_TITLE="Nautobot")
151
184
  class SearchFieldsTestCase(TestCase):
@@ -485,6 +485,10 @@ class NautobotViewSetMixin(GenericViewSet, AccessMixin, GetReturnURLMixin, FormV
485
485
  request: The current request
486
486
  instance: The object being viewed
487
487
  """
488
+ if instance is not None:
489
+ return {
490
+ "active_tab": request.GET.get("tab", "main"),
491
+ }
488
492
  return {}
489
493
 
490
494
  def get_template_name(self):
@@ -215,11 +215,28 @@ def handle_protectederror(obj_list, request, e):
215
215
  protected_count,
216
216
  )
217
217
 
218
+ # Format objects based on whether they have a detail view/absolute url
219
+ objects_with_absolute_url = []
220
+ objects_without_absolute_url = []
218
221
  # Append dependent objects to error message
222
+ for dependent in protected_objects[:50]:
223
+ try:
224
+ dependent.get_absolute_url()
225
+ objects_with_absolute_url.append(dependent)
226
+ except AttributeError:
227
+ objects_without_absolute_url.append(dependent)
228
+
219
229
  err_message += format_html_join(
220
230
  ", ",
221
231
  '<a href="{}">{}</a>',
222
- ((dependent.get_absolute_url(), dependent) for dependent in protected_objects[:50]),
232
+ ((dependent.get_absolute_url(), dependent) for dependent in objects_with_absolute_url),
233
+ )
234
+ if objects_with_absolute_url and objects_without_absolute_url:
235
+ err_message += format_html(", ")
236
+ err_message += format_html_join(
237
+ ", ",
238
+ "<span>{}</span>",
239
+ ((dependent,) for dependent in objects_without_absolute_url),
223
240
  )
224
241
 
225
242
  messages.error(request, err_message)
@@ -102,13 +102,13 @@ __all__ = (
102
102
  "ControllerManagedDeviceGroupFilterSet",
103
103
  "DeviceBayFilterSet",
104
104
  "DeviceBayTemplateFilterSet",
105
+ "DeviceFamilyFilterSet",
105
106
  "DeviceFilterSet",
106
107
  "DeviceRedundancyGroupFilterSet",
107
108
  "DeviceTypeFilterSet",
108
109
  "DeviceTypeToSoftwareImageFileFilterSet",
109
110
  "FrontPortFilterSet",
110
111
  "FrontPortTemplateFilterSet",
111
- "DeviceFamilyFilterSet",
112
112
  "InterfaceConnectionFilterSet",
113
113
  "InterfaceFilterSet",
114
114
  "InterfaceRedundancyGroupFilterSet",
nautobot/dcim/forms.py CHANGED
@@ -728,6 +728,15 @@ class ManufacturerForm(NautobotModelForm):
728
728
  ]
729
729
 
730
730
 
731
+ class ManufacturerFilterForm(NautobotFilterForm):
732
+ model = Manufacturer
733
+ q = forms.CharField(required=False, label="Search")
734
+ device_types = DynamicModelMultipleChoiceField(
735
+ queryset=DeviceType.objects.all(), to_field_name="model", required=False
736
+ )
737
+ platforms = DynamicModelMultipleChoiceField(queryset=Platform.objects.all(), to_field_name="name", required=False)
738
+
739
+
731
740
  #
732
741
  # Device Family
733
742
  #
@@ -745,6 +754,9 @@ class DeviceFamilyForm(NautobotModelForm):
745
754
  class DeviceFamilyFilterForm(NautobotFilterForm):
746
755
  model = DeviceFamily
747
756
  q = forms.CharField(required=False, label="Search")
757
+ device_types = DynamicModelMultipleChoiceField(
758
+ queryset=DeviceType.objects.all(), to_field_name="model", required=False
759
+ )
748
760
  tags = TagFilterField(model)
749
761
 
750
762
 
@@ -1582,6 +1594,13 @@ class PlatformForm(NautobotModelForm):
1582
1594
  }
1583
1595
 
1584
1596
 
1597
+ class PlatformFilterForm(NautobotFilterForm):
1598
+ model = Platform
1599
+ q = forms.CharField(required=False, label="Search")
1600
+ name = forms.CharField(required=False)
1601
+ network_driver = forms.CharField(required=False)
1602
+
1603
+
1585
1604
  #
1586
1605
  # Devices
1587
1606
  #
@@ -2567,14 +2586,14 @@ class InterfaceBulkEditForm(
2567
2586
  queryset=VLAN.objects.all(),
2568
2587
  required=False,
2569
2588
  query_params={
2570
- "location": "null",
2589
+ "locations": "null",
2571
2590
  },
2572
2591
  )
2573
2592
  tagged_vlans = DynamicModelMultipleChoiceField(
2574
2593
  queryset=VLAN.objects.all(),
2575
2594
  required=False,
2576
2595
  query_params={
2577
- "location": "null",
2596
+ "locations": "null",
2578
2597
  },
2579
2598
  )
2580
2599
  vrf = DynamicModelChoiceField(
@@ -2618,8 +2637,8 @@ class InterfaceBulkEditForm(
2618
2637
  # Limit VLAN choices by Location
2619
2638
  if locations.count() == 1:
2620
2639
  location = locations.first()
2621
- self.fields["untagged_vlan"].widget.add_query_param("location", location.pk)
2622
- self.fields["tagged_vlans"].widget.add_query_param("location", location.pk)
2640
+ self.fields["untagged_vlan"].widget.add_query_param("locations", location.pk)
2641
+ self.fields["tagged_vlans"].widget.add_query_param("locations", location.pk)
2623
2642
 
2624
2643
  # Restrict parent/bridge/LAG interface assignment by device (or VC master)
2625
2644
  if device_count == 1:
@@ -45,9 +45,15 @@ __all__ = (
45
45
  class ManufacturerTable(BaseTable):
46
46
  pk = ToggleColumn()
47
47
  name = tables.LinkColumn()
48
- device_type_count = tables.Column(verbose_name="Device Types")
49
- inventory_item_count = tables.Column(verbose_name="Inventory Items")
50
- platform_count = tables.Column(verbose_name="Platforms")
48
+ device_type_count = LinkedCountColumn(
49
+ viewname="dcim:devicetype_list", url_params={"manufacturer": "name"}, verbose_name="Device Types"
50
+ )
51
+ inventory_item_count = LinkedCountColumn(
52
+ viewname="dcim:inventoryitem_list", url_params={"manufacturer": "name"}, verbose_name="Inventory Items"
53
+ )
54
+ platform_count = LinkedCountColumn(
55
+ viewname="dcim:platform_list", url_params={"manufacturer": "name"}, verbose_name="Platforms"
56
+ )
51
57
  actions = ButtonsColumn(Manufacturer)
52
58
 
53
59
  class Meta(BaseTable.Meta):
@@ -71,7 +77,9 @@ class ManufacturerTable(BaseTable):
71
77
  class DeviceFamilyTable(BaseTable):
72
78
  pk = ToggleColumn()
73
79
  name = tables.Column(linkify=True)
74
- device_type_count = tables.Column(verbose_name="Device Types")
80
+ device_type_count = LinkedCountColumn(
81
+ viewname="dcim:devicetype_list", url_params={"device_family": "name"}, verbose_name="Device Types"
82
+ )
75
83
  actions = ButtonsColumn(DeviceFamily)
76
84
  tags = TagColumn(url_name="dcim:devicefamily_list")
77
85
 
@@ -95,6 +103,8 @@ class DeviceFamilyTable(BaseTable):
95
103
  class DeviceTypeTable(BaseTable):
96
104
  pk = ToggleColumn()
97
105
  model = tables.Column(linkify=True, verbose_name="Device Type")
106
+ manufacturer = tables.Column(linkify=True)
107
+ device_family = tables.Column(linkify=True)
98
108
  is_full_depth = BooleanColumn(verbose_name="Full Depth")
99
109
  device_count = LinkedCountColumn(
100
110
  viewname="dcim:device_list",
@@ -109,6 +119,7 @@ class DeviceTypeTable(BaseTable):
109
119
  "pk",
110
120
  "model",
111
121
  "manufacturer",
122
+ "device_family",
112
123
  "part_number",
113
124
  "u_height",
114
125
  "is_full_depth",