nautobot 2.4.13__py3-none-any.whl → 2.4.14__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.
Files changed (356) hide show
  1. nautobot/core/graphql/generators.py +8 -0
  2. nautobot/core/graphql/schema.py +30 -30
  3. nautobot/core/management/commands/migrate.py +90 -1
  4. nautobot/core/settings.yaml +3 -3
  5. nautobot/core/tables.py +4 -4
  6. nautobot/core/testing/api.py +7 -0
  7. nautobot/core/views/utils.py +1 -1
  8. nautobot/dcim/choices.py +2 -0
  9. nautobot/dcim/constants.py +0 -16
  10. nautobot/dcim/factory.py +1 -1
  11. nautobot/dcim/templates/dcim/rack.html +2 -318
  12. nautobot/dcim/templates/dcim/rack_edit.html +2 -47
  13. nautobot/dcim/templates/dcim/rack_retrieve.html +318 -0
  14. nautobot/dcim/templates/dcim/rack_update.html +47 -0
  15. nautobot/dcim/urls.py +2 -27
  16. nautobot/dcim/utils.py +4 -30
  17. nautobot/dcim/views.py +38 -69
  18. nautobot/extras/choices.py +12 -4
  19. nautobot/extras/filters/mixins.py +8 -6
  20. nautobot/extras/forms/forms.py +9 -0
  21. nautobot/extras/forms/mixins.py +4 -2
  22. nautobot/extras/migrations/0062_collect_roles_from_related_apps_roles.py +30 -7
  23. nautobot/extras/migrations/0124_add_joblogentry_index.py +16 -0
  24. nautobot/extras/models/customfields.py +52 -3
  25. nautobot/extras/models/jobs.py +6 -0
  26. nautobot/extras/models/relationships.py +55 -6
  27. nautobot/extras/templates/extras/graphqlquery.html +2 -97
  28. nautobot/extras/templates/extras/graphqlquery_list.html +1 -0
  29. nautobot/extras/templates/extras/graphqlquery_retrieve.html +97 -0
  30. nautobot/extras/templates/extras/secretsgroup.html +2 -29
  31. nautobot/extras/templates/extras/secretsgroup_edit.html +2 -82
  32. nautobot/extras/templates/extras/secretsgroup_retrieve.html +29 -0
  33. nautobot/extras/templates/extras/secretsgroup_update.html +82 -0
  34. nautobot/extras/tests/test_customfields.py +115 -7
  35. nautobot/extras/tests/test_relationships.py +7 -1
  36. nautobot/extras/tests/test_views.py +113 -1
  37. nautobot/extras/urls.py +2 -51
  38. nautobot/extras/utils.py +4 -1
  39. nautobot/extras/views.py +39 -133
  40. nautobot/ipam/api/views.py +69 -6
  41. nautobot/ipam/tests/test_api.py +350 -0
  42. nautobot/project-static/docs/404.html +11 -34
  43. nautobot/project-static/docs/apps/index.html +11 -34
  44. nautobot/project-static/docs/apps/nautobot-apps.html +11 -34
  45. nautobot/project-static/docs/assets/javascripts/{bundle.56ea9cef.min.js → bundle.50899def.min.js} +2 -2
  46. nautobot/project-static/docs/assets/javascripts/{bundle.56ea9cef.min.js.map → bundle.50899def.min.js.map} +2 -2
  47. nautobot/project-static/docs/assets/stylesheets/{main.342714a4.min.css → main.7e37652d.min.css} +1 -1
  48. nautobot/project-static/docs/assets/stylesheets/{main.342714a4.min.css.map → main.7e37652d.min.css.map} +1 -1
  49. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +11 -34
  50. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +11 -34
  51. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +11 -34
  52. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +11 -34
  53. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +11 -34
  54. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +11 -34
  55. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +11 -34
  56. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +11 -34
  57. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +11 -34
  58. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +11 -34
  59. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +11 -34
  60. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +11 -34
  61. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +11 -34
  62. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +11 -34
  63. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +11 -34
  64. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +11 -34
  65. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +11 -34
  66. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +11 -34
  67. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +11 -34
  68. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +11 -34
  69. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +11 -34
  70. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +11 -34
  71. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +11 -34
  72. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +11 -34
  73. nautobot/project-static/docs/development/apps/api/configuration-view.html +11 -34
  74. nautobot/project-static/docs/development/apps/api/database-backend-config.html +11 -34
  75. nautobot/project-static/docs/development/apps/api/models/django-admin.html +11 -34
  76. nautobot/project-static/docs/development/apps/api/models/global-search.html +11 -34
  77. nautobot/project-static/docs/development/apps/api/models/graphql.html +11 -34
  78. nautobot/project-static/docs/development/apps/api/models/index.html +11 -34
  79. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +11 -34
  80. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +11 -34
  81. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +11 -34
  82. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +11 -34
  83. nautobot/project-static/docs/development/apps/api/platform-features/index.html +11 -34
  84. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +11 -34
  85. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +11 -34
  86. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +11 -34
  87. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +11 -34
  88. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +11 -34
  89. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +11 -34
  90. nautobot/project-static/docs/development/apps/api/prometheus.html +11 -34
  91. nautobot/project-static/docs/development/apps/api/setup.html +11 -34
  92. nautobot/project-static/docs/development/apps/api/testing.html +11 -34
  93. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +11 -34
  94. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +11 -34
  95. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +11 -34
  96. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +11 -34
  97. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +11 -34
  98. nautobot/project-static/docs/development/apps/api/views/base-template.html +11 -34
  99. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +11 -34
  100. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +11 -34
  101. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +11 -34
  102. nautobot/project-static/docs/development/apps/api/views/index.html +11 -34
  103. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +11 -34
  104. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +11 -34
  105. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +11 -34
  106. nautobot/project-static/docs/development/apps/api/views/notes.html +11 -34
  107. nautobot/project-static/docs/development/apps/api/views/rest-api.html +11 -34
  108. nautobot/project-static/docs/development/apps/api/views/urls.html +11 -34
  109. nautobot/project-static/docs/development/apps/index.html +11 -34
  110. nautobot/project-static/docs/development/apps/migration/code-updates.html +11 -34
  111. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +11 -34
  112. nautobot/project-static/docs/development/apps/migration/from-v1.html +11 -34
  113. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +11 -34
  114. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +11 -34
  115. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +11 -34
  116. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +11 -34
  117. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +11 -34
  118. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +11 -34
  119. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +11 -34
  120. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +11 -34
  121. nautobot/project-static/docs/development/apps/porting-from-netbox.html +11 -34
  122. nautobot/project-static/docs/development/core/application-registry.html +139 -133
  123. nautobot/project-static/docs/development/core/best-practices.html +11 -34
  124. nautobot/project-static/docs/development/core/bootstrap-ui.html +11 -34
  125. nautobot/project-static/docs/development/core/caching.html +11 -34
  126. nautobot/project-static/docs/development/core/controllers.html +11 -34
  127. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +11 -34
  128. nautobot/project-static/docs/development/core/generic-views.html +11 -34
  129. nautobot/project-static/docs/development/core/getting-started.html +11 -34
  130. nautobot/project-static/docs/development/core/homepage.html +11 -34
  131. nautobot/project-static/docs/development/core/index.html +11 -34
  132. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +11 -34
  133. nautobot/project-static/docs/development/core/model-checklist.html +11 -34
  134. nautobot/project-static/docs/development/core/model-features.html +11 -34
  135. nautobot/project-static/docs/development/core/natural-keys.html +11 -34
  136. nautobot/project-static/docs/development/core/navigation-menu.html +11 -34
  137. nautobot/project-static/docs/development/core/release-checklist.html +11 -34
  138. nautobot/project-static/docs/development/core/role-internals.html +11 -34
  139. nautobot/project-static/docs/development/core/settings.html +11 -34
  140. nautobot/project-static/docs/development/core/style-guide.html +11 -34
  141. nautobot/project-static/docs/development/core/templates.html +11 -34
  142. nautobot/project-static/docs/development/core/testing.html +11 -34
  143. nautobot/project-static/docs/development/core/ui-component-framework.html +11 -34
  144. nautobot/project-static/docs/development/core/user-preferences.html +11 -34
  145. nautobot/project-static/docs/development/index.html +11 -34
  146. nautobot/project-static/docs/development/jobs/getting-started.html +11 -34
  147. nautobot/project-static/docs/development/jobs/index.html +11 -34
  148. nautobot/project-static/docs/development/jobs/installation.html +11 -34
  149. nautobot/project-static/docs/development/jobs/job-extensions.html +11 -34
  150. nautobot/project-static/docs/development/jobs/job-logging.html +11 -34
  151. nautobot/project-static/docs/development/jobs/job-patterns.html +11 -34
  152. nautobot/project-static/docs/development/jobs/job-structure.html +11 -34
  153. nautobot/project-static/docs/development/jobs/migration/from-v1.html +11 -34
  154. nautobot/project-static/docs/development/jobs/testing.html +11 -34
  155. nautobot/project-static/docs/index.html +11 -34
  156. nautobot/project-static/docs/overview/application_stack.html +11 -34
  157. nautobot/project-static/docs/overview/design_philosophy.html +11 -34
  158. nautobot/project-static/docs/release-notes/index.html +11 -34
  159. nautobot/project-static/docs/release-notes/version-1.0.html +11 -34
  160. nautobot/project-static/docs/release-notes/version-1.1.html +11 -34
  161. nautobot/project-static/docs/release-notes/version-1.2.html +11 -34
  162. nautobot/project-static/docs/release-notes/version-1.3.html +11 -34
  163. nautobot/project-static/docs/release-notes/version-1.4.html +11 -34
  164. nautobot/project-static/docs/release-notes/version-1.5.html +11 -34
  165. nautobot/project-static/docs/release-notes/version-1.6.html +11 -34
  166. nautobot/project-static/docs/release-notes/version-2.0.html +11 -34
  167. nautobot/project-static/docs/release-notes/version-2.1.html +11 -34
  168. nautobot/project-static/docs/release-notes/version-2.2.html +11 -34
  169. nautobot/project-static/docs/release-notes/version-2.3.html +11 -34
  170. nautobot/project-static/docs/release-notes/version-2.4.html +171 -34
  171. nautobot/project-static/docs/requirements.txt +1 -1
  172. nautobot/project-static/docs/search/search_index.json +1 -1
  173. nautobot/project-static/docs/sitemap.xml +299 -299
  174. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  175. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +11 -34
  176. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +11 -34
  177. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +11 -34
  178. nautobot/project-static/docs/user-guide/administration/configuration/index.html +11 -34
  179. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +11 -34
  180. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +14 -37
  181. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +11 -34
  182. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +11 -34
  183. nautobot/project-static/docs/user-guide/administration/guides/docker.html +11 -34
  184. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +11 -34
  185. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +11 -34
  186. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +11 -34
  187. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +11 -34
  188. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +11 -34
  189. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +11 -34
  190. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +11 -34
  191. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +11 -34
  192. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +11 -34
  193. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +11 -34
  194. nautobot/project-static/docs/user-guide/administration/installation/index.html +11 -34
  195. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +11 -34
  196. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +11 -34
  197. nautobot/project-static/docs/user-guide/administration/installation/services.html +11 -34
  198. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +11 -34
  199. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +11 -34
  200. nautobot/project-static/docs/user-guide/administration/security/index.html +11 -34
  201. nautobot/project-static/docs/user-guide/administration/security/notices.html +11 -34
  202. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +19 -39
  203. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +11 -34
  204. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +11 -34
  205. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +11 -34
  206. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +11 -34
  207. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +11 -34
  208. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +11 -34
  209. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +11 -34
  210. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +11 -34
  211. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +11 -34
  212. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +11 -34
  213. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +11 -34
  214. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +11 -34
  215. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +11 -34
  216. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +11 -34
  217. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +11 -34
  218. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +11 -34
  219. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +11 -34
  220. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +11 -34
  221. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +11 -34
  222. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +11 -34
  223. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +11 -34
  224. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +11 -34
  225. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +11 -34
  226. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +11 -34
  227. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +11 -34
  228. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +11 -34
  229. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +11 -34
  230. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +11 -34
  231. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +11 -34
  232. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +11 -34
  233. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +11 -34
  234. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +11 -34
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +11 -34
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +11 -34
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +11 -34
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +11 -34
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +11 -34
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +14 -37
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +11 -34
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +11 -34
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +19 -52
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +11 -34
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +11 -34
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +11 -34
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +11 -34
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +14 -37
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +11 -34
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +11 -34
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +11 -34
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +11 -34
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +11 -34
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +11 -34
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +11 -34
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +11 -34
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +11 -34
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +11 -34
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +11 -34
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +11 -34
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +11 -34
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +11 -34
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +11 -34
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +11 -34
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +11 -34
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +11 -34
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +11 -34
  268. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +11 -34
  269. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +11 -34
  270. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +11 -34
  271. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +11 -34
  272. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +11 -34
  273. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +11 -34
  274. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +11 -34
  275. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +11 -34
  276. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +11 -34
  277. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +11 -34
  278. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +11 -34
  279. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +11 -34
  280. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +11 -34
  281. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +11 -34
  282. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +11 -34
  283. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +11 -34
  284. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +11 -34
  285. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +11 -34
  286. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +11 -34
  287. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +11 -34
  288. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +11 -34
  289. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +11 -34
  290. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +11 -34
  291. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +11 -34
  292. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +11 -34
  293. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +11 -34
  294. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +11 -34
  295. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +11 -34
  296. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +11 -34
  297. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +11 -34
  298. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +11 -34
  299. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +11 -34
  300. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +11 -34
  301. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +11 -34
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +11 -34
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +11 -34
  304. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +11 -34
  305. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +11 -34
  306. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +11 -34
  307. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +11 -34
  308. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +11 -34
  309. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +11 -34
  310. nautobot/project-static/docs/user-guide/index.html +11 -34
  311. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +11 -34
  312. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +11 -34
  313. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +11 -34
  314. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +11 -34
  315. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +11 -34
  316. nautobot/project-static/docs/user-guide/platform-functionality/events.html +11 -34
  317. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +11 -34
  318. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +11 -34
  319. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +11 -34
  320. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +11 -34
  321. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +11 -34
  322. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +11 -34
  323. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +11 -34
  324. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +11 -34
  325. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +11 -34
  326. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +11 -34
  327. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +11 -34
  328. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +11 -34
  329. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +11 -34
  330. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +11 -34
  331. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +11 -34
  332. nautobot/project-static/docs/user-guide/platform-functionality/note.html +11 -34
  333. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +11 -34
  334. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +11 -34
  335. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +11 -34
  336. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +11 -34
  337. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +11 -34
  338. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +11 -34
  339. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +11 -34
  340. nautobot/project-static/docs/user-guide/platform-functionality/role.html +11 -34
  341. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +11 -34
  342. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +11 -34
  343. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +11 -34
  344. nautobot/project-static/docs/user-guide/platform-functionality/status.html +11 -34
  345. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +11 -34
  346. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +11 -34
  347. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +11 -34
  348. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +11 -34
  349. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +11 -34
  350. nautobot/tenancy/api/views.py +2 -1
  351. {nautobot-2.4.13.dist-info → nautobot-2.4.14.dist-info}/METADATA +5 -5
  352. {nautobot-2.4.13.dist-info → nautobot-2.4.14.dist-info}/RECORD +356 -349
  353. {nautobot-2.4.13.dist-info → nautobot-2.4.14.dist-info}/LICENSE.txt +0 -0
  354. {nautobot-2.4.13.dist-info → nautobot-2.4.14.dist-info}/NOTICE +0 -0
  355. {nautobot-2.4.13.dist-info → nautobot-2.4.14.dist-info}/WHEEL +0 -0
  356. {nautobot-2.4.13.dist-info → nautobot-2.4.14.dist-info}/entry_points.txt +0 -0
