nautobot 2.3.6__py3-none-any.whl → 2.3.8__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 (336) hide show
  1. nautobot/__init__.py +4 -2
  2. nautobot/circuits/tests/test_views.py +4 -5
  3. nautobot/core/api/views.py +15 -3
  4. nautobot/core/templates/inc/javascript.html +2 -0
  5. nautobot/core/templates/inc/nav_menu.html +0 -251
  6. nautobot/core/templates/inc/paginator.html +3 -0
  7. nautobot/core/templates/utilities/obj_table.html +1 -1
  8. nautobot/core/testing/mixins.py +59 -2
  9. nautobot/core/testing/views.py +45 -61
  10. nautobot/core/tests/runner.py +6 -3
  11. nautobot/core/tests/test_paginator.py +4 -3
  12. nautobot/core/tests/test_views.py +39 -56
  13. nautobot/core/views/__init__.py +27 -11
  14. nautobot/dcim/api/serializers.py +10 -5
  15. nautobot/dcim/forms.py +11 -7
  16. nautobot/dcim/models/device_components.py +7 -4
  17. nautobot/dcim/tests/test_api.py +28 -0
  18. nautobot/dcim/tests/test_forms.py +17 -1
  19. nautobot/dcim/tests/test_models.py +42 -4
  20. nautobot/dcim/tests/test_views.py +26 -67
  21. nautobot/dcim/utils.py +9 -6
  22. nautobot/extras/datasources/git.py +6 -1
  23. nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +3 -0
  24. nautobot/extras/migrations/0116_fix_dynamic_group_group_type_data_migration.py +16 -0
  25. nautobot/extras/plugins/views.py +18 -3
  26. nautobot/extras/tests/test_customfields.py +9 -16
  27. nautobot/extras/tests/test_dynamicgroups.py +116 -0
  28. nautobot/extras/tests/test_plugins.py +4 -6
  29. nautobot/extras/tests/test_utils.py +5 -0
  30. nautobot/extras/tests/test_views.py +61 -159
  31. nautobot/extras/utils.py +50 -11
  32. nautobot/ipam/filters.py +2 -2
  33. nautobot/ipam/models.py +29 -2
  34. nautobot/ipam/templates/ipam/ipaddress.html +2 -2
  35. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +3 -0
  36. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +3 -0
  37. nautobot/ipam/templates/ipam/prefix.html +3 -3
  38. nautobot/ipam/templates/ipam/routetarget.html +2 -2
  39. nautobot/ipam/templates/ipam/vlan.html +3 -0
  40. nautobot/ipam/templates/ipam/vrf.html +7 -4
  41. nautobot/ipam/tests/test_api.py +18 -12
  42. nautobot/ipam/tests/test_models.py +68 -12
  43. nautobot/ipam/tests/test_views.py +6 -15
  44. nautobot/ipam/views.py +43 -0
  45. nautobot/project-static/docs/404.html +3 -3
  46. nautobot/project-static/docs/apps/index.html +3 -3
  47. nautobot/project-static/docs/apps/nautobot-apps.html +3 -3
  48. nautobot/project-static/docs/assets/javascripts/bundle.525ec568.min.js +16 -0
  49. nautobot/project-static/docs/assets/javascripts/{bundle.56dfad97.min.js.map → bundle.525ec568.min.js.map} +4 -4
  50. nautobot/project-static/docs/assets/stylesheets/main.8c3ca2c6.min.css +1 -0
  51. nautobot/project-static/docs/assets/stylesheets/main.8c3ca2c6.min.css.map +1 -0
  52. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +3 -3
  53. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +3 -3
  54. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +3 -3
  55. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +3 -3
  56. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +3 -3
  57. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +3 -3
  58. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +3 -3
  59. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +3 -3
  60. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +3 -3
  61. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +3 -3
  62. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +3 -3
  63. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +3 -3
  64. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +3 -3
  65. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +3 -3
  66. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +3 -3
  67. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +3 -3
  68. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +3 -3
  69. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +3 -3
  70. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +124 -3
  71. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +3 -3
  72. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +3 -3
  73. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +3 -3
  74. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3 -3
  75. nautobot/project-static/docs/development/apps/api/configuration-view.html +3 -3
  76. nautobot/project-static/docs/development/apps/api/database-backend-config.html +3 -3
  77. nautobot/project-static/docs/development/apps/api/models/django-admin.html +3 -3
  78. nautobot/project-static/docs/development/apps/api/models/global-search.html +3 -3
  79. nautobot/project-static/docs/development/apps/api/models/graphql.html +3 -3
  80. nautobot/project-static/docs/development/apps/api/models/index.html +3 -3
  81. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +3 -3
  82. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +3 -3
  83. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +3 -3
  84. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +3 -3
  85. nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -3
  86. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +3 -3
  87. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +3 -3
  88. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +3 -3
  89. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +3 -3
  90. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +3 -3
  91. nautobot/project-static/docs/development/apps/api/prometheus.html +3 -3
  92. nautobot/project-static/docs/development/apps/api/setup.html +3 -3
  93. nautobot/project-static/docs/development/apps/api/testing.html +3 -3
  94. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +3 -3
  95. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +3 -3
  96. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +3 -3
  97. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +3 -3
  98. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +3 -3
  99. nautobot/project-static/docs/development/apps/api/views/base-template.html +3 -3
  100. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +3 -3
  101. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +3 -3
  102. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +3 -3
  103. nautobot/project-static/docs/development/apps/api/views/index.html +3 -3
  104. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +3 -3
  105. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +3 -3
  106. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +3 -3
  107. nautobot/project-static/docs/development/apps/api/views/notes.html +3 -3
  108. nautobot/project-static/docs/development/apps/api/views/rest-api.html +3 -3
  109. nautobot/project-static/docs/development/apps/api/views/urls.html +3 -3
  110. nautobot/project-static/docs/development/apps/index.html +3 -3
  111. nautobot/project-static/docs/development/apps/migration/code-updates.html +3 -3
  112. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +3 -3
  113. nautobot/project-static/docs/development/apps/migration/from-v1.html +3 -3
  114. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +3 -3
  115. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +3 -3
  116. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +3 -3
  117. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +3 -3
  118. nautobot/project-static/docs/development/apps/porting-from-netbox.html +3 -3
  119. nautobot/project-static/docs/development/core/application-registry.html +3 -3
  120. nautobot/project-static/docs/development/core/best-practices.html +3 -3
  121. nautobot/project-static/docs/development/core/bootstrap-ui.html +3 -3
  122. nautobot/project-static/docs/development/core/caching.html +3 -3
  123. nautobot/project-static/docs/development/core/controllers.html +3 -3
  124. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +3 -3
  125. nautobot/project-static/docs/development/core/generic-views.html +3 -3
  126. nautobot/project-static/docs/development/core/getting-started.html +3 -3
  127. nautobot/project-static/docs/development/core/homepage.html +3 -3
  128. nautobot/project-static/docs/development/core/index.html +3 -3
  129. nautobot/project-static/docs/development/core/model-checklist.html +3 -3
  130. nautobot/project-static/docs/development/core/model-features.html +3 -3
  131. nautobot/project-static/docs/development/core/natural-keys.html +3 -3
  132. nautobot/project-static/docs/development/core/navigation-menu.html +3 -3
  133. nautobot/project-static/docs/development/core/release-checklist.html +3 -3
  134. nautobot/project-static/docs/development/core/role-internals.html +3 -3
  135. nautobot/project-static/docs/development/core/settings.html +3 -3
  136. nautobot/project-static/docs/development/core/style-guide.html +3 -3
  137. nautobot/project-static/docs/development/core/templates.html +3 -3
  138. nautobot/project-static/docs/development/core/testing.html +3 -3
  139. nautobot/project-static/docs/development/core/user-preferences.html +3 -3
  140. nautobot/project-static/docs/development/index.html +3 -3
  141. nautobot/project-static/docs/development/jobs/index.html +3 -3
  142. nautobot/project-static/docs/development/jobs/migration/from-v1.html +3 -3
  143. nautobot/project-static/docs/index.html +3 -3
  144. nautobot/project-static/docs/objects.inv +0 -0
  145. nautobot/project-static/docs/overview/application_stack.html +3 -3
  146. nautobot/project-static/docs/overview/design_philosophy.html +3 -3
  147. nautobot/project-static/docs/release-notes/index.html +3 -3
  148. nautobot/project-static/docs/release-notes/version-1.0.html +3 -3
  149. nautobot/project-static/docs/release-notes/version-1.1.html +3 -3
  150. nautobot/project-static/docs/release-notes/version-1.2.html +3 -3
  151. nautobot/project-static/docs/release-notes/version-1.3.html +3 -3
  152. nautobot/project-static/docs/release-notes/version-1.4.html +3 -3
  153. nautobot/project-static/docs/release-notes/version-1.5.html +3 -3
  154. nautobot/project-static/docs/release-notes/version-1.6.html +3 -3
  155. nautobot/project-static/docs/release-notes/version-2.0.html +3 -3
  156. nautobot/project-static/docs/release-notes/version-2.1.html +3 -3
  157. nautobot/project-static/docs/release-notes/version-2.2.html +3 -3
  158. nautobot/project-static/docs/release-notes/version-2.3.html +304 -96
  159. nautobot/project-static/docs/requirements.txt +1 -1
  160. nautobot/project-static/docs/search/search_index.json +1 -1
  161. nautobot/project-static/docs/sitemap.xml +269 -269
  162. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  163. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +3 -3
  164. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +3 -3
  165. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +3 -3
  166. nautobot/project-static/docs/user-guide/administration/configuration/index.html +3 -3
  167. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +3 -3
  168. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +3 -3
  169. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +3 -3
  170. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +3 -3
  171. nautobot/project-static/docs/user-guide/administration/guides/docker.html +3 -3
  172. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +3 -3
  173. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +3 -3
  174. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +3 -3
  175. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +3 -3
  176. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +3 -3
  177. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +3 -3
  178. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +3 -3
  179. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +3 -3
  180. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +3 -3
  181. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -3
  182. nautobot/project-static/docs/user-guide/administration/installation/index.html +3 -3
  183. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +3 -3
  184. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +3 -3
  185. nautobot/project-static/docs/user-guide/administration/installation/services.html +3 -3
  186. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +3 -3
  187. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -3
  188. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +3 -3
  189. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +3 -3
  190. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +3 -3
  191. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +3 -3
  192. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +3 -3
  193. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +3 -3
  194. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +3 -3
  195. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +3 -3
  196. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +3 -3
  197. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +3 -3
  198. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +3 -3
  199. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +3 -3
  200. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +3 -3
  201. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +3 -3
  202. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +3 -3
  203. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +3 -3
  204. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +3 -3
  205. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +3 -3
  206. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +3 -3
  207. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +3 -3
  208. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +3 -3
  209. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +3 -3
  210. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +3 -3
  211. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +3 -3
  212. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +3 -3
  213. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +3 -3
  214. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +3 -3
  215. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +3 -3
  216. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +3 -3
  217. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +3 -3
  218. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +3 -3
  219. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +3 -3
  220. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +3 -3
  221. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +3 -3
  222. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +3 -3
  223. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +3 -3
  224. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +3 -3
  225. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +3 -3
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +3 -3
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +3 -3
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +3 -3
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +3 -3
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +3 -3
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +3 -3
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +3 -3
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +3 -3
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +3 -3
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +3 -3
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +3 -3
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +3 -3
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +3 -3
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +3 -3
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +3 -3
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +3 -3
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +3 -3
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +3 -3
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +3 -3
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +3 -3
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +3 -3
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +3 -3
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +3 -3
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +3 -3
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +3 -3
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +3 -3
  252. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +3 -3
  253. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +3 -3
  254. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +3 -3
  255. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +3 -3
  256. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +3 -3
  257. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +3 -3
  258. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +3 -3
  259. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +3 -3
  260. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +3 -3
  261. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +3 -3
  262. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +3 -3
  263. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +3 -3
  264. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +3 -3
  265. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +3 -3
  266. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +3 -3
  267. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +3 -3
  268. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +3 -3
  269. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +3 -3
  270. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +3 -3
  271. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +3 -3
  272. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +3 -3
  273. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +3 -3
  274. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +3 -3
  275. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +3 -3
  276. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +3 -3
  277. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +3 -3
  278. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +3 -3
  279. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +3 -3
  280. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +3 -3
  281. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +3 -3
  282. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +3 -3
  283. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +3 -3
  284. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +3 -3
  285. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +3 -3
  286. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +3 -3
  287. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +3 -3
  288. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +3 -3
  289. nautobot/project-static/docs/user-guide/index.html +3 -3
  290. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +3 -3
  291. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +3 -3
  292. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -3
  293. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +3 -3
  294. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +3 -3
  295. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +3 -3
  296. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +3 -3
  297. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +3 -3
  298. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +3 -3
  299. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +3 -3
  300. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +3 -3
  301. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +3 -3
  302. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +3 -3
  303. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +3 -3
  304. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +3 -3
  305. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +3 -3
  306. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +3 -3
  307. nautobot/project-static/docs/user-guide/platform-functionality/note.html +3 -3
  308. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +3 -3
  309. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +3 -3
  310. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +3 -3
  311. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +3 -3
  312. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +3 -3
  313. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +3 -3
  314. nautobot/project-static/docs/user-guide/platform-functionality/role.html +3 -3
  315. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +3 -3
  316. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -3
  317. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +3 -3
  318. nautobot/project-static/docs/user-guide/platform-functionality/status.html +3 -3
  319. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +3 -3
  320. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +3 -3
  321. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +3 -3
  322. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +3 -3
  323. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +3 -3
  324. nautobot/project-static/js/nav_menu.js +249 -0
  325. nautobot/tenancy/templates/tenancy/tenant.html +1 -1
  326. nautobot/users/tests/test_views.py +9 -11
  327. nautobot/virtualization/tests/test_views.py +3 -5
  328. {nautobot-2.3.6.dist-info → nautobot-2.3.8.dist-info}/METADATA +2 -1
  329. {nautobot-2.3.6.dist-info → nautobot-2.3.8.dist-info}/RECORD +333 -331
  330. {nautobot-2.3.6.dist-info → nautobot-2.3.8.dist-info}/WHEEL +1 -1
  331. nautobot/project-static/docs/assets/javascripts/bundle.56dfad97.min.js +0 -16
  332. nautobot/project-static/docs/assets/stylesheets/main.35f28582.min.css +0 -1
  333. nautobot/project-static/docs/assets/stylesheets/main.35f28582.min.css.map +0 -1
  334. {nautobot-2.3.6.dist-info → nautobot-2.3.8.dist-info}/LICENSE.txt +0 -0
  335. {nautobot-2.3.6.dist-info → nautobot-2.3.8.dist-info}/NOTICE +0 -0
  336. {nautobot-2.3.6.dist-info → nautobot-2.3.8.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,249 @@
1
+ document.addEventListener('DOMContentLoaded', function() {
2
+ const navbar = document.querySelector('.navbar-fixed-left');
3
+ const navbarHeader = document.querySelector('.navbar-header');
4
+ const mainContent = document.querySelector('#main-content');
5
+ const footer = document.querySelector('#footer');
6
+ const dropdownToggles = document.querySelectorAll('.navbar-fixed-left .navbar-nav > .dropdown > a[data-toggle="collapse"]');
7
+ const dropdowns = document.querySelectorAll('.navbar-fixed-left .navbar-nav .collapse');
8
+ const toggler = document.querySelector('.navbar-toggler');
9
+ const togglerIcon = toggler.querySelector('.navbar-toggler-arrow');
10
+ let lastDropdownId = sessionStorage.getItem('lastOpenedDropdown');
11
+ let savedScrollPosition = sessionStorage.getItem('navbarScrollPosition');
12
+ let activeLink = sessionStorage.getItem('activeLink');
13
+ let expandedByHover = false;
14
+ let manuallyToggled = sessionStorage.getItem('manuallyToggled') === 'true';
15
+
16
+ // Function to reset stored dropdown state information
17
+ function resetNavbarState() {
18
+ sessionStorage.removeItem('lastOpenedDropdown');
19
+ sessionStorage.removeItem('savedScrollPosition');
20
+ sessionStorage.removeItem('activeLink');
21
+ sessionStorage.removeItem('navbarCollapsed');
22
+ expandedByHover = false;
23
+ }
24
+
25
+ toggler.addEventListener('click', function() {
26
+ let isNowCollapsed;
27
+ if (expandedByHover) {
28
+ expandedByHover = false;
29
+ isNowCollapsed = false;
30
+ } else {
31
+ isNowCollapsed = navbar.classList.toggle('collapsed');
32
+ }
33
+ sessionStorage.setItem('navbarCollapsed', isNowCollapsed ? 'true' : 'false');
34
+ // Set 'navbarManuallyToggled' to track any manual toggle
35
+ sessionStorage.setItem('navbarManuallyToggled', 'true');
36
+ // Track if the action was an expansion or a collapse
37
+ sessionStorage.setItem('navbarExpanded', !isNowCollapsed ? 'true' : 'false');
38
+ if (isNowCollapsed) {
39
+ togglerIcon.classList.add("mdi-rotate-90");
40
+ togglerIcon.classList.remove("mdi-rotate-270");
41
+ } else {
42
+ togglerIcon.classList.remove("mdi-rotate-90");
43
+ togglerIcon.classList.add("mdi-rotate-270");
44
+ }
45
+ adjustElementsForNavbarState(isNowCollapsed);
46
+ });
47
+
48
+ // Retrieve the navbar collapsed state from session storage on page load
49
+ const navbarCollapsed = sessionStorage.getItem('navbarCollapsed') === 'true';
50
+ if (navbarCollapsed) {
51
+ navbar.classList.add('collapsed');
52
+ togglerIcon.classList.remove("mdi-rotate-270");
53
+ togglerIcon.classList.add("mdi-rotate-90");
54
+ adjustElementsForNavbarState(true);
55
+ }
56
+
57
+ function adjustElementsForNavbarState(isCollapsed) {
58
+ const marginLeftValue = isCollapsed ? '-240px' : '0px';
59
+ mainContent.style.marginLeft = marginLeftValue;
60
+ if(footer) footer.style.marginLeft = marginLeftValue;
61
+ toggler.style.left = isCollapsed ? '-5px' : '225px';
62
+ }
63
+
64
+ // Expand navbar when hovering near the left edge of the screen
65
+ document.addEventListener('mousemove', function(e) {
66
+ if (
67
+ e.clientX < 20 // 20px from the left edge
68
+ && (e.clientY < 20 || e.clientY > 50) // not near the toggle button
69
+ && navbar.classList.contains('collapsed')
70
+ ) {
71
+ navbar.classList.remove('collapsed');
72
+ toggler.style.left = '225px';
73
+ expandedByHover = true; // Set flag when expanded by hover
74
+ } else if (expandedByHover && e.clientX > 240) {
75
+ navbar.classList.add('collapsed');
76
+ toggler.style.left = '-5px';
77
+ expandedByHover = false; // Reset flag after auto-collapse
78
+ }
79
+ });
80
+
81
+ function collapseNavbarIfNeeded() {
82
+ const windowWidth = window.innerWidth;
83
+ const navbarManuallyToggled = sessionStorage.getItem('navbarManuallyToggled') === 'true';
84
+ const navbarExpanded = sessionStorage.getItem('navbarExpanded') === 'true';
85
+ const isCollapsed = navbar.classList.contains('collapsed');
86
+
87
+ if (windowWidth < 1007) {
88
+ if (!isCollapsed) {
89
+ navbar.classList.add('collapsed');
90
+ togglerIcon.classList.remove("mdi-rotate-270");
91
+ togglerIcon.classList.add("mdi-rotate-90");
92
+ adjustElementsForNavbarState(true);
93
+ sessionStorage.setItem('navbarCollapsed', 'true');
94
+ }
95
+ } else if (windowWidth >= 1007) {
96
+ // Only expand automatically if it was not manually collapsed
97
+ if (isCollapsed && (navbarManuallyToggled && navbarExpanded)) {
98
+ navbar.classList.remove('collapsed');
99
+ togglerIcon.classList.add("mdi-rotate-270");
100
+ togglerIcon.classList.remove("mdi-rotate-90");
101
+ adjustElementsForNavbarState(false);
102
+ sessionStorage.setItem('navbarCollapsed', 'false');
103
+ }
104
+ // Do not automatically change the state if it was manually collapsed
105
+ }
106
+ }
107
+
108
+ // Update the window resize listener
109
+ function toggleNavbarOnResize() {
110
+ collapseNavbarIfNeeded(); // Use the new function to decide whether to collapse
111
+ }
112
+
113
+ let debouncedToggleNavbarOnResize = debounce(toggleNavbarOnResize, 50);
114
+ window.addEventListener('resize', debouncedToggleNavbarOnResize);
115
+
116
+ // Select the navbar dropdown elements
117
+ let navbarItems = document.querySelectorAll('.navbar-fixed-left .navbar-nav > .dropdown > .dropdown-toggle > #dropdown_title');
118
+
119
+ // Add a title attribute and tooltip, only if necessary
120
+ navbarItems.forEach(function(item) {
121
+ // Check if the text overflows
122
+ if (item.scrollWidth > item.clientWidth) {
123
+ // Set the title attribute
124
+ item.setAttribute('title', item.innerText);
125
+
126
+ // Reinitialize Bootstrap tooltip
127
+ $(item).tooltip();
128
+ }
129
+ });
130
+
131
+ // Add an event listener for the home link click
132
+ const homeLink = document.querySelector('.navbar-fixed-left .navbar-brand');
133
+ if (homeLink) {
134
+ homeLink.addEventListener('click', function() {
135
+ resetNavbarState();
136
+ });
137
+ }
138
+
139
+ // Close all dropdowns except the one specified
140
+ function closeAllDropdownsExcept(exceptId) {
141
+ dropdowns.forEach(function(collapse) {
142
+ if (collapse.id !== exceptId && collapse.classList.contains('in')) {
143
+ $(collapse).collapse('hide');
144
+ }
145
+ });
146
+ }
147
+
148
+ // Add click event listener to the dropdown links and save the clicked one
149
+ function addLinkClickListeners() {
150
+ const dropdownLinks = document.querySelectorAll('.navbar-fixed-left .navbar-nav > .dropdown > .nav-dropdown-menu > li > a');
151
+
152
+ dropdownLinks.forEach(function(link) {
153
+ link.addEventListener('click', function() {
154
+ sessionStorage.setItem('activeLink', link.getAttribute('href'));
155
+ });
156
+ });
157
+ collapseNavbarIfNeeded();
158
+ }
159
+
160
+ // Close all dropdowns except the last opened one
161
+ dropdownToggles.forEach(function(toggle) {
162
+ toggle.addEventListener('click', function(event) {
163
+ event.preventDefault();
164
+ const collapseElement = document.getElementById(this.getAttribute('href').substring(1));
165
+
166
+ if (!collapseElement.classList.contains('in')) {
167
+ closeAllDropdownsExcept(collapseElement.id);
168
+ $(collapseElement).collapse('show');
169
+ sessionStorage.setItem('lastOpenedDropdown', collapseElement.id);
170
+ } else {
171
+ $(collapseElement).collapse('hide');
172
+ sessionStorage.removeItem('lastOpenedDropdown');
173
+ }
174
+ });
175
+ });
176
+
177
+ // Open the last opened dropdown
178
+ if (lastDropdownId) {
179
+ let lastDropdownMenu = document.getElementById(lastDropdownId);
180
+ if (lastDropdownMenu && !lastDropdownMenu.classList.contains('in')) {
181
+ $(lastDropdownMenu).collapse('show');
182
+ }
183
+ }
184
+
185
+ // Restore the last saved scroll position
186
+ if (savedScrollPosition) {
187
+ navbar.scrollTop = savedScrollPosition;
188
+ }
189
+
190
+ // Function to adjust navbar header visibility based on scroll position and navbar collapsed state
191
+ function adjustNavbarHeaderVisibility() {
192
+ // Check if the navbar is collapsed and mainContent is defined
193
+ if (navbar.classList.contains('collapsed') && mainContent) {
194
+ const mainContentTop = mainContent.getBoundingClientRect().top;
195
+ // Show or hide the navbar header based on mainContent's position
196
+ if (mainContentTop < 0) {
197
+ // Main content top is out of view, hide navbar header
198
+ navbarHeader.style.top = '-60px'; // height of navbar header
199
+ } else {
200
+ // Main content top is in view, show navbar header
201
+ navbarHeader.style.top = '0';
202
+ }
203
+ }
204
+ }
205
+
206
+ // Add scroll event listener to adjust navbar header visibility
207
+ window.addEventListener('scroll', adjustNavbarHeaderVisibility);
208
+
209
+ // Call the function initially to set the correct state when the page loads
210
+ adjustNavbarHeaderVisibility();
211
+
212
+ // Debounce function to limit the rate at which the handleScroll function is executed
213
+ function debounce(func, wait, immediate) {
214
+ let timeout;
215
+ return function() {
216
+ const context = this, args = arguments;
217
+ const later = function() {
218
+ timeout = null;
219
+ if (!immediate) func.apply(context, args);
220
+ };
221
+ const callNow = immediate && !timeout;
222
+ clearTimeout(timeout);
223
+ timeout = setTimeout(later, wait);
224
+ if (callNow) func.apply(context, args);
225
+ };
226
+ }
227
+
228
+ // Save the scroll position when the navbar is scrolled
229
+ navbar.addEventListener('scroll', debounce(function() {
230
+ sessionStorage.setItem('navbarScrollPosition', navbar.scrollTop);
231
+ }, 250));
232
+
233
+ // Add click event listeners to dropdown links
234
+ addLinkClickListeners();
235
+
236
+ // Apply the 'active' class to the previously clicked link
237
+ if (activeLink) {
238
+ let previouslyClickedLink = document.querySelector('.navbar-fixed-left .navbar-nav > .dropdown > .nav-dropdown-menu > li > a[href="' + activeLink + '"]');
239
+ let currentLocation = window.location.pathname + window.location.search;
240
+
241
+ if (previouslyClickedLink && currentLocation.includes(previouslyClickedLink.getAttribute('href'))) {
242
+ previouslyClickedLink.parentElement.classList.add('active');
243
+ }
244
+ else {
245
+ sessionStorage.removeItem('activeLink');
246
+ }
247
+ }
248
+
249
+ });
@@ -42,7 +42,7 @@
42
42
  <div class="panel-heading">
43
43
  <strong>Stats</strong>
44
44
  </div>
45
- <div class="row panel-body">
45
+ <div class="panel-body">
46
46
  <div class="col-md-4 text-center">
47
47
  <h2><a href="{% url 'circuits:circuit_list' %}?tenant={{ object.name }}" class="btn {% if stats.circuit_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.circuit_count }}</a></h2>
48
48
  <p>Circuits</p>
@@ -7,7 +7,7 @@ from django.test import override_settings, RequestFactory
7
7
  from django.urls import reverse
8
8
  from social_django.utils import load_backend, load_strategy
9
9
 
10
- from nautobot.core.testing import TestCase
10
+ from nautobot.core.testing import TestCase, utils
11
11
 
12
12
  User = get_user_model()
13
13
 
@@ -21,11 +21,11 @@ class PasswordUITest(TestCase):
21
21
  preferences_response = self.client.get(reverse("user:preferences"))
22
22
  api_tokens_response = self.client.get(reverse("user:token_list"))
23
23
  for response in [profile_response, preferences_response, api_tokens_response]:
24
- self.assertIn("Change Password", str(response.content))
24
+ self.assertBodyContains(response, "Change Password")
25
25
 
26
26
  # Check GET change_password functionality
27
27
  get_response = self.client.get(reverse("user:change_password"))
28
- self.assertIn("New password confirmation", str(get_response.content))
28
+ self.assertBodyContains(get_response, "New password confirmation")
29
29
 
30
30
  # Check POST change_password functionality
31
31
  post_response = self.client.post(
@@ -36,7 +36,7 @@ class PasswordUITest(TestCase):
36
36
  "new_password2": "baz",
37
37
  },
38
38
  )
