nautobot 2.4.16__py3-none-any.whl → 2.4.18__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 (434) hide show
  1. nautobot/apps/utils.py +2 -0
  2. nautobot/apps/views.py +2 -0
  3. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +1 -8
  4. nautobot/circuits/templates/circuits/inc/circuit_termination_speed_fragment.html +9 -0
  5. nautobot/circuits/tests/integration/test_circuit.py +2 -2
  6. nautobot/circuits/views.py +32 -15
  7. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +3 -3
  8. nautobot/cloud/views.py +7 -0
  9. nautobot/core/apps/__init__.py +1 -0
  10. nautobot/core/celery/__init__.py +2 -1
  11. nautobot/core/filters.py +2 -2
  12. nautobot/core/settings.py +1 -0
  13. nautobot/core/settings.yaml +9 -0
  14. nautobot/core/tables.py +21 -23
  15. nautobot/core/templates/components/breadcrumbs.html +19 -0
  16. nautobot/core/templates/components/panel/panel.html +1 -1
  17. nautobot/core/templates/generic/object_changelog.html +0 -2
  18. nautobot/core/templates/generic/object_list.html +15 -12
  19. nautobot/core/templates/generic/object_notes.html +0 -2
  20. nautobot/core/templates/generic/object_retrieve.html +16 -9
  21. nautobot/core/templates/inc/paginator.html +3 -3
  22. nautobot/core/templates/inc/table.html +2 -2
  23. nautobot/core/templatetags/helpers.py +104 -6
  24. nautobot/core/templatetags/ui_framework.py +40 -5
  25. nautobot/core/testing/filters.py +37 -21
  26. nautobot/core/testing/mixins.py +1 -1
  27. nautobot/core/testing/views.py +27 -4
  28. nautobot/core/tests/test_tables.py +43 -6
  29. nautobot/core/tests/test_templatetags_ui_framework.py +146 -0
  30. nautobot/core/tests/test_titles.py +2 -2
  31. nautobot/core/tests/test_ui.py +14 -1
  32. nautobot/core/tests/test_views.py +45 -0
  33. nautobot/core/ui/breadcrumbs.py +13 -8
  34. nautobot/core/ui/bulk_buttons.py +53 -53
  35. nautobot/core/ui/object_detail.py +52 -9
  36. nautobot/core/ui/titles.py +9 -5
  37. nautobot/core/utils/data.py +13 -0
  38. nautobot/core/utils/deprecation.py +2 -0
  39. nautobot/core/views/__init__.py +24 -3
  40. nautobot/core/views/generic.py +42 -17
  41. nautobot/core/views/mixins.py +146 -12
  42. nautobot/core/views/utils.py +117 -0
  43. nautobot/dcim/migrations/0073_alter_powerport_power_factor_and_more.py +41 -0
  44. nautobot/dcim/models/device_component_templates.py +4 -2
  45. nautobot/dcim/models/device_components.py +3 -2
  46. nautobot/dcim/models/devices.py +4 -0
  47. nautobot/dcim/tables/__init__.py +2 -0
  48. nautobot/dcim/tables/devices.py +24 -0
  49. nautobot/dcim/tables/power.py +2 -2
  50. nautobot/dcim/templates/dcim/device/base.html +1 -11
  51. nautobot/dcim/templates/dcim/device_component.html +0 -19
  52. nautobot/dcim/templates/dcim/modulebay_retrieve.html +0 -16
  53. nautobot/dcim/templates/dcim/rack_elevation_list.html +4 -4
  54. nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +1 -50
  55. nautobot/dcim/tests/test_views.py +41 -0
  56. nautobot/dcim/views.py +169 -39
  57. nautobot/extras/filters/mixins.py +1 -1
  58. nautobot/extras/forms/forms.py +15 -0
  59. nautobot/extras/models/customfields.py +45 -9
  60. nautobot/extras/models/groups.py +10 -1
  61. nautobot/extras/models/jobs.py +2 -2
  62. nautobot/extras/plugins/views.py +18 -5
  63. nautobot/extras/tables.py +4 -2
  64. nautobot/extras/templates/extras/configcontext_retrieve.html +1 -1
  65. nautobot/extras/templates/extras/configcontext_update.html +49 -49
  66. nautobot/extras/templates/extras/configcontextschema_retrieve.html +47 -47
  67. nautobot/extras/templates/extras/configcontextschema_update.html +18 -18
  68. nautobot/extras/templates/extras/customfield_retrieve.html +1 -128
  69. nautobot/extras/templates/extras/dynamicgroup.html +2 -99
  70. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -199
  71. nautobot/extras/templates/extras/dynamicgroup_retrieve.html +99 -0
  72. nautobot/extras/templates/extras/dynamicgroup_update.html +199 -0
  73. nautobot/extras/templates/extras/gitrepository.html +2 -82
  74. nautobot/extras/templates/extras/gitrepository_object_edit.html +2 -13
  75. nautobot/extras/templates/extras/gitrepository_retrieve.html +82 -0
  76. nautobot/extras/templates/extras/gitrepository_update.html +13 -0
  77. nautobot/extras/templates/extras/inc/job_table.html +1 -1
  78. nautobot/extras/templates/extras/inc/object_contact_header.html +2 -2
  79. nautobot/extras/templates/extras/note_retrieve.html +1 -53
  80. nautobot/extras/templates/extras/plugin_detail.html +3 -7
  81. nautobot/extras/templates/extras/plugins_list.html +0 -2
  82. nautobot/extras/templates/extras/tag_retrieve.html +1 -1
  83. nautobot/extras/templates/extras/tag_update.html +14 -14
  84. nautobot/extras/templates/extras/team_retrieve.html +1 -1
  85. nautobot/extras/tests/test_dynamicgroups.py +73 -18
  86. nautobot/extras/tests/test_models.py +216 -0
  87. nautobot/extras/tests/test_views.py +7 -2
  88. nautobot/extras/urls.py +2 -94
  89. nautobot/extras/views.py +425 -430
  90. nautobot/ipam/apps.py +1 -0
  91. nautobot/ipam/jobs/__init__.py +10 -0
  92. nautobot/ipam/jobs/cleanup.py +296 -0
  93. nautobot/ipam/models.py +301 -178
  94. nautobot/ipam/querysets.py +3 -3
  95. nautobot/ipam/signals.py +6 -1
  96. nautobot/ipam/templates/ipam/inc/ipadress_edit_header.html +3 -3
  97. nautobot/ipam/templates/ipam/inc/toggle_available.html +2 -2
  98. nautobot/ipam/templates/ipam/ipaddress_assign.html +1 -1
  99. nautobot/ipam/templates/ipam/prefix.html +0 -8
  100. nautobot/ipam/templates/ipam/prefix_list.html +1 -1
  101. nautobot/ipam/templates/ipam/vlan_retrieve.html +1 -77
  102. nautobot/ipam/tests/test_api.py +5 -0
  103. nautobot/ipam/tests/test_jobs.py +454 -0
  104. nautobot/ipam/tests/test_models.py +677 -122
  105. nautobot/ipam/tests/test_querysets.py +46 -0
  106. nautobot/ipam/tests/test_views.py +40 -164
  107. nautobot/ipam/urls.py +0 -11
  108. nautobot/ipam/utils/migrations.py +1 -1
  109. nautobot/ipam/utils/testing.py +9 -4
  110. nautobot/ipam/views.py +175 -235
  111. nautobot/project-static/docs/404.html +9 -6
  112. nautobot/project-static/docs/apps/index.html +9 -6
  113. nautobot/project-static/docs/apps/nautobot-apps.html +9 -6
  114. nautobot/project-static/docs/assets/javascripts/bundle.92b07e13.min.js +16 -0
  115. nautobot/project-static/docs/assets/javascripts/{bundle.50899def.min.js.map → bundle.92b07e13.min.js.map} +2 -2
  116. nautobot/project-static/docs/assets/javascripts/workers/{search.d50fe291.min.js → search.973d3a69.min.js} +4 -4
  117. nautobot/project-static/docs/assets/javascripts/workers/{search.d50fe291.min.js.map → search.973d3a69.min.js.map} +1 -1
  118. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +9 -6
  119. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +9 -6
  120. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +9 -6
  121. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +9 -6
  122. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +10 -7
  123. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +9 -6
  124. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +9 -6
  125. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +9 -6
  126. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +9 -6
  127. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +9 -6
  128. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +9 -6
  129. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +9 -6
  130. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +9 -6
  131. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +9 -6
  132. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +9 -6
  133. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +11 -8
  134. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +9 -6
  135. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +9 -6
  136. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +11 -8
  137. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +81 -6
  138. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +73 -18
  139. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +9 -6
  140. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +69 -7
  141. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +402 -21
  142. nautobot/project-static/docs/development/apps/api/configuration-view.html +13 -10
  143. nautobot/project-static/docs/development/apps/api/database-backend-config.html +11 -8
  144. nautobot/project-static/docs/development/apps/api/models/django-admin.html +13 -10
  145. nautobot/project-static/docs/development/apps/api/models/global-search.html +10 -7
  146. nautobot/project-static/docs/development/apps/api/models/graphql.html +18 -15
  147. nautobot/project-static/docs/development/apps/api/models/index.html +14 -11
  148. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +12 -9
  149. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +15 -12
  150. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +9 -6
  151. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +15 -12
  152. nautobot/project-static/docs/development/apps/api/platform-features/index.html +9 -6
  153. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +11 -8
  154. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +16 -13
  155. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +12 -10305
  156. nautobot/project-static/docs/development/apps/api/platform-features/prepopulating-data.html +10722 -0
  157. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +15 -12
  158. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +14 -11
  159. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +9 -6
  160. nautobot/project-static/docs/development/apps/api/prometheus.html +15 -12
  161. nautobot/project-static/docs/development/apps/api/setup.html +9 -6
  162. nautobot/project-static/docs/development/apps/api/testing.html +9 -6
  163. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +12 -9
  164. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +9 -6
  165. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +9 -6
  166. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +9 -6
  167. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +20 -17
  168. nautobot/project-static/docs/development/apps/api/views/base-template.html +9 -6
  169. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +15 -12
  170. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +14 -11
  171. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +9 -6
  172. nautobot/project-static/docs/development/apps/api/views/index.html +9 -6
  173. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +10 -7
  174. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +24 -21
  175. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +12 -9
  176. nautobot/project-static/docs/development/apps/api/views/notes.html +10 -7
  177. nautobot/project-static/docs/development/apps/api/views/rest-api.html +19 -16
  178. nautobot/project-static/docs/development/apps/api/views/urls.html +11 -8
  179. nautobot/project-static/docs/development/apps/index.html +9 -6
  180. nautobot/project-static/docs/development/apps/migration/code-updates.html +19 -16
  181. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +9 -6
  182. nautobot/project-static/docs/development/apps/migration/from-v1.html +9 -6
  183. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +22 -19
  184. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +9 -6
  185. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +9 -6
  186. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +9 -6
  187. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +9 -6
  188. nautobot/project-static/docs/development/apps/migration/ui-component-framework/breadcrumbs-titles.html +14 -11
  189. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +27 -24
  190. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +20 -17
  191. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +20 -17
  192. nautobot/project-static/docs/development/apps/porting-from-netbox.html +9 -6
  193. nautobot/project-static/docs/development/core/application-registry.html +23 -20
  194. nautobot/project-static/docs/development/core/best-practices.html +23 -20
  195. nautobot/project-static/docs/development/core/bootstrap-ui.html +9 -6
  196. nautobot/project-static/docs/development/core/caching.html +9 -6
  197. nautobot/project-static/docs/development/core/controllers.html +9 -6
  198. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +10 -7
  199. nautobot/project-static/docs/development/core/generic-views.html +9 -6
  200. nautobot/project-static/docs/development/core/getting-started.html +9 -21
  201. nautobot/project-static/docs/development/core/homepage.html +12 -9
  202. nautobot/project-static/docs/development/core/index.html +9 -6
  203. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +9 -6
  204. nautobot/project-static/docs/development/core/model-checklist.html +9 -6
  205. nautobot/project-static/docs/development/core/model-features.html +11 -8
  206. nautobot/project-static/docs/development/core/natural-keys.html +21 -18
  207. nautobot/project-static/docs/development/core/navigation-menu.html +10 -7
  208. nautobot/project-static/docs/development/core/release-checklist.html +9 -6
  209. nautobot/project-static/docs/development/core/role-internals.html +9 -6
  210. nautobot/project-static/docs/development/core/settings.html +9 -6
  211. nautobot/project-static/docs/development/core/style-guide.html +32 -29
  212. nautobot/project-static/docs/development/core/templates.html +9 -6
  213. nautobot/project-static/docs/development/core/testing.html +10 -7
  214. nautobot/project-static/docs/development/core/ui-component-framework.html +42 -44
  215. nautobot/project-static/docs/development/core/user-preferences.html +9 -6
  216. nautobot/project-static/docs/development/index.html +9 -6
  217. nautobot/project-static/docs/development/jobs/getting-started.html +13 -10
  218. nautobot/project-static/docs/development/jobs/index.html +9 -6
  219. nautobot/project-static/docs/development/jobs/installation.html +23 -20
  220. nautobot/project-static/docs/development/jobs/job-extensions.html +25 -22
  221. nautobot/project-static/docs/development/jobs/job-logging.html +12 -9
  222. nautobot/project-static/docs/development/jobs/job-patterns.html +45 -42
  223. nautobot/project-static/docs/development/jobs/job-structure.html +53 -50
  224. nautobot/project-static/docs/development/jobs/migration/from-v1.html +23 -20
  225. nautobot/project-static/docs/development/jobs/testing.html +14 -11
  226. nautobot/project-static/docs/index.html +9 -6
  227. nautobot/project-static/docs/objects.inv +0 -0
  228. nautobot/project-static/docs/overview/application_stack.html +9 -6
  229. nautobot/project-static/docs/overview/design_philosophy.html +9 -6
  230. nautobot/project-static/docs/release-notes/index.html +9 -6
  231. nautobot/project-static/docs/release-notes/version-1.0.html +9 -6
  232. nautobot/project-static/docs/release-notes/version-1.1.html +9 -6
  233. nautobot/project-static/docs/release-notes/version-1.2.html +10 -7
  234. nautobot/project-static/docs/release-notes/version-1.3.html +9 -6
  235. nautobot/project-static/docs/release-notes/version-1.4.html +9 -6
  236. nautobot/project-static/docs/release-notes/version-1.5.html +13 -10
  237. nautobot/project-static/docs/release-notes/version-1.6.html +9 -6
  238. nautobot/project-static/docs/release-notes/version-2.0.html +9 -6
  239. nautobot/project-static/docs/release-notes/version-2.1.html +9 -6
  240. nautobot/project-static/docs/release-notes/version-2.2.html +9 -6
  241. nautobot/project-static/docs/release-notes/version-2.3.html +9 -6
  242. nautobot/project-static/docs/release-notes/version-2.4.html +489 -6
  243. nautobot/project-static/docs/search/search_index.json +1 -1
  244. nautobot/project-static/docs/sitemap.xml +301 -301
  245. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  246. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +15 -12
  247. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +9 -6
  248. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +16 -13
  249. nautobot/project-static/docs/user-guide/administration/configuration/index.html +9 -6
  250. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +9 -6
  251. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +38 -8
  252. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +9 -6
  253. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +9 -6
  254. nautobot/project-static/docs/user-guide/administration/guides/docker.html +9 -6
  255. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +9 -6
  256. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +9 -6
  257. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +9 -6
  258. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +9 -6
  259. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +9 -6
  260. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +16 -13
  261. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +9 -6
  262. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +9 -6
  263. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +9 -6
  264. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +9 -6
  265. nautobot/project-static/docs/user-guide/administration/installation/index.html +9 -6
  266. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +9 -6
  267. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +9 -6
  268. nautobot/project-static/docs/user-guide/administration/installation/services.html +12 -9
  269. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +13 -10
  270. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +10 -7
  271. nautobot/project-static/docs/user-guide/administration/security/index.html +9 -6
  272. nautobot/project-static/docs/user-guide/administration/security/notices.html +9 -6
  273. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +9 -6
  274. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +10 -7
  275. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +9 -6
  276. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +9 -6
  277. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +9 -6
  278. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +9 -6
  279. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +9 -6
  280. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +9 -6
  281. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +9 -6
  282. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +15 -12
  283. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +9 -6
  284. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +9 -6
  285. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +9 -6
  286. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +9 -6
  287. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +9 -6
  288. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +9 -6
  289. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +9 -6
  290. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +9 -6
  291. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +9 -6
  292. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +9 -6
  293. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +9 -6
  294. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +9 -6
  295. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +9 -6
  296. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +9 -6
  297. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +9 -6
  298. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +9 -6
  299. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +9 -6
  300. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +9 -6
  301. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +9 -6
  302. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +9 -6
  303. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +9 -6
  304. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +9 -6
  305. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +9 -6
  306. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +9 -6
  307. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +13 -10
  308. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +9 -6
  309. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +9 -6
  310. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +9 -6
  311. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +9 -6
  312. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +9 -6
  313. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +9 -6
  314. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +9 -6
  315. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +9 -6
  316. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +9 -6
  317. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +9 -6
  318. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +9 -6
  319. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +9 -6
  320. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +9 -6
  321. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +9 -6
  322. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +9 -6
  323. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +9 -6
  324. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +9 -6
  325. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +9 -6
  326. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +9 -6
  327. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +9 -6
  328. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +9 -6
  329. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +9 -6
  330. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +9 -6
  331. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +9 -6
  332. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +9 -6
  333. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +9 -6
  334. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +9 -6
  335. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +9 -6
  336. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +9 -6
  337. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +9 -6
  338. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +9 -6
  339. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +9 -6
  340. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +9 -6
  341. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +11 -8
  342. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +11 -8
  343. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +41 -41
  344. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +9 -6
  345. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +197 -54
  346. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +9 -6
  347. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +9 -6
  348. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +9 -6
  349. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +9 -6
  350. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +9 -6
  351. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +9 -6
  352. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +9 -6
  353. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +9 -6
  354. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +9 -6
  355. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +9 -6
  356. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +9 -6
  357. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +9 -6
  358. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +9 -6
  359. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +9 -6
  360. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +9 -6
  361. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +9 -6
  362. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +9 -6
  363. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +9 -6
  364. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +9 -6
  365. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +9 -6
  366. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +9 -6
  367. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +9 -6
  368. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +9 -6
  369. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +9 -6
  370. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +9 -6
  371. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +9 -6
  372. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +9 -6
  373. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +9 -6
  374. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +9 -6
  375. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +9 -6
  376. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +13 -10
  377. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +9 -6
  378. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +9 -6
  379. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +9 -6
  380. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +9 -6
  381. nautobot/project-static/docs/user-guide/index.html +9 -6
  382. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +9 -6
  383. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +9 -6
  384. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +10 -7
  385. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +9 -6
  386. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +9 -6
  387. nautobot/project-static/docs/user-guide/platform-functionality/events.html +11 -8
  388. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +9 -6
  389. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +9 -6
  390. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +9 -6
  391. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +9 -6
  392. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +9 -6
  393. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +9 -6
  394. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +9 -6
  395. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +9 -6
  396. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +9 -6
  397. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +9 -6
  398. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +9 -6
  399. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9 -6
  400. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +9 -6
  401. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +9 -6
  402. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +9 -6
  403. nautobot/project-static/docs/user-guide/platform-functionality/note.html +9 -6
  404. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +12 -9
  405. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +9 -6
  406. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +9 -6
  407. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +9 -6
  408. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +9 -6
  409. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +9 -6
  410. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +9 -6
  411. nautobot/project-static/docs/user-guide/platform-functionality/role.html +9 -6
  412. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9 -6
  413. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +11 -8
  414. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +9 -6
  415. nautobot/project-static/docs/user-guide/platform-functionality/status.html +9 -6
  416. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +9 -6
  417. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +9 -6
  418. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +9 -6
  419. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +9 -6
  420. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +9 -6
  421. nautobot/project-static/fonts/UFL.txt +96 -96
  422. nautobot/project-static/img/nautobot_icon.svg +32 -34
  423. nautobot/project-static/js/forms.js +35 -2
  424. nautobot/project-static/js/table_sorting_indicator.js +0 -2
  425. nautobot/virtualization/filters.py +7 -0
  426. {nautobot-2.4.16.dist-info → nautobot-2.4.18.dist-info}/METADATA +8 -8
  427. {nautobot-2.4.16.dist-info → nautobot-2.4.18.dist-info}/RECORD +431 -421
  428. nautobot/core/templates/inc/breadcrumbs.html +0 -14
  429. nautobot/project-static/docs/assets/javascripts/bundle.50899def.min.js +0 -16
  430. nautobot/project-static/docs/requirements.txt +0 -14
  431. {nautobot-2.4.16.dist-info → nautobot-2.4.18.dist-info}/LICENSE.txt +0 -0
  432. {nautobot-2.4.16.dist-info → nautobot-2.4.18.dist-info}/NOTICE +0 -0
  433. {nautobot-2.4.16.dist-info → nautobot-2.4.18.dist-info}/WHEEL +0 -0
  434. {nautobot-2.4.16.dist-info → nautobot-2.4.18.dist-info}/entry_points.txt +0 -0