@@ -768,6 +768,299 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
768
768
  response = self.client.get(url, **self.header)
769
769
  self.assertEqual(len(response.data), 6) # 8 - 2 because prefix.type = network
770
770
 
771
+ def test_ipv4_prefix_list_available_ips_with_limit(self):
772
+ """
773
+ Test retrieval with a limit of all available IP addresses within a parent IPv4 prefix.
774
+ """
775
+ prefix = Prefix.objects.create(
776
+ prefix="192.0.3.0/29",
777
+ type=choices.PrefixTypeChoices.TYPE_POOL,
778
+ namespace=self.namespace,
779
+ status=self.status,
780
+ )
781
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
782
+ limit = 2
783
+ url = self.add_query_params_to_url(
784
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
785
+ query_dict={"limit": limit},
786
+ )
787
+ response = self.client.get(url, **self.header)
788
+ self.assertEqual(len(response.data), limit)
789
+
790
+ def test_ipv6_prefix_list_available_ips_with_limit(self):
791
+ """
792
+ Test retrieval with a limit of all available IP addresses within a parent IPv6 prefix.
793
+ """
794
+ prefix = Prefix.objects.create(
795
+ prefix="fdff:abcd:ffff:fc00::/54",
796
+ type=choices.PrefixTypeChoices.TYPE_POOL,
797
+ namespace=self.namespace,
798
+ status=self.status,
799
+ )
800
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
801
+ limit = 100
802
+ url = self.add_query_params_to_url(
803
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
804
+ query_dict={"limit": limit},
805
+ )
806
+ response = self.client.get(url, **self.header)
807
+ self.assertEqual(len(response.data), limit)
808
+
809
+ def test_range_parameters_validation(self):
810
+ """
811
+ Test detection of incorrect range_start or range_end parameters.
812
+ """
813
+ prefix = Prefix.objects.create(
814
+ prefix="fdff:abcd:ffff:fc00::/54",
815
+ type=choices.PrefixTypeChoices.TYPE_POOL,
816
+ namespace=self.namespace,
817
+ status=self.status,
818
+ )
819
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
820
+
821
+ range_start = "fdffZabcdZfffZfc01" # purposefully incorrect parameter
822
+ url = self.add_query_params_to_url(
823
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
824
+ query_dict={"range_start": range_start},
825
+ )
826
+ response = self.client.get(url, **self.header)
827
+ self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
828
+ self.assertIn("detail", response.data)
829
+
830
+ range_end = "fdffZabcdZfffZfcff" # purposefully incorrect parameter
831
+ url = self.add_query_params_to_url(
832
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
833
+ query_dict={"range_end": range_end},
834
+ )
835
+ response = self.client.get(url, **self.header)
836
+ self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
837
+ self.assertIn("detail", response.data)
838
+
839
+ def test_list_available_ips_with_range_start(self):
840
+ """
841
+ Test retrieval with range_start parameter of all available IP addresses within a parent prefix.
842
+ """
843
+ prefix = Prefix.objects.create(
844
+ prefix="192.0.3.0/29",
845
+ type=choices.PrefixTypeChoices.TYPE_POOL,
846
+ namespace=self.namespace,
847
+ status=self.status,
848
+ )
849
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
850
+ range_start = "192.0.3.2"
851
+ url = self.add_query_params_to_url(
852
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
853
+ query_dict={"range_start": range_start},
854
+ )
855
+ response = self.client.get(url, **self.header)
856
+ self.assertEqual(len(response.data), 6) # because prefix type = pool
857
+ self.assertIn("address", response.data[0])
858
+ self.assertIn("192.0.3.2/29", response.data[0]["address"])
859
+
860
+ def test_list_available_ips_with_range_start_ipv6(self):
861
+ """
862
+ Test retrieval with range_start parameter of all available IPv6 addresses within a parent prefix.
863
+ """
864
+ prefix = Prefix.objects.create(
865
+ prefix="fdff:abcd:ffff:fc00::/54",
866
+ type=choices.PrefixTypeChoices.TYPE_POOL,
867
+ namespace=self.namespace,
868
+ status=self.status,
869
+ )
870
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
871
+ range_start = "fdff:abcd:ffff:ffff:ffff:ffff:ffff:fff0"
872
+ url = self.add_query_params_to_url(
873
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
874
+ query_dict={"range_start": range_start},
875
+ )
876
+ response = self.client.get(url, **self.header)
877
+ self.assertEqual(len(response.data), 16)
878
+ self.assertIn("address", response.data[0])
879
+ self.assertIn("fdff:abcd:ffff:ffff:ffff:ffff:ffff:fff0/54", response.data[0]["address"])
880
+
881
+ def test_list_available_ips_with_range_end(self):
882
+ """
883
+ Test retrieval with range_end parameter of all available IP addresses within a parent prefix.
884
+ """
885
+ prefix = Prefix.objects.create(
886
+ prefix="192.0.3.0/29",
887
+ type=choices.PrefixTypeChoices.TYPE_POOL,
888
+ namespace=self.namespace,
889
+ status=self.status,
890
+ )
891
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
892
+ range_end = "192.0.3.5"
893
+ url = self.add_query_params_to_url(
894
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
895
+ query_dict={"range_end": range_end},
896
+ )
897
+ response = self.client.get(url, **self.header)
898
+ self.assertEqual(len(response.data), 6) # because prefix type = pool
899
+ self.assertIn("address", response.data[-1])
900
+ self.assertIn("192.0.3.5/29", response.data[-1]["address"])
901
+
902
+ def test_list_available_ips_with_range_end_ipv6(self):
903
+ """
904
+ Test retrieval with range_end parameter of all available IPv6 addresses within a parent prefix.
905
+ """
906
+ prefix = Prefix.objects.create(
907
+ prefix="fdff:abcd:ffff:fc00::/54",
908
+ type=choices.PrefixTypeChoices.TYPE_POOL,
909
+ namespace=self.namespace,
910
+ status=self.status,
911
+ )
912
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
913
+ range_end = "fdff:abcd:ffff:fc00::000f"
914
+ url = self.add_query_params_to_url(
915
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
916
+ query_dict={"range_end": range_end},
917
+ )
918
+ response = self.client.get(url, **self.header)
919
+ self.assertEqual(len(response.data), 16) # because prefix type = pool
920
+ self.assertIn("address", response.data[-1])
921
+ self.assertIn("fdff:abcd:ffff:fc00::f/54", response.data[-1]["address"])
922
+
923
+ def test_list_available_ips_with_range_start_and_end(self):
924
+ """
925
+ Test retrieval with range_end parameter of all available IP addresses within a parent prefix.
926
+ """
927
+ prefix = Prefix.objects.create(
928
+ prefix="192.0.3.0/29",
929
+ type=choices.PrefixTypeChoices.TYPE_POOL,
930
+ namespace=self.namespace,
931
+ status=self.status,
932
+ )
933
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
934
+ range_start = "192.0.3.2"
935
+ range_end = "192.0.3.5"
936
+ url = self.add_query_params_to_url(
937
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
938
+ query_dict={"range_start": range_start, "range_end": range_end},
939
+ )
940
+ response = self.client.get(url, **self.header)
941
+ self.assertEqual(len(response.data), 4)
942
+ self.assertIn("address", response.data[0])
943
+ self.assertIn("address", response.data[-1])
944
+ self.assertIn("192.0.3.2/29", response.data[0]["address"])
945
+ self.assertIn("192.0.3.5/29", response.data[-1]["address"])
946
+
947
+ def test_list_available_ips_with_range_start_and_end_ipv6(self):
948
+ """
949
+ Test retrieval with range_end parameter of all available IPv6 addresses within a parent prefix.
950
+ """
951
+ prefix = Prefix.objects.create(
952
+ prefix="fdff:abcd:ffff:fc00::/54",
953
+ type=choices.PrefixTypeChoices.TYPE_POOL,
954
+ namespace=self.namespace,
955
+ status=self.status,
956
+ )
957
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
958
+ range_start = "fdff:abcd:ffff:fcff::"
959
+ range_end = "fdff:abcd:ffff:fcff::f"
960
+ url = self.add_query_params_to_url(
961
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
962
+ query_dict={"range_start": range_start, "range_end": range_end},
963
+ )
964
+ response = self.client.get(url, **self.header)
965
+ self.assertEqual(len(response.data), 16)
966
+ self.assertIn("address", response.data[0])
967
+ self.assertIn("address", response.data[-1])
968
+ self.assertIn("fdff:abcd:ffff:fcff::/54", response.data[0]["address"])
969
+ self.assertIn("fdff:abcd:ffff:fcff::f/54", response.data[-1]["address"])
970
+
971
+ def test_list_available_ips_with_range_start_and_limit(self):
972
+ """
973
+ Test retrieval with range_start and limit of all available IP addresses within a parent prefix.
974
+ """
975
+ prefix = Prefix.objects.create(
976
+ prefix="192.0.3.0/29",
977
+ type=choices.PrefixTypeChoices.TYPE_POOL,
978
+ namespace=self.namespace,
979
+ status=self.status,
980
+ )
981
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
982
+ range_start = "192.0.3.2"
983
+ limit = 2
984
+ url = self.add_query_params_to_url(
985
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
986
+ query_dict={"range_start": range_start, "limit": limit},
987
+ )
988
+ response = self.client.get(url, **self.header)
989
+ self.assertEqual(len(response.data), limit)
990
+ self.assertIn("address", response.data[0])
991
+ self.assertIn("192.0.3.2/29", response.data[0]["address"])
992
+
993
+ def test_list_available_ips_with_range_start_and_limit_ipv6(self):
994
+ """
995
+ Test retrieval with range_start and limit of all available IPv6 addresses within a parent prefix.
996
+ """
997
+ prefix = Prefix.objects.create(
998
+ prefix="fdff:abcd:ffff:fc00::/54",
999
+ type=choices.PrefixTypeChoices.TYPE_POOL,
1000
+ namespace=self.namespace,
1001
+ status=self.status,
1002
+ )
1003
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
1004
+ range_start = "fdff:abcd:ffff:ffff:ffff:ffff:ffff:fff0"
1005
+ limit = 2
1006
+ url = self.add_query_params_to_url(
1007
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
1008
+ query_dict={"range_start": range_start, "limit": limit},
1009
+ )
1010
+ response = self.client.get(url, **self.header)
1011
+ self.assertEqual(len(response.data), limit)
1012
+ self.assertIn("fdff:abcd:ffff:ffff:ffff:ffff:ffff:fff0/54", response.data[0]["address"])
1013
+
1014
+ def test_list_available_ips_with_range_start_range_end_and_limit(self):
1015
+ """
1016
+ Test retrieval with range_start, range_end and limit of all available IP addresses within a parent prefix.
1017
+ """
1018
+ prefix = Prefix.objects.create(
1019
+ prefix="192.0.3.0/29",
1020
+ type=choices.PrefixTypeChoices.TYPE_POOL,
1021
+ namespace=self.namespace,
1022
+ status=self.status,
1023
+ )
1024
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
1025
+ range_start = "192.0.3.2"
1026
+ range_end = "192.0.3.5"
1027
+ limit = 2
1028
+ url = self.add_query_params_to_url(
1029
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
1030
+ query_dict={"range_start": range_start, "range_end": range_end, "limit": limit},
1031
+ )
1032
+ response = self.client.get(url, **self.header)
1033
+ self.assertEqual(len(response.data), limit)
1034
+ self.assertIn("address", response.data[0])
1035
+ self.assertIn("address", response.data[-1])
1036
+ self.assertIn("192.0.3.2/29", response.data[0]["address"])
1037
+ self.assertIn("192.0.3.3/29", response.data[-1]["address"]) # .3 is the next one
1038
+
1039
+ def test_list_available_ips_with_range_start_range_end_and_limit_ipv6(self):
1040
+ """
1041
+ Test retrieval with range_start, range_end and limit of all available IPv6 addresses within a parent prefix.
1042
+ """
1043
+ prefix = Prefix.objects.create(
1044
+ prefix="fdff:abcd:ffff:fc00::/54",
1045
+ type=choices.PrefixTypeChoices.TYPE_POOL,
1046
+ namespace=self.namespace,
1047
+ status=self.status,
1048
+ )
1049
+ self.add_permissions("ipam.view_prefix", "ipam.view_ipaddress")
1050
+ range_start = "fdff:abcd:ffff:fcff::"
1051
+ range_end = "fdff:abcd:ffff:fcff::f"
1052
+ limit = 2
1053
+ url = self.add_query_params_to_url(
1054
+ url=reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
1055
+ query_dict={"range_start": range_start, "range_end": range_end, "limit": limit},
1056
+ )
1057
+ response = self.client.get(url, **self.header)
1058
+ self.assertEqual(len(response.data), limit)
1059
+ self.assertIn("address", response.data[0])
1060
+ self.assertIn("address", response.data[-1])
1061
+ self.assertIn("fdff:abcd:ffff:fcff::/54", response.data[0]["address"])
1062
+ self.assertIn("fdff:abcd:ffff:fcff::1/54", response.data[-1]["address"])
1063
+
771
1064
  def test_list_available_ips_calculate_child_ips(self):
