nautobot 2.0.5__py3-none-any.whl → 2.1.0b1__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 (376) hide show
  1. nautobot/circuits/navigation.py +0 -25
  2. nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -9
  3. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +0 -2
  4. nautobot/circuits/tests/test_filters.py +1 -0
  5. nautobot/core/api/serializers.py +15 -5
  6. nautobot/core/api/views.py +18 -19
  7. nautobot/core/choices.py +1 -1
  8. nautobot/core/filters.py +12 -4
  9. nautobot/core/jobs/__init__.py +125 -3
  10. nautobot/core/management/commands/generate_test_data.py +4 -1
  11. nautobot/core/models/fields.py +12 -2
  12. nautobot/core/settings.py +8 -7
  13. nautobot/core/templates/base_django.html +2 -2
  14. nautobot/core/templates/buttons/export.html +57 -30
  15. nautobot/core/templates/generic/object_list.html +2 -2
  16. nautobot/core/templates/generic/object_retrieve.html +8 -1
  17. nautobot/core/templates/home.html +5 -5
  18. nautobot/core/templates/inc/created_updated.html +2 -2
  19. nautobot/core/templates/inc/footer.html +2 -2
  20. nautobot/core/templates/inc/javascript.html +0 -10
  21. nautobot/core/templates/inc/media.html +2 -0
  22. nautobot/core/templates/inc/nav_menu.html +66 -68
  23. nautobot/core/templates/inc/object_details_advanced_panel.html +19 -0
  24. nautobot/core/templates/nautobot_config.py.j2 +10 -4
  25. nautobot/core/templates/panel_table.html +1 -1
  26. nautobot/core/templates/template.css +89 -0
  27. nautobot/core/templates/utilities/templatetags/table_config_form.html +1 -0
  28. nautobot/core/templatetags/buttons.py +7 -2
  29. nautobot/core/testing/views.py +34 -4
  30. nautobot/core/tests/integration/test_home.py +1 -43
  31. nautobot/core/tests/integration/test_navbar.py +10 -64
  32. nautobot/core/tests/integration/test_plugin_home.py +4 -5
  33. nautobot/core/tests/integration/test_plugin_navbar.py +20 -16
  34. nautobot/core/tests/integration/test_theme.py +4 -0
  35. nautobot/core/tests/test_api.py +14 -66
  36. nautobot/core/tests/test_filters.py +127 -0
  37. nautobot/core/tests/test_forms.py +1 -1
  38. nautobot/core/tests/test_graphql.py +165 -2
  39. nautobot/core/tests/test_jobs.py +112 -0
  40. nautobot/core/tests/test_openapi.py +6 -0
  41. nautobot/core/tests/test_views.py +11 -85
  42. nautobot/core/urls.py +6 -1
  43. nautobot/core/utils/lookup.py +28 -0
  44. nautobot/core/utils/requests.py +2 -3
  45. nautobot/core/views/__init__.py +3 -4
  46. nautobot/core/views/generic.py +9 -4
  47. nautobot/core/views/mixins.py +4 -2
  48. nautobot/core/views/renderers.py +5 -0
  49. nautobot/dcim/models/device_components.py +1 -0
  50. nautobot/dcim/navigation.py +10 -165
  51. nautobot/dcim/templates/dcim/location.html +1 -1
  52. nautobot/dcim/tests/features/locations.feature +143 -0
  53. nautobot/dcim/tests/test_api.py +1 -1
  54. nautobot/dcim/tests/test_filters.py +11 -3
  55. nautobot/extras/admin.py +1 -1
  56. nautobot/extras/api/serializers.py +33 -0
  57. nautobot/extras/api/urls.py +6 -0
  58. nautobot/extras/api/views.py +45 -6
  59. nautobot/extras/factory.py +28 -2
  60. nautobot/extras/filters/__init__.py +52 -0
  61. nautobot/extras/filters/mixins.py +4 -29
  62. nautobot/extras/forms/forms.py +43 -0
  63. nautobot/extras/jobs.py +31 -9
  64. nautobot/extras/migrations/0100_fileproxy_job_result.py +32 -0
  65. nautobot/extras/migrations/0101_externalintegration.py +61 -0
  66. nautobot/extras/migrations/0102_set_null_objectchange_contenttype.py +32 -0
  67. nautobot/extras/models/__init__.py +2 -0
  68. nautobot/extras/models/change_logging.py +2 -2
  69. nautobot/extras/models/models.py +96 -16
  70. nautobot/extras/navigation.py +17 -29
  71. nautobot/extras/signals.py +15 -0
  72. nautobot/extras/tables.py +27 -0
  73. nautobot/extras/templates/extras/externalintegration_retrieve.html +37 -0
  74. nautobot/extras/templates/extras/inc/jobresult.html +24 -0
  75. nautobot/extras/templates/extras/jobresult.html +24 -0
  76. nautobot/extras/test_jobs/file_output.py +16 -0
  77. nautobot/extras/tests/test_api.py +92 -0
  78. nautobot/extras/tests/test_filters.py +64 -2
  79. nautobot/extras/tests/test_jobs.py +39 -0
  80. nautobot/extras/tests/test_models.py +34 -0
  81. nautobot/extras/tests/test_views.py +22 -2
  82. nautobot/extras/urls.py +1 -0
  83. nautobot/extras/views.py +15 -0
  84. nautobot/ipam/forms.py +16 -0
  85. nautobot/ipam/models.py +3 -0
  86. nautobot/ipam/navigation.py +2 -59
  87. nautobot/ipam/templates/ipam/ipaddress.html +0 -9
  88. nautobot/ipam/templates/ipam/prefix.html +0 -9
  89. nautobot/ipam/tests/features/prefixes.feature +134 -0
  90. nautobot/ipam/tests/test_filters.py +5 -10
  91. nautobot/ipam/tests/test_views.py +8 -1
  92. nautobot/ipam/views.py +3 -0
  93. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +191 -191
  94. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  95. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +1 -1
  96. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  97. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +874 -881
  98. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  99. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  100. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  101. nautobot/project-static/css/base.css +135 -99
  102. nautobot/project-static/css/dark.css +65 -6
  103. nautobot/project-static/docs/404.html +44 -16
  104. nautobot/project-static/docs/apps/index.html +44 -16
  105. nautobot/project-static/docs/apps/nautobot-apps.html +44 -16
  106. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +44 -16
  107. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +44 -16
  108. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1597 -1457
  109. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +44 -16
  110. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +45 -17
  111. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +44 -16
  112. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +44 -16
  113. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +44 -16
  114. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +44 -16
  115. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +353 -432
  116. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +66 -38
  117. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +44 -16
  118. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2154 -2307
  119. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +807 -691
  120. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +44 -16
  121. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +44 -16
  122. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +58 -30
  123. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3600 -3456
  124. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +44 -16
  125. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +44 -16
  126. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +101 -75
  127. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3083 -3019
  128. nautobot/project-static/docs/development/apps/api/configuration-view.html +44 -16
  129. nautobot/project-static/docs/development/apps/api/database-backend-config.html +44 -16
  130. nautobot/project-static/docs/development/apps/api/models/django-admin.html +44 -16
  131. nautobot/project-static/docs/development/apps/api/models/global-search.html +44 -16
  132. nautobot/project-static/docs/development/apps/api/models/graphql.html +44 -16
  133. nautobot/project-static/docs/development/apps/api/models/index.html +44 -16
  134. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +44 -16
  135. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +44 -16
  136. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +44 -16
  137. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +44 -16
  138. nautobot/project-static/docs/development/apps/api/platform-features/index.html +44 -16
  139. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +44 -16
  140. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +44 -16
  141. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +44 -16
  142. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +44 -16
  143. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +44 -16
  144. nautobot/project-static/docs/development/apps/api/prometheus.html +44 -16
  145. nautobot/project-static/docs/development/apps/api/setup.html +44 -16
  146. nautobot/project-static/docs/development/apps/api/testing.html +44 -16
  147. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +44 -16
  148. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +44 -16
  149. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +44 -16
  150. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +44 -16
  151. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +44 -16
  152. nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +44 -16
  153. nautobot/project-static/docs/development/apps/api/views/base-template.html +44 -16
  154. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +44 -16
  155. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +44 -16
  156. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +44 -16
  157. nautobot/project-static/docs/development/apps/api/views/index.html +44 -16
  158. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +44 -16
  159. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +44 -16
  160. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +44 -16
  161. nautobot/project-static/docs/development/apps/api/views/notes.html +44 -16
  162. nautobot/project-static/docs/development/apps/api/views/rest-api.html +44 -16
  163. nautobot/project-static/docs/development/apps/api/views/urls.html +44 -16
  164. nautobot/project-static/docs/development/apps/api/views/view-overrides.html +44 -16
  165. nautobot/project-static/docs/development/apps/index.html +44 -16
  166. nautobot/project-static/docs/development/apps/migration/code-updates.html +44 -16
  167. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +44 -16
  168. nautobot/project-static/docs/development/apps/migration/from-v1.html +44 -16
  169. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +44 -16
  170. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +44 -16
  171. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +44 -16
  172. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +44 -16
  173. nautobot/project-static/docs/development/apps/porting-from-netbox.html +44 -16
  174. nautobot/project-static/docs/development/core/application-registry.html +44 -16
  175. nautobot/project-static/docs/development/core/best-practices.html +44 -16
  176. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +44 -16
  177. nautobot/project-static/docs/development/core/extending-models.html +44 -16
  178. nautobot/project-static/docs/development/core/generic-views.html +44 -16
  179. nautobot/project-static/docs/development/core/getting-started.html +44 -16
  180. nautobot/project-static/docs/development/core/homepage.html +44 -16
  181. nautobot/project-static/docs/development/core/index.html +44 -16
  182. nautobot/project-static/docs/development/core/model-features.html +44 -16
  183. nautobot/project-static/docs/development/core/natural-keys.html +44 -16
  184. nautobot/project-static/docs/development/core/navigation-menu.html +44 -21
  185. nautobot/project-static/docs/development/core/react-ui.html +44 -16
  186. nautobot/project-static/docs/development/core/release-checklist.html +44 -16
  187. nautobot/project-static/docs/development/core/role-internals.html +44 -16
  188. nautobot/project-static/docs/development/core/style-guide.html +44 -16
  189. nautobot/project-static/docs/development/core/templates.html +44 -16
  190. nautobot/project-static/docs/development/core/testing.html +44 -16
  191. nautobot/project-static/docs/development/core/user-preferences.html +44 -16
  192. nautobot/project-static/docs/development/index.html +44 -16
  193. nautobot/project-static/docs/development/jobs/index.html +280 -234
  194. nautobot/project-static/docs/development/jobs/migration/from-v1.html +44 -16
  195. nautobot/project-static/docs/index.html +44 -16
  196. nautobot/project-static/docs/objects.inv +0 -0
  197. nautobot/project-static/docs/release-notes/index.html +47 -19
  198. nautobot/project-static/docs/release-notes/version-1.0.html +44 -16
  199. nautobot/project-static/docs/release-notes/version-1.1.html +44 -16
  200. nautobot/project-static/docs/release-notes/version-1.2.html +44 -16
  201. nautobot/project-static/docs/release-notes/version-1.3.html +44 -16
  202. nautobot/project-static/docs/release-notes/version-1.4.html +44 -16
  203. nautobot/project-static/docs/release-notes/version-1.5.html +44 -16
  204. nautobot/project-static/docs/release-notes/version-1.6.html +44 -16
  205. nautobot/project-static/docs/release-notes/version-2.0.html +47 -19
  206. nautobot/project-static/docs/release-notes/version-2.1.html +5724 -0
  207. nautobot/project-static/docs/search/search_index.json +1 -1
  208. nautobot/project-static/docs/sitemap.xml +247 -237
  209. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  210. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +44 -16
  211. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +44 -16
  212. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +44 -16
  213. nautobot/project-static/docs/user-guide/administration/configuration/index.html +44 -16
  214. nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +44 -16
  215. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +109 -43
  216. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +44 -16
  217. nautobot/project-static/docs/user-guide/administration/guides/caching.html +44 -16
  218. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +44 -16
  219. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +44 -16
  220. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +44 -16
  221. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +44 -16
  222. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +44 -16
  223. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +48 -19
  224. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +44 -16
  225. nautobot/project-static/docs/user-guide/administration/installation/docker.html +44 -16
  226. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +44 -16
  227. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +44 -16
  228. nautobot/project-static/docs/user-guide/administration/installation/index.html +44 -16
  229. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +44 -16
  230. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +44 -16
  231. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +44 -16
  232. nautobot/project-static/docs/user-guide/administration/installation/services.html +44 -16
  233. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +44 -16
  234. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +44 -16
  235. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +44 -16
  236. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +44 -16
  237. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +44 -16
  238. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +44 -16
  239. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +44 -16
  240. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +44 -16
  241. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +44 -16
  242. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +44 -16
  243. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +44 -16
  244. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +44 -16
  245. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +44 -16
  246. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +44 -16
  247. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +44 -16
  248. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +44 -16
  249. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +44 -16
  250. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +44 -16
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +44 -16
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +44 -16
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +44 -16
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +44 -16
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +44 -16
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +44 -16
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +44 -16
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +44 -16
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +44 -16
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +44 -16
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +44 -16
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +44 -16
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +44 -16
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +44 -16
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +44 -16
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +44 -16
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +44 -16
  268. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +44 -16
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +44 -16
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +44 -16
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +44 -16
  272. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +44 -16
  273. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +44 -16
  274. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +44 -16
  275. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +44 -16
  276. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +44 -16
  277. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +44 -16
  278. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +44 -16
  279. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +44 -16
  280. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +44 -16
  281. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +44 -16
  282. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +44 -16
  283. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +44 -16
  284. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +44 -16
  285. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +44 -16
  286. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +44 -16
  287. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +44 -16
  288. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +44 -16
  289. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +44 -16
  290. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +44 -16
  291. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +44 -16
  292. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +44 -16
  293. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +44 -16
  294. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +44 -16
  295. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +44 -16
  296. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +44 -16
  297. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +44 -16
  298. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +44 -16
  299. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +44 -16
  300. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +44 -16
  301. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +44 -16
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +44 -16
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +44 -16
  304. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +44 -16
  305. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +44 -16
  306. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +44 -16
  307. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +44 -16
  308. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +44 -16
  309. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +44 -16
  310. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +44 -16
  311. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +44 -16
  312. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +44 -16
  313. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +44 -16
  314. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +44 -16
  315. nautobot/project-static/docs/user-guide/index.html +44 -16
  316. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +110 -16
  317. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +44 -16
  318. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +44 -16
  319. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +44 -16
  320. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +44 -16
  321. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +47 -19
  322. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +5359 -0
  323. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +47 -19
  324. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +44 -16
  325. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +44 -16
  326. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +44 -16
  327. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +44 -16
  328. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +44 -16
  329. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +44 -16
  330. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +44 -16
  331. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +44 -16
  332. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +44 -16
  333. nautobot/project-static/docs/user-guide/platform-functionality/note.html +44 -16
  334. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +44 -16
  335. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +44 -16
  336. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +113 -44
  337. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +44 -16
  338. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +44 -16
  339. nautobot/project-static/docs/user-guide/platform-functionality/role.html +44 -16
  340. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +44 -16
  341. nautobot/project-static/docs/user-guide/platform-functionality/status.html +44 -16
  342. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +44 -16
  343. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +44 -16
  344. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +44 -16
  345. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +44 -16
  346. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +44 -16
  347. nautobot/project-static/fonts/UFL.txt +96 -0
  348. nautobot/project-static/fonts/Ubuntu-Bold.woff2 +0 -0
  349. nautobot/project-static/fonts/Ubuntu-BoldItalic.woff2 +0 -0
  350. nautobot/project-static/fonts/Ubuntu-Italic.woff2 +0 -0
  351. nautobot/project-static/fonts/Ubuntu-Medium.woff2 +0 -0
  352. nautobot/project-static/fonts/Ubuntu-MediumItalic.woff2 +0 -0
  353. nautobot/project-static/fonts/Ubuntu-Regular.woff2 +0 -0
  354. nautobot/project-static/fonts/UbuntuMono-Bold.woff2 +0 -0
  355. nautobot/project-static/fonts/UbuntuMono-BoldItalic.woff2 +0 -0
  356. nautobot/project-static/fonts/UbuntuMono-Italic.woff2 +0 -0
  357. nautobot/project-static/fonts/UbuntuMono-Regular.woff2 +0 -0
  358. nautobot/project-static/img/dark-theme.png +0 -0
  359. nautobot/project-static/img/light-theme.png +0 -0
  360. nautobot/project-static/img/nautobot_chevron.svg +5 -0
  361. nautobot/project-static/img/nautobot_chevron_header.svg +5 -0
  362. nautobot/project-static/img/system-theme.png +0 -0
  363. nautobot/tenancy/navigation.py +0 -13
  364. nautobot/ui/package-lock.json +2 -2
  365. nautobot/ui/package.json +1 -1
  366. nautobot/users/admin.py +44 -0
  367. nautobot/users/migrations/0007_alter_objectpermission_object_types.py +33 -0
  368. nautobot/users/models.py +3 -2
  369. nautobot/virtualization/navigation.py +1 -33
  370. nautobot/virtualization/tests/test_api.py +1 -1
  371. nautobot/virtualization/tests/test_filters.py +1 -1
  372. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/METADATA +1 -1
  373. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/RECORD +376 -351
  374. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/LICENSE.txt +0 -0
  375. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/WHEEL +0 -0
  376. {nautobot-2.0.5.dist-info → nautobot-2.1.0b1.dist-info}/entry_points.txt +0 -0