39
- self.assertIn("The two password fields", str(post_response.content))
39
+ self.assertBodyContains(post_response, "The two password fields")
40
40
 
41
41
  @override_settings(
42
42
  AUTHENTICATION_BACKENDS=[
@@ -77,20 +77,18 @@ class PasswordUITest(TestCase):
77
77
  preferences_response = self.client.get(reverse("user:preferences"))
78
78
  api_tokens_response = self.client.get(reverse("user:token_list"))
79
79
  for response in [profile_response, preferences_response, api_tokens_response]:
80
- self.assertNotIn("Change Password", str(response.content))
80
+ self.assertNotIn("Change Password", utils.extract_page_body(response.content.decode(response.charset)))
81
81
 
82
82
  # Check GET and POST change_password functionality
83
83
  get_response = self.client.get(reverse("user:change_password"), follow=True)
84
84
  post_response = self.client.post(reverse("user:change_password"), follow=True)
85
85
  for response in [get_response, post_response]:
86
- self.assertNotIn("New password confirmation", str(response.content))
86
+ content = utils.extract_page_body(response.content.decode(response.charset))
87
+ self.assertNotIn("New password confirmation", content)
87
88
  # Check redirect
88
- self.assertIn("User Profile", str(response.content))
89
+ self.assertIn("User Profile", content)
89
90
  # Check warning message
90
- self.assertIn(
91
- "Remotely authenticated user credentials cannot be changed within Nautobot.",
92
- str(response.content),
93
- )
91
+ self.assertIn("Remotely authenticated user credentials cannot be changed within Nautobot.", content)
94
92
 
95
93
 
96
94
  class AdvancedProfileSettingsViewTest(TestCase):
@@ -239,11 +239,9 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
239
239
  self.add_permissions("virtualization.view_virtualmachine")
240
240
  url = self._get_url("list") + "?sort=primary_ip"
241
241
  response = self.client.get(url)
242
- self.assertEqual(response.status_code, 200)
243
- response = response.content.decode(response.charset)
244
- self.assertInHTML("Virtual Machine 1", response)
245
- self.assertInHTML("Virtual Machine 2", response)
246
- self.assertInHTML("Virtual Machine 3", response)
242
+ self.assertBodyContains(response, "Virtual Machine 1")
243
+ self.assertBodyContains(response, "Virtual Machine 2")
244
+ self.assertBodyContains(response, "Virtual Machine 3")
247
245
 
248
246
 
249
247
  class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nautobot
3
- Version: 2.3.6
3
+ Version: 2.3.8
4
4
  Summary: Source of truth and network automation platform.
5
5
  Home-page: https://nautobot.com
6
6
  License: Apache-2.0
@@ -59,6 +59,7 @@ Requires-Dist: emoji (>=2.12.1,<2.13.0)
59
59
  Requires-Dist: graphene-django (>=2.16.0,<2.17.0)
60
60
  Requires-Dist: graphene-django-optimizer (>=0.8.0,<0.9.0)
61
61
  Requires-Dist: jsonschema (>=4.7.0,<5.0.0)
62
+ Requires-Dist: kombu (>=5.4.2,<5.5.0)
62
63
  Requires-Dist: mysqlclient (>=2.2.3,<2.3.0) ; extra == "all" or extra == "mysql"
63
64
  Requires-Dist: napalm (>=4.1.0,<6.0.0) ; extra == "all" or extra == "napalm"
64
65
  Requires-Dist: netaddr (>=1.3.0,<1.4.0)