772
1065
  """
773
1066
  Test retrieval of all available IP addresses when child IP's exists.
@@ -871,6 +1164,36 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
871
1164
  self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
872
1165
  self.assertIn("detail", response.data)
873
1166
 
1167
+ def test_create_single_available_ip_with_range_start(self):
1168
+ prefix = Prefix.objects.create(
1169
+ prefix="192.0.2.0/29",
1170
+ namespace=self.namespace,
1171
+ type=choices.PrefixTypeChoices.TYPE_NETWORK,
1172
+ status=self.status,
1173
+ )
1174
+ self.add_permissions("ipam.view_prefix", "ipam.view_namespace", "ipam.add_ipaddress", "extras.view_status")
1175
+
1176
+ range_start = "192.0.2.3"
1177
+ url = self.add_query_params_to_url(
1178
+ reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
1179
+ {"range_start": range_start},
1180
+ )
1181
+ # Create available IPs with range start
1182
+ for i in range(1, 5):
1183
+ data = {
1184
+ "description": f"Test IP {i}",
1185
+ "status": self.status.pk,
1186
+ }
1187
+ response = self.client.post(url, data, format="json", **self.header)
1188
+ self.assertHttpStatus(response, status.HTTP_201_CREATED)
1189
+ self.assertEqual(str(response.data["parent"]["url"]), self.absolute_api_url(prefix))
1190
+ self.assertEqual(response.data["description"], data["description"])
1191
+
1192
+ # Next creation request with range start should be denied
1193
+ response = self.client.post(url, {"status": self.status.pk}, format="json", **self.header)
1194
+ self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
1195
+ self.assertIn("detail", response.data)
1196
+
874
1197
  def test_create_multiple_available_ips(self):
875
1198
  """