@@ -802,6 +802,23 @@ class PrefixQuerysetTestCase(TestCase):
802
802
  status=self.status,
803
803
  )
804
804
 
805
+ # same but for IPv6
806
+ container_v6 = netaddr.IPNetwork("2001:db8::/120")
807
+ Prefix.objects.create(
808
+ prefix=container_v6,
809
+ type=choices.PrefixTypeChoices.TYPE_CONTAINER,
810
+ namespace=namespace,
811
+ status=self.status,
812
+ )
813
+ for prefix_length in range(121, 129):
814
+ network = list(container_v6.subnet(prefix_length))[1]
815
+ Prefix.objects.create(
816
+ prefix=network,
817
+ type=choices.PrefixTypeChoices.TYPE_NETWORK,
818
+ namespace=namespace,
819
+ status=self.status,
820
+ )
821
+
805
822
  for last_octet in range(1, 255):
806
823
  ip = netaddr.IPAddress(f"10.0.0.{last_octet}")
807
824
  expected_prefix_length = 33 - len(bin(last_octet)[2:]) # [1] = 32, [2,3] = 31, [4,5,6,7] = 30, etc.
@@ -819,3 +836,32 @@ class PrefixQuerysetTestCase(TestCase):
819
836
  .order_by("-prefix_length")