@@ -2659,6 +2659,20 @@
2659
2659
 
2660
2660
 
2661
2661
 
2662
+ <li class="md-nav__item">
2663
+ <a href="../../../user-guide/platform-functionality/externalintegration.html" class="md-nav__link">
2664
+ External Integrations
2665
+ </a>
2666
+ </li>
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+
2662
2676
  <li class="md-nav__item">
2663
2677
  <a href="../../../user-guide/platform-functionality/gitrepository.html" class="md-nav__link">
2664
2678
  Git Repositories
@@ -2679,7 +2693,7 @@
2679
2693
 
2680
2694
 
2681
2695
 
2682
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_8" >
2696
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_9" >
2683
2697
 
2684
2698
 
2685
2699
 
@@ -2688,14 +2702,14 @@
2688
2702
  <div class="md-nav__link md-nav__link--index ">
2689
2703
  <a href="../../../user-guide/platform-functionality/graphql.html">GraphQL</a>
2690
2704
 
2691
- <label for="__nav_2_4_8">
2705
+ <label for="__nav_2_4_9">
2692
2706
  <span class="md-nav__icon md-icon"></span>
2693
2707
  </label>
2694
2708
 
2695
2709
  </div>
2696
2710
 
2697
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_8_label" aria-expanded="false">
2698
- <label class="md-nav__title" for="__nav_2_4_8">
2711
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_9_label" aria-expanded="false">
2712
+ <label class="md-nav__title" for="__nav_2_4_9">
2699
2713
  <span class="md-nav__icon md-icon"></span>