876
1199
  Test the creation of available IP addresses within a parent prefix.
@@ -911,6 +1234,33 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
911
1234
  self.assertIn("ipcf", response.data[0]["custom_fields"])
912
1235
  self.assertEqual("1", response.data[0]["custom_fields"]["ipcf"])
913
1236
 
1237
+ def test_create_multiple_available_ips_with_range_start(self):
1238
+ prefix = Prefix.objects.create(
1239
+ prefix="192.0.2.0/29",
1240
+ type=choices.PrefixTypeChoices.TYPE_NETWORK,
1241
+ namespace=self.namespace,
1242
+ status=self.status,
1243
+ )
1244
+ self.add_permissions("ipam.view_prefix", "ipam.add_ipaddress", "ipam.view_namespace", "extras.view_status")
1245
+
1246
+ range_start = "192.0.2.3"
1247
+ url = self.add_query_params_to_url(
1248
+ reverse("ipam-api:prefix-available-ips", kwargs={"pk": prefix.pk}),
1249
+ {"range_start": range_start},
1250
+ )
1251
+ # create all 5 available IPs in a single request
1252
+ data = [
1253
+ {"description": f"Test IP {i}", "status": self.status.pk, "custom_fields": {"ipcf": str(i)}}
1254
+ for i in range(1, 5)
1255
+ ]
1256
+ response = self.client.post(url, data, format="json", **self.header)
1257
+ self.assertHttpStatus(response, status.HTTP_201_CREATED)
1258
+ self.assertEqual(len(response.data), 4)
1259
+ # next attempt with only one IP requested should fail (prefix space exhausted)
1260
+ data = data[0]
1261
+ response = self.client.post(url, data, format="json", **self.header)
1262
+ self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
1263
+
914
1264
  def test_create_available_ips_with_permissions_constraint(self):