820
837
  .first(),
821
838
  )
839
+
840
+ ip = netaddr.IPAddress(f"2001:db8::{last_octet:x}")
841
+ expected_prefix_length = 129 - len(bin(last_octet)[2:]) # [1] = 128, [2,3] = 127, [4,5,6,7] = 126, etc.
842
+ with self.subTest(ip=ip, expected_prefix_length=expected_prefix_length):
843
+ closest_parent = Prefix.objects.filter(namespace=namespace).get_closest_parent(ip, include_self=True)
844
+ expected_parent = list(container_v6.subnet(expected_prefix_length))[1]
845
+ self.assertEqual(closest_parent.prefix, expected_parent)
846
+ self.assertEqual(
847
+ closest_parent,
848
+ Prefix.objects.filter(
849
+ network__lte=ip.value,
850
+ broadcast__gte=ip.value,
851
+ namespace=namespace,
852
+ )
853
+ .order_by("-prefix_length")
854
+ .first(),
855
+ )
856
+
857
+ slash32 = Prefix.objects.create(prefix="10.1.1.154/32", namespace=namespace, status=self.status)
858
+ slash31 = Prefix.objects.create(prefix="10.1.1.154/31", namespace=namespace, status=self.status)
859
+ slash30 = Prefix.objects.create(prefix="10.1.1.154/30", namespace=namespace, status=self.status)
860
+ self.assertEqual(slash31, Prefix.objects.get_closest_parent(slash32.prefix))
861
+ self.assertEqual(slash30, Prefix.objects.get_closest_parent(slash31.prefix))
862
+
863
+ slash126 = Prefix.objects.create(prefix="::1/126", namespace=namespace, status=self.status)
864
+ slash127 = Prefix.objects.create(prefix="::1/127", namespace=namespace, status=self.status)
865
+ slash128 = Prefix.objects.create(prefix="::1/128", namespace=namespace, status=self.status)
866
+ self.assertEqual(slash126, Prefix.objects.get_closest_parent(slash127.prefix))
867
+ self.assertEqual(slash127, Prefix.objects.get_closest_parent(slash128.prefix))
@@ -203,6 +203,10 @@ class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase, ViewTestCases.List
203
203
  "tags": [t.pk for t in Tag.objects.get_for_model(Prefix)],