2700
2714
  GraphQL
2701
2715
  </label>
@@ -2747,7 +2761,7 @@
2747
2761
 
2748
2762
 
2749
2763
 
2750
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_10" >
2764
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_11" >
2751
2765
 
2752
2766
 
2753
2767
 
@@ -2756,14 +2770,14 @@
2756
2770
  <div class="md-nav__link md-nav__link--index ">
2757
2771
  <a href="../../../user-guide/platform-functionality/jobs/index.html">Jobs</a>
2758
2772
 
2759
- <label for="__nav_2_4_10">
2773
+ <label for="__nav_2_4_11">
2760
2774
  <span class="md-nav__icon md-icon"></span>
2761
2775
  </label>
2762
2776
 
2763
2777
  </div>
2764
2778
 
2765
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_10_label" aria-expanded="false">
2766
- <label class="md-nav__title" for="__nav_2_4_10">
2779
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_11_label" aria-expanded="false">
2780
+ <label class="md-nav__title" for="__nav_2_4_11">
2767
2781
  <span class="md-nav__icon md-icon"></span>
2768
2782
  Jobs
2769
2783
  </label>
@@ -2885,7 +2899,7 @@
2885
2899
 
2886
2900
 
2887
2901
 
2888
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_14" >
2902
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_15" >
2889
2903
 