915
1265
  # Prepare prefix and permissions
916
1266
  prefix = Prefix.objects.create(
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
  <link rel="icon" href="/projects/core/en/stable/assets/favicon.ico">
15
- <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.15">
15
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.16">
16
16
 
17
17
 
18
18
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.342714a4.min.css">
23
+ <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.7e37652d.min.css">
24
24
 
25
25
 
26
26
  <link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/palette.06af60db.min.css">
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- <style>:root{--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20448%20512%22%3E%3C%21--%21%20Font%20Awesome%20Free%206.7.2%20by%20%40fontawesome%20-%20https%3A//fontawesome.com%20License%20-%20https%3A//fontawesome.com/license/free%20%28Icons%3A%20CC%20BY%204.0%2C%20Fonts%3A%20SIL%20OFL%201.1%2C%20Code%3A%20MIT%20License%29%20Copyright%202024%20Fonticons%2C%20Inc.--%3E%3Cpath%20d%3D%22M288%200H128c-17.7%200-32%2014.3-32%2032s14.3%2032%2032%2032v132.8c0%2011.8-3.3%2023.5-9.5%2033.5L10.3%20406.2C3.6%20417.2%200%20429.7%200%20442.6%200%20480.9%2031.1%20512%2069.4%20512h309.2c38.3%200%2069.4-31.1%2069.4-69.4%200-12.8-3.6-25.4-10.3-36.4L329.5%20230.4c-6.2-10.1-9.5-21.7-9.5-33.5V64c17.7%200%2032-14.3%2032-32S337.7%200%20320%200zm-96%20196.8V64h64v132.8c0%2023.7%206.6%2046.9%2019%2067.1l34.5%2056.1h-171l34.5-56.1c12.4-20.2%2019-43.4%2019-67.1%22/%3E%3C/svg%3E');}</style>
35
+ <style>:root{--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20448%20512%22%3E%3C%21--%21%20Font%20Awesome%20Free%207.0.0%20by%20%40fontawesome%20-%20https%3A//fontawesome.com%20License%20-%20https%3A//fontawesome.com/license/free%20%28Icons%3A%20CC%20BY%204.0%2C%20Fonts%3A%20SIL%20OFL%201.1%2C%20Code%3A%20MIT%20License%29%20Copyright%202025%20Fonticons%2C%20Inc.--%3E%3Cpath%20fill%3D%22currentColor%22%20d%3D%22M288%200H128c-17.7%200-32%2014.3-32%2032s14.3%2032%2032%2032v151.5L7.5%20426.3C2.6%20435%200%20444.7%200%20454.7%200%20486.4%2025.6%20512%2057.3%20512h333.4c31.6%200%2057.3-25.6%2057.3-57.3%200-10-2.6-19.8-7.5-28.4L320%20215.5V64c17.7%200%2032-14.3%2032-32S337.7%200%20320%200zm-96%20215.5V64h64v151.5c0%2011.1%202.9%2022.1%208.4%2031.8L306%20320H142l41.6-72.7c5.5-9.7%208.4-20.6%208.4-31.8%22/%3E%3C/svg%3E');}</style>
36
36
 
37
37
 
38
38
 
@@ -200,7 +200,7 @@
200
200
  <a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
201
201
  <div class="md-source__icon md-icon">
202
202
 
203
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
203
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
204
204
  </div>
205
205
  <div class="md-source__repository">
206
206
  GitHub
@@ -370,7 +370,7 @@
370
370
  <a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
371
371
  <div class="md-source__icon md-icon">
372
372
 
373
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
373
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
374
374
  </div>
375
375
  <div class="md-source__repository">
376
376
  GitHub
@@ -3982,29 +3982,6 @@
3982
3982
 
3983
3983
 
3984
3984
 
3985
- <li class="md-nav__item">
3986
- <a href="/projects/core/en/stable/user-guide/core-data-model/dcim/inventoryitem.html" class="md-nav__link">
3987
-
3988
-
3989
-
3990
- <span class="md-ellipsis">
3991
- Inventory Item
3992
-
3993
- </span>
3994
-
3995
-
3996
- </a>
3997
- </li>
3998
-
3999
-
4000
-
4001
-
4002
-
4003
-
4004
-
4005
-
4006
-
4007
-
4008
3985
  <li class="md-nav__item">
4009
3986
  <a href="/projects/core/en/stable/user-guide/core-data-model/dcim/modulebay.html" class="md-nav__link">
4010
3987
 
@@ -10096,7 +10073,7 @@
10096
10073
 
10097
10074
 
10098
10075
  <a href="https://blog.networktocode.com/blog/tags/nautobot" target="_blank" rel="noopener" title="Network to Code Blog" class="md-social__link">
10099
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M0 64c0-17.7 14.3-32 32-32 229.8 0 416 186.2 416 416 0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96 14.3 96 0 81.7 0 64m0 352a64 64 0 1 1 128 0 64 64 0 1 1-128 0m32-256c159.1 0 288 128.9 288 288 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224-17.7 0-32-14.3-32-32s14.3-32 32-32"/></svg>
10076
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M0 64c0-17.7 14.3-32 32-32 229.8 0 416 186.2 416 416 0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96 14.3 96 0 81.7 0 64m0 352a64 64 0 1 1 128 0 64 64 0 1 1-128 0m32-256c159.1 0 288 128.9 288 288 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224-17.7 0-32-14.3-32-32s14.3-32 32-32"/></svg>
10100
10077
  </a>
10101
10078
 
10102
10079
 
@@ -10104,7 +10081,7 @@
10104
10081
 
10105
10082
 
10106
10083
  <a href="https://www.youtube.com/playlist?list=PLjA0bhxgryJ2Ts4GJMDA-tPzVWEncv4pb" target="_blank" rel="noopener" title="Nautobot Videos" class="md-social__link">
10107
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z"/></svg>
10084
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M549.7 124.1c-6.2-23.7-24.8-42.3-48.3-48.6C458.9 64 288.1 64 288.1 64S117.3 64 74.7 75.5c-23.5 6.3-42 24.9-48.3 48.6C15 167 15 256.4 15 256.4s0 89.4 11.4 132.3c6.3 23.6 24.8 41.5 48.3 47.8C117.3 448 288.1 448 288.1 448s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zM232.2 337.6V175.2l142.7 81.2z"/></svg>
10108
10085
  </a>
10109
10086
 
10110
10087
 
@@ -10112,7 +10089,7 @@
10112
10089
 
10113
10090
 
10114
10091
  <a href="https://www.networktocode.com/community/" target="_blank" rel="noopener" title="Network to Code Community" class="md-social__link">
10115
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1s21.16-47.06 47.06-47.06h47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06S448 171 448 196.9s-21.16 47.06-47.06 47.06h-47.06zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06S309 480 283.1 480s-47.06-21.16-47.06-47.06v-47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06s21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06z"/></svg>
10092
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M94.1 315.1c0 25.9-21.2 47.1-47.1 47.1S0 341 0 315.1 21.2 268 47.1 268h47.1v47.1zm23.7 0c0-25.9 21.2-47.1 47.1-47.1s47.1 21.2 47.1 47.1v117.8c0 25.9-21.2 47.1-47.1 47.1s-47.1-21.2-47.1-47.1zm47.1-189c-25.9 0-47.1-21.2-47.1-47.1s21.2-47 47.1-47S212 53.2 212 79.1v47.1h-47.1zm0 23.7c25.9 0 47.1 21.2 47.1 47.1S190.8 244 164.9 244H47.1C21.2 244 0 222.8 0 196.9s21.2-47.1 47.1-47.1zm189 47.1c0-25.9 21.2-47.1 47.1-47.1s47 21.2 47 47.1-21.2 47.1-47.1 47.1h-47.1v-47.1zm-23.7 0c0 25.9-21.2 47.1-47.1 47.1S236 222.8 236 196.9V79.1c0-25.9 21.2-47.1 47.1-47.1s47.1 21.2 47.1 47.1zm-47.1 189c25.9 0 47.1 21.2 47.1 47.1s-21.2 47-47.1 47-47.1-21.2-47.1-47.1v-47.1h47.1zm0-23.7c-25.9 0-47.1-21.2-47.1-47.1s21.2-47.1 47.1-47.1h117.8c25.9 0 47.1 21.2 47.1 47.1s-21.2 47.1-47.1 47.1z"/></svg>
10116
10093
  </a>
10117
10094
 
10118
10095
 
@@ -10120,7 +10097,7 @@
10120
10097
 
10121
10098
 
10122
10099
  <a href="https://github.com/nautobot/nautobot" target="_blank" rel="noopener" title="GitHub Repo" class="md-social__link">
10123
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
10100
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
10124
10101
  </a>
10125
10102
 
10126
10103
 
@@ -10128,7 +10105,7 @@
10128
10105
 
10129
10106
 
10130
10107
  <a href="https://twitter.com/networktocode" target="_blank" rel="noopener" title="Network to Code Twitter" class="md-social__link">
10131
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253"/></svg>
10108
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path fill="currentColor" d="M459.4 151.7c.3 4.5.3 9.1.3 13.6 0 138.7-105.6 298.6-298.6 298.6-59.5 0-114.7-17.2-161.1-47.1 8.4 1 16.6 1.3 25.3 1.3 49.1 0 94.2-16.6 130.3-44.8-46.1-1-84.8-31.2-98.1-72.8 6.5 1 13 1.6 19.8 1.6 9.4 0 18.8-1.3 27.6-3.6-48.1-9.7-84.1-52-84.1-103v-1.3c14 7.8 30.2 12.7 47.4 13.3-28.3-18.8-46.8-51-46.8-87.4 0-19.5 5.2-37.4 14.3-53C87.4 130.8 165 172.4 252.1 176.9c-1.6-7.8-2.6-15.9-2.6-24C249.5 95.1 296.3 48 354.4 48c30.2 0 57.5 12.7 76.7 33.1 23.7-4.5 46.5-13.3 66.6-25.3-7.8 24.4-24.4 44.8-46.1 57.8 21.1-2.3 41.6-8.1 60.4-16.2-14.3 20.8-32.2 39.3-52.6 54.3"/></svg>
10132
10109
  </a>
10133
10110
 
10134
10111
  </div>
@@ -10148,7 +10125,7 @@
10148
10125
  <script id="__config" type="application/json">{"base": "/projects/core/en/stable/", "features": ["content.code.annotate", "content.code.copy", "content.tabs.link", "navigation.footer", "navigation.tabs", "navigation.tabs.sticky", "navigation.tracking", "search.highlight", "search.share", "search.suggest"], "search": "/projects/core/en/stable/assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
10149
10126
 
10150
10127
 
10151
- <script src="/projects/core/en/stable/assets/javascripts/bundle.56ea9cef.min.js"></script>
10128
+ <script src="/projects/core/en/stable/assets/javascripts/bundle.50899def.min.js"></script>
10152
10129
 
10153
10130
 
10154
10131
  </body>