204
204
  }
205
205
 
206
+ cls.update_data = cls.form_data.copy()
207
+ # Can't update `prefix` and `namespace` in the same edit request
208
+ cls.update_data["namespace"] = Prefix.objects.first().namespace.pk
209
+
206
210
  cls.bulk_edit_data = {
207
211
  "tenant": None,
208
212
  "status": cls.statuses[1].pk,
@@ -217,6 +221,22 @@ class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase, ViewTestCases.List
217
221
  "remove_vrfs": [vrfs[1].pk],
218
222
  }
219
223
 
224
+ @override_settings(EXEMPT_VIEW_PERMISSIONS=[])
225
+ def test_get_object_with_permission(self):
226
+ response = super().test_get_object_with_permission()
227
+
228
+ content = extract_page_body(response.content.decode(response.charset))
229
+ self.assertNotIn("The parent field on this record appears to be set incorrectly", strip_tags(content))
230
+
231
+ instance = self._get_queryset().first()
232
+ instance.parent = self._get_queryset().last()
233
+ self._get_queryset().bulk_update([instance], ["parent"], batch_size=1)
234
+
235
+ response = super().test_get_object_with_permission()
236
+
237
+ content = extract_page_body(response.content.decode(response.charset))
238
+ self.assertIn("The parent field on this record appears to be set incorrectly", strip_tags(content))
239
+
220
240
  @override_settings(EXEMPT_VIEW_PERMISSIONS=[])