2890
2904
 
2891
2905
 
@@ -2894,14 +2908,14 @@
2894
2908
  <div class="md-nav__link md-nav__link--index ">
2895
2909
  <a href="../../../user-guide/platform-functionality/rest-api/overview.html">REST API</a>
2896
2910
 
2897
- <label for="__nav_2_4_14">
2911
+ <label for="__nav_2_4_15">
2898
2912
  <span class="md-nav__icon md-icon"></span>
2899
2913
  </label>
2900
2914
 
2901
2915
  </div>
2902
2916
 
2903
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_14_label" aria-expanded="false">
2904
- <label class="md-nav__title" for="__nav_2_4_14">
2917
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_15_label" aria-expanded="false">
2918
+ <label class="md-nav__title" for="__nav_2_4_15">
2905
2919
  <span class="md-nav__icon md-icon"></span>
2906
2920
  REST API
2907
2921
  </label>
@@ -3037,17 +3051,17 @@
3037
3051
 
3038
3052
 
3039
3053
 
3040
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_20" >
3054
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_21" >
3041
3055
 
3042
3056
 
3043
3057
 
3044
- <label class="md-nav__link" for="__nav_2_4_20" id="__nav_2_4_20_label" tabindex="0">
3058
+ <label class="md-nav__link" for="__nav_2_4_21" id="__nav_2_4_21_label" tabindex="0">
3045
3059
  Users