221
241
  def test_list_objects_with_permission(self):
222
242
  """Test rendering of LinkedCountColumn for related fields with display_field override."""
@@ -258,133 +278,6 @@ class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase, ViewTestCases.List
258
278
  for prefix in prefixes:
259
279
  self.assertNotIn(prefix.get_absolute_url(), content, msg=content)
260
280
 
261
- @override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
262
- def test_create_object_warnings(self):
263
- """Test various object creation scenarios that should result in a warning to the user."""
264
- Prefix.objects.create(
265
- prefix="10.0.0.0/8",
266
- namespace=self.namespace,
267
- type=PrefixTypeChoices.TYPE_CONTAINER,
268
- status=self.statuses[1],
269
- )
270
- Prefix.objects.create(
271
- prefix="10.0.0.0/16",
272
- namespace=self.namespace,
273
- type=PrefixTypeChoices.TYPE_NETWORK,
274
- status=self.statuses[1],
275
- )
276
- Prefix.objects.create(
277
- prefix="10.0.0.0/24",
278
- namespace=self.namespace,
279
- type=PrefixTypeChoices.TYPE_POOL,
280
- status=self.statuses[1],
281
- )
282
- IPAddress.objects.create(
283
- address="10.0.0.1/32",
284
- status=Status.objects.get_for_model(IPAddress).first(),
285
- namespace=self.namespace,
286
- )
287
- self.add_permissions("ipam.add_prefix")
288
-
289
- common_data = {"namespace": self.namespace.pk, "status": self.statuses[0].pk}
290
-
291
- with self.subTest("Creating a Pool as child of a Container raises a warning"):
292
- data = {
293
- "prefix": "10.1.0.0/16",
294
- "type": PrefixTypeChoices.TYPE_POOL,
295
- }
296
- response = self.client.post(self._get_url("add"), data={**common_data, **data}, follow=True)
297
- self.assertHttpStatus(response, 200)
298
- content = extract_page_body(response.content.decode(response.charset))
299
- self.assertIn(
300
- "10.1.0.0/16 is a Pool prefix but its parent 10.0.0.0/8 is a Container. "
301
- "This will be considered invalid data in a future release. "
302
- "Consider changing the type of 10.1.0.0/16 and/or 10.0.0.0/8 to resolve this issue.",
303
- strip_tags(content),
304
- )
305
-
306
- # We could test for Pool-in-Pool, Container-in-Network, Network-in-Network, Container-in-Pool, and
307
- # Network-in-Pool, but they all use the same code path and similar message
308
-
309
- with self.subTest("Creating a Container that will have a Pool as its child raises a warning"):
310
- data = {
311
- "prefix": "10.0.0.0/20",
312
- "type": PrefixTypeChoices.TYPE_CONTAINER,
313
- }
314
- response = self.client.post(self._get_url("add"), data={**common_data, **data}, follow=True)
315
- self.assertHttpStatus(response, 200)
316
- content = extract_page_body(response.content.decode(response.charset))
317
- self.assertIn(
318
- "10.0.0.0/20 is a Container prefix and should not contain child prefixes of type Pool. "
319
- "This will be considered invalid data in a future release. "
320
- "Consider creating an intermediary Network prefix, or changing the type of its children to Network, "
321
- "to resolve this issue.",
322
- strip_tags(content),
323
- )
324
-
325
- with self.subTest("Creating a Network that will have another Network as its child raises a warning"):
326
- data = {
327
- "prefix": "10.0.0.0/12",
328
- "type": PrefixTypeChoices.TYPE_NETWORK,
329
- }
330
- response = self.client.post(self._get_url("add"), data={**common_data, **data}, follow=True)
331
- self.assertHttpStatus(response, 200)
332
- content = extract_page_body(response.content.decode(response.charset))
333
- self.assertIn(
334
- "10.0.0.0/12 is a Network prefix and should not contain child prefixes of types Container or Network. "
335
- "This will be considered invalid data in a future release. "
336
- "Consider changing the type of 10.0.0.0/12 to Container, or changing the type of its children to Pool, "
337
- "to resolve this issue.",
338
- strip_tags(content),
339
- )
340
-
341
- with self.subTest("Creating a Pool that will have any other Prefix as its child raises a warning"):
342
- data = {
343
- "prefix": "0.0.0.0/0",
344
- "type": PrefixTypeChoices.TYPE_POOL,
345
- }
346
- response = self.client.post(self._get_url("add"), data={**common_data, **data}, follow=True)
347
- self.assertHttpStatus(response, 200)
348
- content = extract_page_body(response.content.decode(response.charset))
349
- self.assertIn(
350
- "0.0.0.0/0 is a Pool prefix and should not contain other prefixes. "
351
- "This will be considered invalid data in a future release. "
352
- "Consider either changing the type of 0.0.0.0/0 to Container or Network, or deleting its children, "
353
- "to resolve this issue.",
354
- strip_tags(content),
355
- )
356
-
357
- with self.subTest("Creating a large Container that will contain IPs raises a warning"):
358
- data = {
359
- "prefix": "10.0.0.0/28",
360
- "type": PrefixTypeChoices.TYPE_CONTAINER,
361
- }
362
- response = self.client.post(self._get_url("add"), data={**common_data, **data}, follow=True)
363
- self.assertHttpStatus(response, 200)
364
- content = extract_page_body(response.content.decode(response.charset))
365
- self.assertIn(
366
- "10.0.0.0/28 is a Container prefix and should not directly contain IP addresses. "
367
- "This will be considered invalid data in a future release. "
368
- "Consider either changing the type of 10.0.0.0/28 to Network, or creating one or more child "
369
- "prefix(es) of type Network to contain these IP addresses, to resolve this issue.",
370
- strip_tags(content),
371
- )
372
-
373
- with self.subTest("Creating a small Container that will contain IPs raises a different warning"):
374
- data = {
375
- "prefix": "10.0.0.1/32",
376
- "type": PrefixTypeChoices.TYPE_CONTAINER,
377
- }
378
- response = self.client.post(self._get_url("add"), data={**common_data, **data}, follow=True)
379
- self.assertHttpStatus(response, 200)
380
- content = extract_page_body(response.content.decode(response.charset))
381
- self.assertIn(
382
- "10.0.0.1/32 is a Container prefix and should not directly contain IP addresses. "
383
- "This will be considered invalid data in a future release. "
384
- "Consider changing the type of 10.0.0.1/32 to Network to resolve this issue.",
385
- strip_tags(content),
386
- )
387
-
388
281
  @override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
389
282
  def test_prefix_ipaddresses_table_list_includes_child_ips(self):
390
283
  ip_status = Status.objects.get_for_model(IPAddress).first()
@@ -432,7 +325,7 @@ class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase):
432
325
  cls.statuses = Status.objects.get_for_model(IPAddress)
433
326
  cls.prefix_status = Status.objects.get_for_model(Prefix).first()
434
327
  roles = Role.objects.get_for_model(IPAddress)
435
- Prefix.objects.get_or_create(
328
+ cls.prefix, _ = Prefix.objects.get_or_create(
436
329
  prefix="192.0.2.0/24",
437
330
  defaults={"namespace": cls.namespace, "status": cls.prefix_status, "type": "network"},
438
331
  )
@@ -459,6 +352,22 @@ class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase):
459
352
  "description": "New description",
460
353
  }
461
354
 
355
+ @override_settings(EXEMPT_VIEW_PERMISSIONS=[])
356
+ def test_get_object_with_permission(self):
357
+ response = super().test_get_object_with_permission()
358
+
359
+ content = extract_page_body(response.content.decode(response.charset))
360
+ self.assertNotIn("The parent field on this record appears to be set incorrectly", strip_tags(content))
361
+
362
+ instance = self._get_queryset().first()
363
+ instance.parent = self.prefix
364
+ self._get_queryset().bulk_update([instance], ["parent"], batch_size=1)
365
+
366
+ response = super().test_get_object_with_permission()
367
+
368
+ content = extract_page_body(response.content.decode(response.charset))
369
+ self.assertIn("The parent field on this record appears to be set incorrectly", strip_tags(content))
370
+
462
371
  def test_edit_object_with_permission(self):