3046
3060
  <span class="md-nav__icon md-icon"></span>
3047
3061
  </label>
3048
3062
 
3049
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_20_label" aria-expanded="false">
3050
- <label class="md-nav__title" for="__nav_2_4_20">
3063
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_21_label" aria-expanded="false">
3064
+ <label class="md-nav__title" for="__nav_2_4_21">
3051
3065
  <span class="md-nav__icon md-icon"></span>
3052
3066
  Users
3053
3067
  </label>
@@ -5353,6 +5367,20 @@
5353
5367
 
5354
5368
 
5355
5369
 
5370
+ <li class="md-nav__item">
5371
+ <a href="../../../release-notes/version-2.1.html" class="md-nav__link">
5372
+ Version 2.1
5373
+ </a>
5374
+ </li>
5375
+
5376
+
5377
+
5378
+
5379
+
5380
+
5381
+
5382
+
5383
+
5356
5384
  <li class="md-nav__item">
5357
5385
  <a href="../../../release-notes/version-2.0.html" class="md-nav__link">
5358
5386
  Version 2.0
@@ -9097,8 +9125,7 @@ to return only queryset filterable parameters.</p>
9097
9125
  <span class="normal"><a href="#__codelineno-0-133">133</a></span>
9098
9126
  <span class="normal"><a href="#__codelineno-0-134">134</a></span>
9099
9127
  <span class="normal"><a href="#__codelineno-0-135">135</a></span>
9100
- <span class="normal"><a href="#__codelineno-0-136">136</a></span>
9101
- <span class="normal"><a href="#__codelineno-0-137">137</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="k">def</span> <span class="nf">get_filterable_params_from_filter_params</span><span class="p">(</span><span class="n">filter_params</span><span class="p">,</span> <span class="n">non_filter_params</span><span class="p">,</span> <span class="n">filterset</span><span class="p">):</span>
9128
+ <span class="normal"><a href="#__codelineno-0-136">136</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-104" name="__codelineno-0-104"></a><span class="k">def</span> <span class="nf">get_filterable_params_from_filter_params</span><span class="p">(</span><span class="n">filter_params</span><span class="p">,</span> <span class="n">non_filter_params</span><span class="p">,</span> <span class="n">filterset</span><span class="p">):</span>
9102
9129
  <a id="__codelineno-0-105" name="__codelineno-0-105"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
9103
9130
  <a id="__codelineno-0-106" name="__codelineno-0-106"></a><span class="sd"> Remove any `non_filter_params` and fields that are not a part of the filterset from `filter_params`</span>
9104
9131
  <a id="__codelineno-0-107" name="__codelineno-0-107"></a><span class="sd"> to return only queryset filterable parameters.</span>
@@ -9111,27 +9138,26 @@ to return only queryset filterable parameters.</p>
9111
9138
  <a id="__codelineno-0-114" name="__codelineno-0-114"></a><span class="sd"> Returns:</span>
9112
9139
  <a id="__codelineno-0-115" name="__codelineno-0-115"></a><span class="sd"> (QueryDict): Filter param querydict with only queryset filterable params</span>
9113
9140
  <a id="__codelineno-0-116" name="__codelineno-0-116"></a><span class="sd"> &quot;&quot;&quot;</span>