463
372
  instance = self._get_queryset().first()
464
373
  form_data = self.form_data.copy()
@@ -516,7 +425,9 @@ class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase):
516
425
  "data": post_data(form_data),
517
426
  }
518
427
  response = self.client.post(**request)
519
- self.assertBodyContains(response, "No suitable parent Prefix exists in this Namespace")
428
+ self.assertBodyContains(
429
+ response, f"No suitable parent Prefix for {instance.host} exists in Namespace {new_namespace}"
430
+ )
520
431
  # Create an exact copy of the parent prefix but in a different namespace. See if the re-parenting is successful
521
432
  new_parent = Prefix.objects.create(
522
433
  prefix=instance.parent.prefix,
@@ -529,41 +440,6 @@ class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase):
529
440
  created_ip = IPAddress.objects.get(parent__namespace=new_namespace, address=instance.address)
530
441
  self.assertEqual(created_ip.parent, new_parent)
531
442
 
532
- @override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
533
- def test_create_object_warnings(self):
534
- self.add_permissions("ipam.add_ipaddress")
535
-
536
- Prefix.objects.create(
537
- prefix="192.0.2.0/25",
538
- namespace=self.namespace,
539
- type=PrefixTypeChoices.TYPE_CONTAINER,
540
- status=self.prefix_status,
541
- )
542
-
543
- with self.subTest("Creating an IPAddress as a child of a larger Container prefix raises a warning"):
544
- self.form_data["address"] = "192.0.2.98/28"
545
- response = self.client.post(self._get_url("add"), data=post_data(self.form_data), follow=True)
546
- self.assertHttpStatus(response, 200)
547
- content = extract_page_body(response.content.decode(response.charset))
548
- self.assertIn(
549
- "IP address 192.0.2.98/28 currently has prefix 192.0.2.0/25 as its parent, which is a Container. "
550
- "This will be considered invalid data in a future release. "
551
- "Consider creating an intermediate /28 prefix of type Network to resolve this issue.",
552
- strip_tags(content),
553
- )
554
-
555
- with self.subTest("Creating an IP as a child of a same-size Container prefix raises a different warning"):
556
- self.form_data["address"] = "192.0.2.2/25"
557
- response = self.client.post(self._get_url("add"), data=post_data(self.form_data), follow=True)
558
- self.assertHttpStatus(response, 200)
559
- content = extract_page_body(response.content.decode(response.charset))
560
- self.assertIn(
561
- "IP address 192.0.2.2/25 currently has prefix 192.0.2.0/25 as its parent, which is a Container. "
562
- "This will be considered invalid data in a future release. "
563
- "Consider changing the prefix to type Network or Pool to resolve this issue.",
564
- strip_tags(content),
565
- )
566
-
567
443
  @override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