9114
- <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="k">for</span> <span class="n">non_filter_param</span> <span class="ow">in</span> <span class="n">non_filter_params</span><span class="p">:</span>
9115
- <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="n">filter_params</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">non_filter_param</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
9116
- <a id="__codelineno-0-119" name="__codelineno-0-119"></a>
9117
- <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="c1"># Some FilterSet field only accept single choice not multiple choices</span>
9118
- <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="c1"># e.g datetime field, bool fields etc.</span>
9119
- <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="n">final_filter_params</span> <span class="o">=</span> <span class="p">{}</span>
9120
- <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">filter_params</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
9121
- <a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="k">if</span> <span class="n">filter_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="p">):</span>
9122
- <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="c1"># `is_single_choice_field` implements `get_filterset_field`, which throws an exception if a field is not found.</span>
9123
- <a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="c1"># If an exception is thrown, instead of throwing an exception, set `_is_single_choice_field` to &#39;False&#39;</span>
9124
- <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="c1"># because the fields that were not discovered are still necessary.</span>
9125
- <a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="k">try</span><span class="p">:</span>
9126
- <a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="n">_is_single_choice_field</span> <span class="o">=</span> <span class="n">is_single_choice_field</span><span class="p">(</span><span class="n">filterset</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
9127
- <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">FilterSetFieldNotFound</span><span class="p">:</span>
9128
- <a id="__codelineno-0-131" name="__codelineno-0-131"></a> <span class="n">_is_single_choice_field</span> <span class="o">=</span> <span class="kc">False</span>
9129
- <a id="__codelineno-0-132" name="__codelineno-0-132"></a>
9130
- <a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="n">final_filter_params</span><span class="p">[</span><span class="n">field</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
9131
- <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="n">filter_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="p">)</span> <span class="k">if</span> <span class="n">_is_single_choice_field</span> <span class="k">else</span> <span class="n">filter_params</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
9132
- <a id="__codelineno-0-135" name="__codelineno-0-135"></a> <span class="p">)</span>
9133
- <a id="__codelineno-0-136" name="__codelineno-0-136"></a>
9134
- <a id="__codelineno-0-137" name="__codelineno-0-137"></a> <span class="k">return</span> <span class="n">final_filter_params</span>
9141
+ <a id="__codelineno-0-117" name="__codelineno-0-117"></a> <span class="c1"># Some FilterSet field only accept single choice not multiple choices</span>
9142
+ <a id="__codelineno-0-118" name="__codelineno-0-118"></a> <span class="c1"># e.g datetime field, bool fields etc.</span>
9143
+ <a id="__codelineno-0-119" name="__codelineno-0-119"></a> <span class="n">final_filter_params</span> <span class="o">=</span> <span class="p">{}</span>
9144
+ <a id="__codelineno-0-120" name="__codelineno-0-120"></a> <span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">filter_params</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
9145
+ <a id="__codelineno-0-121" name="__codelineno-0-121"></a> <span class="k">if</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">non_filter_params</span><span class="p">:</span>
9146
+ <a id="__codelineno-0-122" name="__codelineno-0-122"></a> <span class="k">continue</span>
9147
+ <a id="__codelineno-0-123" name="__codelineno-0-123"></a> <span class="k">if</span> <span class="n">filter_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="p">):</span>
9148
+ <a id="__codelineno-0-124" name="__codelineno-0-124"></a> <span class="c1"># `is_single_choice_field` implements `get_filterset_field`, which throws an exception if a field is not found.</span>
9149
+ <a id="__codelineno-0-125" name="__codelineno-0-125"></a> <span class="c1"># If an exception is thrown, instead of throwing an exception, set `_is_single_choice_field` to &#39;False&#39;</span>
9150
+ <a id="__codelineno-0-126" name="__codelineno-0-126"></a> <span class="c1"># because the fields that were not discovered are still necessary.</span>
9151
+ <a id="__codelineno-0-127" name="__codelineno-0-127"></a> <span class="k">try</span><span class="p">:</span>
9152
+ <a id="__codelineno-0-128" name="__codelineno-0-128"></a> <span class="n">_is_single_choice_field</span> <span class="o">=</span> <span class="n">is_single_choice_field</span><span class="p">(</span><span class="n">filterset</span><span class="p">,</span> <span class="n">field</span><span class="p">)</span>
9153
+ <a id="__codelineno-0-129" name="__codelineno-0-129"></a> <span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">FilterSetFieldNotFound</span><span class="p">:</span>
9154
+ <a id="__codelineno-0-130" name="__codelineno-0-130"></a> <span class="n">_is_single_choice_field</span> <span class="o">=</span> <span class="kc">False</span>
9155
+ <a id="__codelineno-0-131" name="__codelineno-0-131"></a>
9156
+ <a id="__codelineno-0-132" name="__codelineno-0-132"></a> <span class="n">final_filter_params</span><span class="p">[</span><span class="n">field</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
9157
+ <a id="__codelineno-0-133" name="__codelineno-0-133"></a> <span class="n">filter_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">field</span><span class="p">)</span> <span class="k">if</span> <span class="n">_is_single_choice_field</span> <span class="k">else</span> <span class="n">filter_params</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">field</span><span class="p">)</span>
9158
+ <a id="__codelineno-0-134" name="__codelineno-0-134"></a> <span class="p">)</span>
9159
+ <a id="__codelineno-0-135" name="__codelineno-0-135"></a>
9160
+ <a id="__codelineno-0-136" name="__codelineno-0-136"></a> <span class="k">return</span> <span class="n">final_filter_params</span>
9135
9161
  </code></pre></div></td></tr></table></div>
9136
9162
  </details>
9137
9163
  </div>
@@ -11136,7 +11162,8 @@ values.</p>
11136
11162
 
11137
11163
  <details class="quote">
11138
11164
  <summary>Source code in <code>nautobot/core/utils/requests.py</code></summary>
11139
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-140">140</a></span>
11165
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-139">139</a></span>
11166
+ <span class="normal"><a href="#__codelineno-0-140">140</a></span>
11140
11167
  <span class="normal"><a href="#__codelineno-0-141">141</a></span>
11141
11168
  <span class="normal"><a href="#__codelineno-0-142">142</a></span>
11142
11169
  <span class="normal"><a href="#__codelineno-0-143">143</a></span>
@@ -11168,41 +11195,40 @@ values.</p>
11168
11195
  <span class="normal"><a href="#__codelineno-0-169">169</a></span>
11169
11196
  <span class="normal"><a href="#__codelineno-0-170">170</a></span>
11170
11197
  <span class="normal"><a href="#__codelineno-0-171">171</a></span>
11171
- <span class="normal"><a href="#__codelineno-0-172">172</a></span>
11172
- <span class="normal"><a href="#__codelineno-0-173">173</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-140" name="__codelineno-0-140"></a><span class="k">def</span> <span class="nf">normalize_querydict</span><span class="p">(</span><span class="n">querydict</span><span class="p">,</span> <span class="n">form_class</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
11173
- <a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11174
- <a id="__codelineno-0-142" name="__codelineno-0-142"></a><span class="sd"> Convert a QueryDict to a normal, mutable dictionary, preserving list values. For example,</span>
11175
- <a id="__codelineno-0-143" name="__codelineno-0-143"></a>
11176
- <a id="__codelineno-0-144" name="__codelineno-0-144"></a><span class="sd"> QueryDict(&#39;foo=1&amp;bar=2&amp;bar=3&amp;baz=&#39;)</span>
11177
- <a id="__codelineno-0-145" name="__codelineno-0-145"></a>
11178
- <a id="__codelineno-0-146" name="__codelineno-0-146"></a><span class="sd"> becomes:</span>
11179
- <a id="__codelineno-0-147" name="__codelineno-0-147"></a>
11180
- <a id="__codelineno-0-148" name="__codelineno-0-148"></a><span class="sd"> {&#39;foo&#39;: &#39;1&#39;, &#39;bar&#39;: [&#39;2&#39;, &#39;3&#39;], &#39;baz&#39;: &#39;&#39;}</span>
11181
- <a id="__codelineno-0-149" name="__codelineno-0-149"></a>
11182
- <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> This function is necessary because QueryDict does not provide any built-in mechanism which preserves multiple</span>
11183
- <a id="__codelineno-0-151" name="__codelineno-0-151"></a><span class="sd"> values.</span>
11184
- <a id="__codelineno-0-152" name="__codelineno-0-152"></a>
11185
- <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> A `form_class` can be provided as a way to hint which query parameters should be treated as lists.</span>
11186
- <a id="__codelineno-0-154" name="__codelineno-0-154"></a><span class="sd"> &quot;&quot;&quot;</span>
11187
- <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
11188
- <a id="__codelineno-0-156" name="__codelineno-0-156"></a> <span class="k">if</span> <span class="n">querydict</span><span class="p">:</span>
11189
- <a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value_list</span> <span class="ow">in</span> <span class="n">querydict</span><span class="o">.</span><span class="n">lists</span><span class="p">():</span>
11190
- <a id="__codelineno-0-158" name="__codelineno-0-158"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">value_list</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
11191
- <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="c1"># More than one value in the querydict for this key, so keep it as a list</span>
11192
- <a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="c1"># TODO: we could check here and de-listify value_list if the form_class field is a single-value one?</span>
11193
- <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_list</span>
11194
- <a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="k">elif</span> <span class="p">(</span>
11195
- <a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="n">form_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
11196
- <a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="ow">and</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">form_class</span><span class="o">.</span><span class="n">base_fields</span>
11197
- <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="c1"># ModelMultipleChoiceField is *not* itself a subclass of MultipleChoiceField, thanks Django!</span>
11198
- <a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form_class</span><span class="o">.</span><span class="n">base_fields</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">MultipleChoiceField</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">ModelMultipleChoiceField</span><span class="p">))</span>
11199
- <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="p">):</span>
11200
- <a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="c1"># Even though there&#39;s only a single value in the querydict for this key, the form wants it as a list</span>
11201
- <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_list</span>
11202
- <a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="k">else</span><span class="p">:</span>
11203
- <a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="c1"># Only a single value in the querydict for this key, and no guidance otherwise, so make it single</span>
11204
- <a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
11205
- <a id="__codelineno-0-173" name="__codelineno-0-173"></a> <span class="k">return</span> <span class="n">result</span>
11198
+ <span class="normal"><a href="#__codelineno-0-172">172</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-139" name="__codelineno-0-139"></a><span class="k">def</span> <span class="nf">normalize_querydict</span><span class="p">(</span><span class="n">querydict</span><span class="p">,</span> <span class="n">form_class</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
11199
+ <a id="__codelineno-0-140" name="__codelineno-0-140"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
11200
+ <a id="__codelineno-0-141" name="__codelineno-0-141"></a><span class="sd"> Convert a QueryDict to a normal, mutable dictionary, preserving list values. For example,</span>
11201
+ <a id="__codelineno-0-142" name="__codelineno-0-142"></a>
11202
+ <a id="__codelineno-0-143" name="__codelineno-0-143"></a><span class="sd"> QueryDict(&#39;foo=1&amp;bar=2&amp;bar=3&amp;baz=&#39;)</span>
11203
+ <a id="__codelineno-0-144" name="__codelineno-0-144"></a>
11204
+ <a id="__codelineno-0-145" name="__codelineno-0-145"></a><span class="sd"> becomes:</span>
11205
+ <a id="__codelineno-0-146" name="__codelineno-0-146"></a>
11206
+ <a id="__codelineno-0-147" name="__codelineno-0-147"></a><span class="sd"> {&#39;foo&#39;: &#39;1&#39;, &#39;bar&#39;: [&#39;2&#39;, &#39;3&#39;], &#39;baz&#39;: &#39;&#39;}</span>
11207
+ <a id="__codelineno-0-148" name="__codelineno-0-148"></a>
11208
+ <a id="__codelineno-0-149" name="__codelineno-0-149"></a><span class="sd"> This function is necessary because QueryDict does not provide any built-in mechanism which preserves multiple</span>
11209
+ <a id="__codelineno-0-150" name="__codelineno-0-150"></a><span class="sd"> values.</span>
11210
+ <a id="__codelineno-0-151" name="__codelineno-0-151"></a>
11211
+ <a id="__codelineno-0-152" name="__codelineno-0-152"></a><span class="sd"> A `form_class` can be provided as a way to hint which query parameters should be treated as lists.</span>
11212
+ <a id="__codelineno-0-153" name="__codelineno-0-153"></a><span class="sd"> &quot;&quot;&quot;</span>
11213
+ <a id="__codelineno-0-154" name="__codelineno-0-154"></a> <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span>
11214
+ <a id="__codelineno-0-155" name="__codelineno-0-155"></a> <span class="k">if</span> <span class="n">querydict</span><span class="p">:</span>
11215
+ <a id="__codelineno-0-156" name="__codelineno-0-156"></a> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value_list</span> <span class="ow">in</span> <span class="n">querydict</span><span class="o">.</span><span class="n">lists</span><span class="p">():</span>
11216
+ <a id="__codelineno-0-157" name="__codelineno-0-157"></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">value_list</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
11217
+ <a id="__codelineno-0-158" name="__codelineno-0-158"></a> <span class="c1"># More than one value in the querydict for this key, so keep it as a list</span>
11218
+ <a id="__codelineno-0-159" name="__codelineno-0-159"></a> <span class="c1"># TODO: we could check here and de-listify value_list if the form_class field is a single-value one?</span>
11219
+ <a id="__codelineno-0-160" name="__codelineno-0-160"></a> <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_list</span>
11220
+ <a id="__codelineno-0-161" name="__codelineno-0-161"></a> <span class="k">elif</span> <span class="p">(</span>
11221
+ <a id="__codelineno-0-162" name="__codelineno-0-162"></a> <span class="n">form_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
11222
+ <a id="__codelineno-0-163" name="__codelineno-0-163"></a> <span class="ow">and</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">form_class</span><span class="o">.</span><span class="n">base_fields</span>
11223
+ <a id="__codelineno-0-164" name="__codelineno-0-164"></a> <span class="c1"># ModelMultipleChoiceField is *not* itself a subclass of MultipleChoiceField, thanks Django!</span>
11224
+ <a id="__codelineno-0-165" name="__codelineno-0-165"></a> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">form_class</span><span class="o">.</span><span class="n">base_fields</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">MultipleChoiceField</span><span class="p">,</span> <span class="n">forms</span><span class="o">.</span><span class="n">ModelMultipleChoiceField</span><span class="p">))</span>
11225
+ <a id="__codelineno-0-166" name="__codelineno-0-166"></a> <span class="p">):</span>
11226
+ <a id="__codelineno-0-167" name="__codelineno-0-167"></a> <span class="c1"># Even though there&#39;s only a single value in the querydict for this key, the form wants it as a list</span>
11227
+ <a id="__codelineno-0-168" name="__codelineno-0-168"></a> <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_list</span>
11228
+ <a id="__codelineno-0-169" name="__codelineno-0-169"></a> <span class="k">else</span><span class="p">:</span>
11229
+ <a id="__codelineno-0-170" name="__codelineno-0-170"></a> <span class="c1"># Only a single value in the querydict for this key, and no guidance otherwise, so make it single</span>
11230
+ <a id="__codelineno-0-171" name="__codelineno-0-171"></a> <span class="n">result</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value_list</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
11231
+ <a id="__codelineno-0-172" name="__codelineno-0-172"></a> <span class="k">return</span> <span class="n">result</span>
11206
11232
  </code></pre></div></td></tr></table></div>
11207
11233
  </details>
11208
11234
  </div>