568
444
  def test_bulk_create_ips(self):
569
445
  """"""
nautobot/ipam/urls.py CHANGED
@@ -139,17 +139,6 @@ urlpatterns = [
139
139
  views.IPAddressDeleteView.as_view(),
140
140
  name="ipaddress_delete",
141
141
  ),
142
- # VLANs
143
- path(
144
- "vlans/<uuid:pk>/interfaces/",
145
- views.VLANInterfacesView.as_view(),
146
- name="vlan_interfaces",
147
- ),
148
- path(
149
- "vlans/<uuid:pk>/vm-interfaces/",
150
- views.VLANVMInterfacesView.as_view(),
151
- name="vlan_vminterfaces",
152
- ),
153
142
  ]
154
143
 
155
144
  urlpatterns += router.urls
@@ -587,7 +587,7 @@ def get_closest_parent(obj, qs):
587
587
  """
588
588
  # Validate that it's a real CIDR
589
589
  cidr = validate_cidr(obj)
590
- broadcast = str(cidr.broadcast or cidr.ip)
590
+ broadcast = str(cidr.broadcast or cidr[-1])
591
591
 
592
592
  # Prepare the queryset filter
593
593
  lookup_kwargs = {
@@ -5,7 +5,7 @@ import random
5
5
  from django.apps import apps
6
6
  from netaddr import IPNetwork
7
7
 
8
- from nautobot.ipam.models import get_default_namespace
8
+ from nautobot.ipam.models import get_default_namespace_pk
9
9
 
10
10
  # Calculate the probabilities to use for the maybe_subdivide() function defined below.
11
11
 
@@ -112,7 +112,10 @@ def create_prefixes_and_ips(initial_subnet: str, apps=apps, seed="Nautobot"): #
112
112
  print(f"Seeding the PRNG with seed {seed}")
113
113
  random.seed(seed) # suspicious-non-cryptographic-random-usage
114
114
 
115
- status_active, _ = Status.objects.get_or_create(name="Active", defaults={"slug": "active"})
115
+ if hasattr(Status, "slug"):
116
+ status_active, _ = Status.objects.get_or_create(name="Active", defaults={"slug": "active"})
117
+ else:
118
+ status_active, _ = Status.objects.get_or_create(name="Active")
116
119
 
117
120
  for i in range(1, 11):
118
121
  Tenant.objects.get_or_create(name=f"{initial_subnet} Tenant {i}")
@@ -126,7 +129,7 @@ def create_prefixes_and_ips(initial_subnet: str, apps=apps, seed="Nautobot"): #
126
129
 
127
130
  all_tenants = list(Tenant.objects.all())
128
131
  if hasattr(VRF, "namespace"):
129
- all_vrfs = list(VRF.objects.filter(namespace=get_default_namespace()))
132
+ all_vrfs = list(VRF.objects.filter(namespace_id=get_default_namespace_pk()))
130
133
  else:
131
134
  all_vrfs = list(VRF.objects.all())
132
135
 
@@ -156,11 +159,12 @@ def create_prefixes(initial_subnet, all_tenants, all_vrfs, status_active, Prefix
156
159
  network=str(subnet.network),
157
160
  broadcast=str(subnet.broadcast if subnet.broadcast else subnet[-1]),
158
161
  prefix_length=subnet.prefixlen,
162
+ ip_version=subnet.version,
159
163
  status=status_active,
160
164
  tenant=maybe_random_instance(all_tenants),
161
165
  )
162
166
  if vrf is not None:
163
- vrf.add_prefix(prefix)
167
+ vrf.prefixes.add(prefix)
164
168
 
165
169
  unique_prefix_count += 1
166
170
  if hasattr(Prefix, "vrf"):
@@ -202,6 +206,7 @@ def create_ips(initial_subnet, all_tenants, all_vrfs, status_active, IPAddress):
202
206
  IPAddress.objects.create(
203
207
  host=str(network.ip),
204
208
  mask_length=network.prefixlen,
209
+ ip_version=network.version,
205
210
  status=status_active,
206
211
  tenant=maybe_random_instance(all_tenants),
207
212
  )