nautobot 2.3.16__py3-none-any.whl → 2.4.0__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 (721) hide show
  1. nautobot/__init__.py +15 -0
  2. nautobot/apps/__init__.py +1 -1
  3. nautobot/apps/api.py +8 -10
  4. nautobot/apps/change_logging.py +2 -2
  5. nautobot/apps/choices.py +4 -4
  6. nautobot/apps/config.py +32 -3
  7. nautobot/apps/events.py +19 -0
  8. nautobot/apps/exceptions.py +0 -2
  9. nautobot/apps/factory.py +2 -2
  10. nautobot/apps/filters.py +1 -1
  11. nautobot/apps/forms.py +20 -20
  12. nautobot/apps/graphql.py +2 -2
  13. nautobot/apps/jobs.py +8 -8
  14. nautobot/apps/models.py +19 -19
  15. nautobot/apps/tables.py +1 -1
  16. nautobot/apps/testing.py +10 -10
  17. nautobot/apps/ui.py +44 -9
  18. nautobot/apps/utils.py +7 -15
  19. nautobot/apps/views.py +8 -6
  20. nautobot/circuits/api/serializers.py +1 -0
  21. nautobot/circuits/api/views.py +4 -8
  22. nautobot/circuits/navigation.py +0 -57
  23. nautobot/circuits/templates/circuits/circuit_create.html +1 -7
  24. nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -71
  25. nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -64
  26. nautobot/circuits/templates/circuits/inc/circuit_termination_cable_fragment.html +40 -0
  27. nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +26 -0
  28. nautobot/circuits/templates/circuits/provider_retrieve.html +0 -76
  29. nautobot/circuits/tests/integration/test_relationships.py +33 -24
  30. nautobot/circuits/tests/test_filters.py +4 -8
  31. nautobot/circuits/views.py +140 -23
  32. nautobot/cloud/api/views.py +6 -10
  33. nautobot/cloud/factory.py +4 -1
  34. nautobot/cloud/tests/test_filters.py +5 -4
  35. nautobot/cloud/views.py +0 -16
  36. nautobot/core/api/constants.py +11 -0
  37. nautobot/core/api/filter_backends.py +3 -9
  38. nautobot/core/api/metadata.py +28 -256
  39. nautobot/core/api/pagination.py +3 -2
  40. nautobot/core/api/renderers.py +3 -0
  41. nautobot/core/api/schema.py +13 -2
  42. nautobot/core/api/serializers.py +45 -259
  43. nautobot/core/api/urls.py +3 -4
  44. nautobot/core/api/utils.py +0 -62
  45. nautobot/core/api/views.py +99 -157
  46. nautobot/core/apps/__init__.py +22 -578
  47. nautobot/core/celery/__init__.py +13 -0
  48. nautobot/core/celery/schedulers.py +47 -2
  49. nautobot/core/choices.py +2 -2
  50. nautobot/core/cli/__init__.py +8 -0
  51. nautobot/core/constants.py +7 -0
  52. nautobot/core/events/__init__.py +116 -0
  53. nautobot/core/events/base.py +27 -0
  54. nautobot/core/events/exceptions.py +10 -0
  55. nautobot/core/events/redis_broker.py +48 -0
  56. nautobot/core/events/syslog_broker.py +19 -0
  57. nautobot/core/exceptions.py +0 -6
  58. nautobot/core/forms/__init__.py +19 -19
  59. nautobot/core/forms/fields.py +57 -9
  60. nautobot/core/forms/forms.py +33 -2
  61. nautobot/core/forms/utils.py +2 -1
  62. nautobot/core/graphql/schema.py +3 -1
  63. nautobot/core/jobs/__init__.py +24 -3
  64. nautobot/core/jobs/bulk_actions.py +248 -0
  65. nautobot/core/jobs/cleanup.py +1 -1
  66. nautobot/core/management/commands/generate_test_data.py +21 -0
  67. nautobot/core/middleware.py +16 -0
  68. nautobot/core/models/fields.py +11 -7
  69. nautobot/core/settings.py +68 -4
  70. nautobot/core/settings.yaml +99 -0
  71. nautobot/core/tables.py +10 -46
  72. nautobot/core/tasks.py +1 -1
  73. nautobot/core/templates/about.html +67 -0
  74. nautobot/core/templates/components/button/default.html +7 -0
  75. nautobot/core/templates/components/button/dropdown.html +20 -0
  76. nautobot/core/templates/components/layout/one_over_two.html +19 -0
  77. nautobot/core/templates/components/layout/two_over_one.html +19 -0
  78. nautobot/core/templates/components/panel/body_content_data_table.html +27 -0
  79. nautobot/core/templates/components/panel/body_content_objects_table.html +4 -0
  80. nautobot/core/templates/components/panel/body_content_tags.html +6 -0
  81. nautobot/core/templates/components/panel/body_content_text.html +12 -0
  82. nautobot/core/templates/components/panel/body_wrapper_generic.html +3 -0
  83. nautobot/core/templates/components/panel/body_wrapper_key_value_table.html +3 -0
  84. nautobot/core/templates/components/panel/body_wrapper_table.html +3 -0
  85. nautobot/core/templates/components/panel/footer_contacts_table.html +20 -0
  86. nautobot/core/templates/components/panel/footer_content_table.html +14 -0
  87. nautobot/core/templates/components/panel/grouping_toggle.html +14 -0
  88. nautobot/core/templates/components/panel/header_extra_content_table.html +3 -0
  89. nautobot/core/templates/components/panel/panel.html +16 -0
  90. nautobot/core/templates/components/panel/stats_panel_body.html +8 -0
  91. nautobot/core/templates/components/tab/content_wrapper.html +3 -0
  92. nautobot/core/templates/components/tab/label_wrapper.html +5 -0
  93. nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +3 -0
  94. nautobot/core/templates/generic/object_retrieve.html +28 -17
  95. nautobot/core/templates/inc/computed_fields/panel_data.html +4 -7
  96. nautobot/core/templates/inc/custom_fields/panel.html +2 -2
  97. nautobot/core/templates/inc/custom_fields/panel_data.html +4 -7
  98. nautobot/core/templates/inc/footer.html +1 -0
  99. nautobot/core/templates/inc/nav_menu.html +2 -1
  100. nautobot/core/templates/inc/relationships_panel.html +1 -1
  101. nautobot/core/templates/inc/tenancy_form_panel.html +9 -0
  102. nautobot/core/templates/inc/tenant_table_row.html +11 -0
  103. nautobot/core/templates/nautobot_config.py.j2 +13 -0
  104. nautobot/core/templates/panel_table.html +12 -0
  105. nautobot/core/templates/utilities/render_jinja2.html +117 -0
  106. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  107. nautobot/core/templates/utilities/theme_preview.html +7 -0
  108. nautobot/core/templatetags/helpers.py +104 -6
  109. nautobot/core/templatetags/ui_framework.py +40 -0
  110. nautobot/core/testing/__init__.py +8 -8
  111. nautobot/core/testing/api.py +187 -137
  112. nautobot/core/testing/context.py +18 -0
  113. nautobot/core/testing/filters.py +41 -35
  114. nautobot/core/testing/forms.py +2 -0
  115. nautobot/core/testing/views.py +65 -148
  116. nautobot/core/tests/integration/test_view_authentication.py +1 -1
  117. nautobot/core/tests/nautobot_config.py +198 -0
  118. nautobot/core/tests/runner.py +2 -2
  119. nautobot/core/tests/test_api.py +154 -176
  120. nautobot/core/tests/test_events.py +214 -0
  121. nautobot/core/tests/test_forms.py +1 -0
  122. nautobot/core/tests/test_jinja_filters.py +1 -0
  123. nautobot/core/tests/test_jobs.py +387 -14
  124. nautobot/core/tests/test_navigations.py +7 -241
  125. nautobot/core/tests/test_settings_schema.py +7 -0
  126. nautobot/core/tests/test_tables.py +100 -0
  127. nautobot/core/tests/test_templatetags_helpers.py +16 -0
  128. nautobot/core/tests/test_ui.py +150 -0
  129. nautobot/core/tests/test_utils.py +55 -18
  130. nautobot/core/tests/test_views.py +124 -5
  131. nautobot/core/ui/__init__.py +0 -0
  132. nautobot/core/ui/base.py +11 -0
  133. nautobot/core/ui/choices.py +44 -0
  134. nautobot/core/ui/homepage.py +167 -0
  135. nautobot/core/ui/nav.py +280 -0
  136. nautobot/core/ui/object_detail.py +1855 -0
  137. nautobot/core/ui/utils.py +36 -0
  138. nautobot/core/urls.py +6 -0
  139. nautobot/core/utils/config.py +30 -3
  140. nautobot/core/utils/lookup.py +12 -2
  141. nautobot/core/utils/querysets.py +64 -0
  142. nautobot/core/utils/requests.py +24 -9
  143. nautobot/core/views/__init__.py +48 -1
  144. nautobot/core/views/generic.py +37 -140
  145. nautobot/core/views/mixins.py +82 -32
  146. nautobot/core/views/paginator.py +8 -5
  147. nautobot/core/views/renderers.py +9 -9
  148. nautobot/core/views/utils.py +11 -0
  149. nautobot/core/wsgi.py +3 -3
  150. nautobot/dcim/api/serializers.py +34 -141
  151. nautobot/dcim/api/urls.py +5 -0
  152. nautobot/dcim/api/views.py +57 -110
  153. nautobot/dcim/apps.py +1 -0
  154. nautobot/dcim/choices.py +28 -0
  155. nautobot/dcim/factory.py +58 -0
  156. nautobot/dcim/filters/__init__.py +204 -2
  157. nautobot/dcim/forms.py +219 -9
  158. nautobot/dcim/migrations/0063_interfacevdcassignment_virtualdevicecontext_and_more.py +165 -0
  159. nautobot/dcim/migrations/0064_virtualdevicecontext_status_data_migration.py +28 -0
  160. nautobot/dcim/migrations/0065_controller_capabilities_and_more.py +29 -0
  161. nautobot/dcim/migrations/0066_controllermanageddevicegroup_radio_profiles_and_more.py +33 -0
  162. nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +25 -0
  163. nautobot/dcim/models/__init__.py +5 -1
  164. nautobot/dcim/models/devices.py +180 -2
  165. nautobot/dcim/models/racks.py +2 -2
  166. nautobot/dcim/navigation.py +25 -224
  167. nautobot/dcim/signals.py +44 -0
  168. nautobot/dcim/tables/__init__.py +2 -0
  169. nautobot/dcim/tables/devices.py +103 -7
  170. nautobot/dcim/tables/racks.py +1 -1
  171. nautobot/dcim/templates/dcim/controller/base.html +10 -0
  172. nautobot/dcim/templates/dcim/controller_create.html +2 -7
  173. nautobot/dcim/templates/dcim/controller_retrieve.html +6 -10
  174. nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +25 -0
  175. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +68 -0
  176. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +51 -0
  177. nautobot/dcim/templates/dcim/device/base.html +6 -42
  178. nautobot/dcim/templates/dcim/device/wireless.html +73 -0
  179. nautobot/dcim/templates/dcim/device.html +4 -10
  180. nautobot/dcim/templates/dcim/device_edit.html +36 -37
  181. nautobot/dcim/templates/dcim/interface.html +1 -0
  182. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  183. nautobot/dcim/templates/dcim/location.html +1 -9
  184. nautobot/dcim/templates/dcim/location_edit.html +1 -7
  185. nautobot/dcim/templates/dcim/locationtype.html +0 -107
  186. nautobot/dcim/templates/dcim/locationtype_retrieve.html +8 -0
  187. nautobot/dcim/templates/dcim/rack.html +1 -9
  188. nautobot/dcim/templates/dcim/rack_edit.html +1 -7
  189. nautobot/dcim/templates/dcim/rackreservation.html +1 -9
  190. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +68 -0
  191. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +28 -0
  192. nautobot/dcim/tests/integration/test_controller.py +62 -0
  193. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +71 -0
  194. nautobot/dcim/tests/test_api.py +188 -64
  195. nautobot/dcim/tests/test_filters.py +171 -76
  196. nautobot/dcim/tests/test_jobs.py +118 -0
  197. nautobot/dcim/tests/test_models.py +157 -6
  198. nautobot/dcim/tests/test_signals.py +1 -0
  199. nautobot/dcim/tests/test_views.py +118 -88
  200. nautobot/dcim/urls.py +72 -27
  201. nautobot/dcim/utils.py +2 -2
  202. nautobot/dcim/views.py +356 -61
  203. nautobot/extras/api/serializers.py +39 -18
  204. nautobot/extras/api/urls.py +4 -0
  205. nautobot/extras/api/views.py +89 -31
  206. nautobot/extras/choices.py +13 -0
  207. nautobot/extras/constants.py +2 -1
  208. nautobot/extras/context_managers.py +23 -6
  209. nautobot/extras/datasources/git.py +4 -1
  210. nautobot/extras/factory.py +27 -0
  211. nautobot/extras/filters/__init__.py +66 -5
  212. nautobot/extras/forms/base.py +2 -2
  213. nautobot/extras/forms/forms.py +262 -59
  214. nautobot/extras/forms/mixins.py +2 -2
  215. nautobot/extras/graphql/types.py +25 -1
  216. nautobot/extras/jobs.py +109 -15
  217. nautobot/extras/management/__init__.py +1 -0
  218. nautobot/extras/management/commands/runjob.py +7 -79
  219. nautobot/extras/management/commands/runjob_with_job_result.py +46 -0
  220. nautobot/extras/management/utils.py +87 -0
  221. nautobot/extras/migrations/0117_create_job_queue_model.py +129 -0
  222. nautobot/extras/migrations/0118_task_queue_to_job_queue_migration.py +78 -0
  223. nautobot/extras/migrations/0119_remove_task_queues_from_job_and_queue_from_scheduled_job.py +28 -0
  224. nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +22 -0
  225. nautobot/extras/migrations/0121_alter_team_contacts.py +17 -0
  226. nautobot/extras/models/__init__.py +5 -1
  227. nautobot/extras/models/change_logging.py +7 -3
  228. nautobot/extras/models/contacts.py +1 -1
  229. nautobot/extras/models/groups.py +0 -2
  230. nautobot/extras/models/jobs.py +233 -33
  231. nautobot/extras/models/relationships.py +69 -1
  232. nautobot/extras/models/secrets.py +5 -0
  233. nautobot/extras/navigation.py +20 -262
  234. nautobot/extras/plugins/__init__.py +54 -19
  235. nautobot/extras/plugins/marketplace_manifest.yml +455 -0
  236. nautobot/extras/plugins/tables.py +16 -14
  237. nautobot/extras/plugins/urls.py +1 -0
  238. nautobot/extras/plugins/views.py +103 -60
  239. nautobot/extras/registry.py +1 -1
  240. nautobot/extras/secrets/__init__.py +2 -2
  241. nautobot/extras/signals.py +39 -1
  242. nautobot/extras/tables.py +37 -1
  243. nautobot/extras/templates/extras/dynamicgroup.html +1 -9
  244. nautobot/extras/templates/extras/externalintegration_retrieve.html +0 -47
  245. nautobot/extras/templates/extras/inc/tags_panel.html +1 -5
  246. nautobot/extras/templates/extras/job_bulk_edit.html +2 -1
  247. nautobot/extras/templates/extras/job_detail.html +52 -6
  248. nautobot/extras/templates/extras/job_edit.html +6 -2
  249. nautobot/extras/templates/extras/job_list.html +2 -7
  250. nautobot/extras/templates/extras/jobqueue_retrieve.html +36 -0
  251. nautobot/extras/templates/extras/marketplace.html +296 -0
  252. nautobot/extras/templates/extras/plugin_detail.html +32 -15
  253. nautobot/extras/templates/extras/plugins_list.html +35 -1
  254. nautobot/extras/templates/extras/plugins_tiles.html +90 -0
  255. nautobot/extras/templates/extras/role_retrieve.html +16 -0
  256. nautobot/extras/templates/extras/secret.html +0 -65
  257. nautobot/extras/templates/extras/secret_check.js +16 -0
  258. nautobot/extras/templates/extras/secret_create.html +114 -0
  259. nautobot/extras/templates/extras/secret_edit.html +1 -114
  260. nautobot/extras/templates/extras/secretsgroup_edit.html +1 -1
  261. nautobot/extras/templates/extras/templatetags/plugin_object_detail_tabs.html +2 -0
  262. nautobot/extras/templatetags/job_buttons.py +5 -4
  263. nautobot/extras/templatetags/plugins.py +69 -6
  264. nautobot/extras/test_jobs/singleton.py +16 -0
  265. nautobot/extras/tests/test_api.py +145 -43
  266. nautobot/extras/tests/test_context_managers.py +4 -1
  267. nautobot/extras/tests/test_filters.py +213 -529
  268. nautobot/extras/tests/test_job_variables.py +73 -152
  269. nautobot/extras/tests/test_jobs.py +181 -51
  270. nautobot/extras/tests/test_models.py +61 -6
  271. nautobot/extras/tests/test_plugins.py +62 -9
  272. nautobot/extras/tests/test_relationships.py +123 -9
  273. nautobot/extras/tests/test_utils.py +23 -2
  274. nautobot/extras/tests/test_views.py +146 -145
  275. nautobot/extras/tests/test_webhooks.py +2 -1
  276. nautobot/extras/urls.py +2 -20
  277. nautobot/extras/utils.py +119 -4
  278. nautobot/extras/views.py +168 -125
  279. nautobot/extras/webhooks.py +5 -2
  280. nautobot/ipam/api/serializers.py +10 -103
  281. nautobot/ipam/api/views.py +31 -49
  282. nautobot/ipam/factory.py +1 -1
  283. nautobot/ipam/filters.py +3 -2
  284. nautobot/ipam/models.py +10 -12
  285. nautobot/ipam/navigation.py +0 -90
  286. nautobot/ipam/tables.py +3 -1
  287. nautobot/ipam/templates/ipam/ipaddress.html +1 -9
  288. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +1 -7
  289. nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -7
  290. nautobot/ipam/templates/ipam/prefix.html +1 -9
  291. nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
  292. nautobot/ipam/templates/ipam/routetarget.html +0 -28
  293. nautobot/ipam/templates/ipam/vlan.html +1 -9
  294. nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
  295. nautobot/ipam/templates/ipam/vrf.html +0 -47
  296. nautobot/ipam/templates/ipam/vrf_edit.html +1 -7
  297. nautobot/ipam/tests/test_api.py +7 -5
  298. nautobot/ipam/tests/test_filters.py +39 -119
  299. nautobot/ipam/tests/test_forms.py +0 -2
  300. nautobot/ipam/tests/test_models.py +56 -36
  301. nautobot/ipam/tests/test_views.py +3 -0
  302. nautobot/ipam/urls.py +3 -69
  303. nautobot/ipam/utils/__init__.py +16 -10
  304. nautobot/ipam/views.py +91 -162
  305. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  306. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  307. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +40 -2
  308. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  309. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  310. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  311. nautobot/project-static/css/base.css +38 -3
  312. nautobot/project-static/docs/404.html +461 -17
  313. nautobot/project-static/docs/apps/index.html +461 -17
  314. nautobot/project-static/docs/apps/nautobot-apps.html +462 -19
  315. nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
  316. nautobot/project-static/docs/assets/extra.css +5 -1
  317. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +477 -23
  318. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +474 -20
  319. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +790 -289
  320. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +505 -31
  321. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +510 -34
  322. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +471 -20
  323. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +467 -18
  324. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +497 -33
  325. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +9883 -0
  326. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +523 -75
  327. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +546 -51
  328. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +670 -94
  329. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1030 -177
  330. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +524 -49
  331. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +874 -188
  332. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +955 -235
  333. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +475 -21
  334. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +486 -28
  335. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +661 -99
  336. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +947 -479
  337. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +6425 -1234
  338. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +474 -20
  339. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +877 -344
  340. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +828 -171
  341. nautobot/project-static/docs/development/apps/api/configuration-view.html +461 -17
  342. nautobot/project-static/docs/development/apps/api/database-backend-config.html +461 -17
  343. nautobot/project-static/docs/development/apps/api/models/django-admin.html +461 -17
  344. nautobot/project-static/docs/development/apps/api/models/global-search.html +461 -17
  345. nautobot/project-static/docs/development/apps/api/models/graphql.html +461 -17
  346. nautobot/project-static/docs/development/apps/api/models/index.html +461 -17
  347. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +461 -17
  348. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +461 -17
  349. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +461 -17
  350. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +461 -17
  351. nautobot/project-static/docs/development/apps/api/platform-features/index.html +461 -17
  352. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +461 -17
  353. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +461 -17
  354. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +461 -17
  355. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +461 -17
  356. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +461 -17
  357. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +461 -17
  358. nautobot/project-static/docs/development/apps/api/prometheus.html +461 -17
  359. nautobot/project-static/docs/development/apps/api/setup.html +465 -153
  360. nautobot/project-static/docs/development/apps/api/testing.html +461 -17
  361. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +461 -17
  362. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +461 -17
  363. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +461 -17
  364. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +461 -17
  365. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +741 -128
  366. nautobot/project-static/docs/development/apps/api/views/base-template.html +461 -17
  367. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +461 -17
  368. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +461 -17
  369. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +461 -17
  370. nautobot/project-static/docs/development/apps/api/views/index.html +463 -18
  371. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +465 -17
  372. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +491 -17
  373. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +461 -17
  374. nautobot/project-static/docs/development/apps/api/views/notes.html +461 -17
  375. nautobot/project-static/docs/development/apps/api/views/rest-api.html +467 -19
  376. nautobot/project-static/docs/development/apps/api/views/urls.html +461 -17
  377. nautobot/project-static/docs/development/apps/index.html +461 -17
  378. nautobot/project-static/docs/development/apps/migration/code-updates.html +462 -50
  379. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +462 -18
  380. nautobot/project-static/docs/development/apps/migration/from-v1.html +461 -17
  381. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +461 -17
  382. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +461 -17
  383. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +461 -17
  384. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +464 -20
  385. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +9261 -0
  386. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +9375 -0
  387. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +9671 -0
  388. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +9559 -0
  389. nautobot/project-static/docs/development/apps/porting-from-netbox.html +464 -20
  390. nautobot/project-static/docs/development/core/application-registry.html +461 -17
  391. nautobot/project-static/docs/development/core/best-practices.html +461 -17
  392. nautobot/project-static/docs/development/core/bootstrap-ui.html +461 -17
  393. nautobot/project-static/docs/development/core/caching.html +461 -17
  394. nautobot/project-static/docs/development/core/controllers.html +463 -17
  395. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +464 -20
  396. nautobot/project-static/docs/development/core/generic-views.html +461 -17
  397. nautobot/project-static/docs/development/core/getting-started.html +539 -127
  398. nautobot/project-static/docs/development/core/homepage.html +472 -28
  399. nautobot/project-static/docs/development/core/index.html +461 -17
  400. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +9754 -0
  401. nautobot/project-static/docs/development/core/model-checklist.html +471 -25
  402. nautobot/project-static/docs/development/core/model-features.html +461 -17
  403. nautobot/project-static/docs/development/core/natural-keys.html +461 -17
  404. nautobot/project-static/docs/development/core/navigation-menu.html +478 -24
  405. nautobot/project-static/docs/development/core/release-checklist.html +478 -46
  406. nautobot/project-static/docs/development/core/role-internals.html +461 -17
  407. nautobot/project-static/docs/development/core/settings.html +461 -17
  408. nautobot/project-static/docs/development/core/style-guide.html +464 -20
  409. nautobot/project-static/docs/development/core/templates.html +471 -20
  410. nautobot/project-static/docs/development/core/testing.html +461 -17
  411. nautobot/project-static/docs/development/core/ui-component-framework.html +11116 -0
  412. nautobot/project-static/docs/development/core/user-preferences.html +464 -20
  413. nautobot/project-static/docs/development/index.html +461 -17
  414. nautobot/project-static/docs/development/jobs/index.html +499 -19
  415. nautobot/project-static/docs/development/jobs/migration/from-v1.html +461 -17
  416. nautobot/project-static/docs/index.html +469 -36
  417. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
  418. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
  419. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
  420. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
  421. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
  422. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
  423. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
  424. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
  425. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
  426. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
  427. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
  428. nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
  429. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
  430. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
  431. nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
  432. nautobot/project-static/docs/media/development/core/ui-component-framework/basic-panel-layout.png +0 -0
  433. nautobot/project-static/docs/media/development/core/ui-component-framework/button-example.png +0 -0
  434. nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
  435. nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
  436. nautobot/project-static/docs/media/development/core/ui-component-framework/dropdown-button-example.png +0 -0
  437. nautobot/project-static/docs/media/development/core/ui-component-framework/grouped-key-value-table-panel-example-1.png +0 -0
  438. nautobot/project-static/docs/media/development/core/ui-component-framework/grouped-key-value-table-panel-example-2.png +0 -0
  439. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example.png +0 -0
  440. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
  441. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
  442. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example.png +0 -0
  443. nautobot/project-static/docs/media/development/core/ui-component-framework/table-panels-family.png +0 -0
  444. nautobot/project-static/docs/media/development/core/ui-component-framework/text-panels-family.png +0 -0
  445. nautobot/project-static/docs/media/development/core/ui-component-framework/ui-framework-example.png +0 -0
  446. nautobot/project-static/docs/media/models/virtual_device_context_overview.drawio +73 -0
  447. nautobot/project-static/docs/media/models/virtual_device_context_overview.png +0 -0
  448. nautobot/project-static/docs/models/dcim/virtualdevicecontext.html +14 -0
  449. nautobot/project-static/docs/models/extras/jobqueue.html +14 -0
  450. nautobot/project-static/docs/models/wireless/radioprofile.html +14 -0
  451. nautobot/project-static/docs/models/wireless/supporteddatarate.html +14 -0
  452. nautobot/project-static/docs/models/wireless/wirelessnetwork.html +14 -0
  453. nautobot/project-static/docs/objects.inv +0 -0
  454. nautobot/project-static/docs/overview/application_stack.html +467 -21
  455. nautobot/project-static/docs/overview/design_philosophy.html +461 -17
  456. nautobot/project-static/docs/release-notes/index.html +483 -20
  457. nautobot/project-static/docs/release-notes/version-1.0.html +649 -206
  458. nautobot/project-static/docs/release-notes/version-1.1.html +646 -203
  459. nautobot/project-static/docs/release-notes/version-1.2.html +721 -278
  460. nautobot/project-static/docs/release-notes/version-1.3.html +747 -304
  461. nautobot/project-static/docs/release-notes/version-1.4.html +832 -390
  462. nautobot/project-static/docs/release-notes/version-1.5.html +1020 -579
  463. nautobot/project-static/docs/release-notes/version-1.6.html +940 -516
  464. nautobot/project-static/docs/release-notes/version-2.0.html +943 -502
  465. nautobot/project-static/docs/release-notes/version-2.1.html +778 -337
  466. nautobot/project-static/docs/release-notes/version-2.2.html +771 -330
  467. nautobot/project-static/docs/release-notes/version-2.3.html +914 -471
  468. nautobot/project-static/docs/release-notes/version-2.4.html +10323 -0
  469. nautobot/project-static/docs/search/search_index.json +1 -1
  470. nautobot/project-static/docs/sitemap.xml +342 -270
  471. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  472. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +461 -17
  473. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +461 -17
  474. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +461 -17
  475. nautobot/project-static/docs/user-guide/administration/configuration/index.html +473 -30
  476. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +461 -17
  477. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +842 -155
  478. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +461 -17
  479. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +461 -17
  480. nautobot/project-static/docs/user-guide/administration/guides/docker.html +474 -27
  481. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +461 -17
  482. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +461 -17
  483. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +461 -17
  484. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +461 -17
  485. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +461 -17
  486. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +463 -19
  487. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +461 -17
  488. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +461 -17
  489. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +461 -17
  490. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +481 -21
  491. nautobot/project-static/docs/user-guide/administration/installation/index.html +466 -18
  492. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +462 -18
  493. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +461 -17
  494. nautobot/project-static/docs/user-guide/administration/installation/services.html +461 -17
  495. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +461 -17
  496. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +482 -39
  497. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +475 -64
  498. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +475 -64
  499. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +461 -17
  500. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +461 -17
  501. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +461 -17
  502. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +461 -17
  503. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +461 -17
  504. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +464 -21
  505. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +461 -17
  506. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-nautobot-app-location.yaml +0 -16
  507. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +461 -17
  508. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +467 -19
  509. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +461 -17
  510. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +461 -17
  511. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +461 -17
  512. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +461 -17
  513. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +461 -17
  514. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +461 -17
  515. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +461 -17
  516. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +461 -17
  517. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +461 -17
  518. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +461 -17
  519. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +461 -17
  520. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +461 -17
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +461 -17
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +461 -17
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +461 -17
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +461 -17
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +461 -17
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +497 -18
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +487 -20
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +461 -17
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +461 -17
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +461 -17
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +461 -17
  532. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +461 -17
  533. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +461 -17
  534. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +461 -17
  535. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +461 -17
  536. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +461 -17
  537. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +461 -17
  538. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +461 -17
  539. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +461 -17
  540. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +461 -17
  541. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +461 -17
  542. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +461 -17
  543. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +461 -17
  544. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +461 -17
  545. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +461 -17
  546. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +461 -17
  547. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +461 -17
  548. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +461 -17
  549. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +461 -17
  550. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +461 -17
  551. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +461 -17
  552. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +461 -17
  553. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +461 -17
  554. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +461 -17
  555. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +461 -17
  556. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +461 -17
  557. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +461 -17
  558. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +461 -17
  559. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +461 -17
  560. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +461 -17
  561. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +461 -17
  562. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +9375 -0
  563. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +468 -28
  564. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +461 -17
  565. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +461 -17
  566. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +461 -17
  567. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +461 -17
  568. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +461 -17
  569. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +461 -17
  570. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +461 -17
  571. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +461 -17
  572. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +461 -17
  573. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +461 -17
  574. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +461 -17
  575. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +461 -17
  576. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +464 -20
  577. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +461 -17
  578. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +461 -17
  579. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +461 -17
  580. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +461 -17
  581. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +461 -17
  582. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +461 -17
  583. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +464 -20
  584. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +9313 -0
  585. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +9217 -0
  586. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +9211 -0
  587. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +9277 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +461 -17
  589. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +461 -17
  590. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +461 -17
  591. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +461 -17
  592. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +461 -17
  593. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +461 -17
  594. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +461 -17
  595. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +461 -17
  596. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +461 -17
  597. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +461 -17
  598. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +461 -17
  599. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +466 -20
  600. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +461 -17
  601. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
  602. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
  603. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
  604. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
  605. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
  606. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
  607. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
  608. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
  609. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
  610. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
  611. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
  612. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
  613. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
  614. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +461 -17
  615. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +461 -17
  616. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +464 -20
  617. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +9444 -0
  618. nautobot/project-static/docs/user-guide/index.html +461 -17
  619. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +464 -20
  620. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +465 -21
  621. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +461 -17
  622. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +461 -17
  623. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +461 -17
  624. nautobot/project-static/docs/user-guide/platform-functionality/events.html +9617 -0
  625. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +464 -20
  626. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +461 -17
  627. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +461 -17
  628. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +461 -17
  629. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +461 -17
  630. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +461 -17
  631. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +470 -21
  632. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +464 -20
  633. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +464 -20
  634. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +461 -17
  635. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +9224 -0
  636. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9722 -0
  637. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +464 -20
  638. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +461 -17
  639. nautobot/project-static/docs/user-guide/platform-functionality/note.html +461 -17
  640. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +461 -17
  641. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +465 -21
  642. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +9292 -0
  643. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +461 -17
  644. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +509 -38
  645. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +492 -21
  646. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +461 -17
  647. nautobot/project-static/docs/user-guide/platform-functionality/role.html +461 -17
  648. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +461 -17
  649. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +461 -17
  650. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +464 -20
  651. nautobot/project-static/docs/user-guide/platform-functionality/status.html +461 -17
  652. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +461 -17
  653. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +529 -54
  654. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +461 -17
  655. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +461 -17
  656. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +461 -17
  657. nautobot/project-static/img/jinja_logo.svg +97 -0
  658. nautobot/project-static/js/forms.js +6 -1
  659. nautobot/project-static/js/nav_menu.js +2 -1
  660. nautobot/tenancy/api/serializers.py +0 -2
  661. nautobot/tenancy/api/views.py +9 -13
  662. nautobot/tenancy/factory.py +1 -1
  663. nautobot/tenancy/navigation.py +0 -29
  664. nautobot/tenancy/templates/tenancy/tenant.html +4 -91
  665. nautobot/tenancy/tests/test_filters.py +29 -134
  666. nautobot/tenancy/views.py +35 -24
  667. nautobot/users/admin.py +2 -0
  668. nautobot/users/api/views.py +2 -2
  669. nautobot/users/forms.py +19 -0
  670. nautobot/users/templates/users/preferences.html +22 -0
  671. nautobot/users/tests/test_filters.py +1 -19
  672. nautobot/users/tests/test_views.py +57 -0
  673. nautobot/users/utils.py +8 -0
  674. nautobot/users/views.py +48 -11
  675. nautobot/virtualization/api/views.py +5 -24
  676. nautobot/virtualization/filters.py +1 -2
  677. nautobot/virtualization/models.py +1 -1
  678. nautobot/virtualization/navigation.py +0 -48
  679. nautobot/virtualization/tables.py +2 -2
  680. nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
  681. nautobot/virtualization/templates/virtualization/clustertype.html +0 -39
  682. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -9
  683. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
  684. nautobot/virtualization/tests/test_filters.py +57 -166
  685. nautobot/virtualization/views.py +18 -15
  686. nautobot/wireless/__init__.py +0 -0
  687. nautobot/wireless/api/__init__.py +0 -0
  688. nautobot/wireless/api/serializers.py +44 -0
  689. nautobot/wireless/api/urls.py +20 -0
  690. nautobot/wireless/api/views.py +34 -0
  691. nautobot/wireless/apps.py +8 -0
  692. nautobot/wireless/choices.py +345 -0
  693. nautobot/wireless/factory.py +138 -0
  694. nautobot/wireless/filters.py +167 -0
  695. nautobot/wireless/forms.py +283 -0
  696. nautobot/wireless/homepage.py +19 -0
  697. nautobot/wireless/migrations/0001_initial.py +223 -0
  698. nautobot/wireless/migrations/__init__.py +0 -0
  699. nautobot/wireless/models.py +207 -0
  700. nautobot/wireless/navigation.py +105 -0
  701. nautobot/wireless/tables.py +244 -0
  702. nautobot/wireless/templates/wireless/radioprofile_retrieve.html +81 -0
  703. nautobot/wireless/templates/wireless/supporteddatarate_retrieve.html +26 -0
  704. nautobot/wireless/templates/wireless/wirelessnetwork_create.html +88 -0
  705. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +56 -0
  706. nautobot/wireless/tests/__init__.py +0 -0
  707. nautobot/wireless/tests/integration/__init__.py +0 -0
  708. nautobot/wireless/tests/integration/test_radio_profile.py +42 -0
  709. nautobot/wireless/tests/test_api.py +247 -0
  710. nautobot/wireless/tests/test_filters.py +82 -0
  711. nautobot/wireless/tests/test_models.py +22 -0
  712. nautobot/wireless/tests/test_views.py +378 -0
  713. nautobot/wireless/urls.py +13 -0
  714. nautobot/wireless/views.py +119 -0
  715. {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/METADATA +9 -12
  716. {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/RECORD +720 -549
  717. nautobot/core/utils/navigation.py +0 -54
  718. {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/LICENSE.txt +0 -0
  719. {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/NOTICE +0 -0
  720. {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/WHEEL +0 -0
  721. {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/entry_points.txt +0 -0
@@ -6,12 +6,13 @@ from nautobot.extras.registry import registry
6
6
  from nautobot.extras.tasks import process_webhook
7
7
 
8
8
 
9
- def enqueue_webhooks(object_change, webhook_queryset=None):
9
+ def enqueue_webhooks(object_change, snapshots=None, webhook_queryset=None):
10
10
  """
11
11
  Find Webhook(s) assigned to this instance + action and enqueue them to be processed.
12
12
 
13
13
  Args:
14
14
  object_change (ObjectChange): The change that may trigger Webhooks to be sent.
15
+ snapshots (list): The before/after data snapshots corresponding to the object_change.
15
16
  webhook_queryset (QuerySet): Previously retrieved set of Webhooks to potentially send.
16
17
 
17
18
  Returns:
@@ -34,6 +35,8 @@ def enqueue_webhooks(object_change, webhook_queryset=None):
34
35
  webhook_queryset = Webhook.objects.filter(content_types=content_type, enabled=True, **{action_flag: True})
35
36
 
36
37
  if webhook_queryset: # not .exists() as we *want* to populate the queryset cache
38
+ if snapshots is None:
39
+ snapshots = object_change.get_snapshots()
37
40
  # fall back to object_data if object_data_v2 is not available
38
41
  serialized_data = object_change.object_data_v2
39
42
  if serialized_data is None:
@@ -49,7 +52,7 @@ def enqueue_webhooks(object_change, webhook_queryset=None):
49
52
  str(timezone.now()),
50
53
  object_change.user_name,
51
54
  object_change.request_id,
52
- object_change.get_snapshots(),
55
+ snapshots,
53
56
  ]
54
57
  process_webhook.apply_async(args=args)
55
58
 
@@ -42,7 +42,6 @@ class NamespaceSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
42
42
  class Meta:
43
43
  model = Namespace
44
44
  fields = "__all__"
45
- list_display_fields = ["name", "description", "location"]
46
45
 
47
46
 
48
47
  #
@@ -54,7 +53,6 @@ class VRFSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
54
53
  class Meta:
55
54
  model = VRF
56
55
  fields = "__all__"
57
- list_display_fields = ["name", "rd", "tenant", "description"]
58
56
  extra_kwargs = {"namespace": {"default": get_default_namespace}}
59
57
 
60
58
 
@@ -91,7 +89,6 @@ class RouteTargetSerializer(NautobotModelSerializer, TaggedModelSerializerMixin)
91
89
  class Meta:
92
90
  model = RouteTarget
93
91
  fields = "__all__"
94
- list_display_fields = ["name", "tenant", "description"]
95
92
 
96
93
 
97
94
  #
@@ -105,12 +102,6 @@ class RIRSerializer(NautobotModelSerializer):
105
102
  class Meta:
106
103
  model = RIR
107
104
  fields = "__all__"
108
- list_display_fields = [
109
- "name",
110
- "is_private",
111
- "assigned_prefix_count",
112
- "description",
113
- ]
114
105
 
115
106
 
116
107
  #
@@ -124,7 +115,6 @@ class VLANGroupSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
124
115
  class Meta:
125
116
  model = VLANGroup
126
117
  fields = "__all__"
127
- list_display_fields = ["name", "location", "vlan_count", "description"]
128
118
 
129
119
 
130
120
  class VLANSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
@@ -139,20 +129,7 @@ class VLANSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
139
129
 
140
130
  class Meta:
141
131
  model = VLAN
142
- # TODO(jathan): These were taken from VLANDetailTable and not VLANTable. Let's make sure
143
- # these are correct.
144
132
  fields = "__all__"
145
- list_display_fields = [
146
- "vid",
147
- "locations",
148
- "vlan_group",
149
- "name",
150
- "prefixes",
151
- "tenant",
152
- "status",
153
- "role",
154
- "description",
155
- ]
156
133
  validators = []
157
134
  extra_kwargs = {"locations": {"read_only": True}}
158
135
 
@@ -228,52 +205,21 @@ class PrefixSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
228
205
  write_only=True,
229
206
  )
230
207
 
208
+ def get_field_names(self, declared_fields, info):
209
+ """Add reverse M2M for VRF's to the fields for this serializer."""
210
+ field_names = list(super().get_field_names(declared_fields, info))
211
+ self.extend_field_names(field_names, "vrfs")
212
+ return field_names
213
+
231
214
  class Meta:
232
215
  model = Prefix
233
216
  fields = "__all__"
234
- list_display_fields = [
235
- "prefix",
236
- "namespace",
237
- "type",
238
- "status",
239
- "vrf",
240
- "tenant",
241
- "locations",
242
- "vlan",
243
- "role",
244
- "description",
245
- ]
246
217
  extra_kwargs = {
247
218
  "ip_version": {"read_only": True},
248
219
  "namespace": {"default": get_default_namespace},
249
220
  "prefix_length": {"read_only": True},
250
221
  "locations": {"read_only": True},
251
- }
252
-
253
- detail_view_config = {
254
- "layout": [
255
- {
256
- "Prefix": {
257
- "fields": [
258
- "prefix",
259
- "parent",
260
- "namespace",
261
- "type",
262
- "network",
263
- "broadcast",
264
- "prefix_length",
265
- "ip_version",
266
- "description",
267
- "role",
268
- "vlan",
269
- "locations",
270
- "tenant",
271
- "rir",
272
- "date_allocated",
273
- ]
274
- },
275
- },
276
- ],
222
+ "vrfs": {"read_only": True},
277
223
  }
278
224
 
279
225
 
@@ -374,16 +320,6 @@ class IPAddressSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
374
320
  class Meta:
375
321
  model = IPAddress
376
322
  fields = "__all__"
377
- list_display_fields = [
378
- "address",
379
- "type",
380
- "vrf",
381
- "status",
382
- "role",
383
- "tenant",
384
- "dns_name",
385
- "description",
386
- ]
387
323
  extra_kwargs = {
388
324
  "ip_version": {"read_only": True},
389
325
  "mask_length": {"read_only": True},
@@ -391,32 +327,6 @@ class IPAddressSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
391
327
  "parent": {"required": False},
392
328
  }
393
329
 
394
- detail_view_config = {
395
- "layout": [
396
- {
397
- "IP Address": {
398
- "fields": [
399
- # FixMe(timizuo): Missing in new-ui; resolve when working on #4355
400
- "namespace",
401
- "ip_version",
402
- "type",
403
- "role",
404
- "dns_name",
405
- "description",
406
- ]
407
- },
408
- "Operational Details": {
409
- "fields": [
410
- "tenant",
411
- "assigned", # FixMe(timizuo) Missing in new-ui; resolve when working on #4355
412
- "nat_inside",
413
- "nat_outside_list",
414
- ]
415
- },
416
- },
417
- ],
418
- }
419
-
420
330
  def validate(self, attrs):
421
331
  namespace = attrs.get("namespace", None)
422
332
  parent = attrs.get("parent", None)
@@ -489,7 +399,9 @@ class VLANAllocationSerializer(NautobotModelSerializer, TaggedModelSerializerMix
489
399
  vid = serializers.IntegerField(required=False, min_value=constants.VLAN_VID_MIN, max_value=constants.VLAN_VID_MAX)
490
400
 
491
401
  def validate(self, attrs):
492
- """Skip `ValidatedModel` validation.
402
+ """
403
+ Skip `ValidatedModel` validation.
404
+
493
405
  This allows to skip `vid` attribute of `VLAN` model, while validate name and status.
494
406
  """
495
407
  return attrs
@@ -559,11 +471,6 @@ class ServiceSerializer(NautobotModelSerializer, TaggedModelSerializerMixin):
559
471
  "device": {"help_text": "Required if no virtual_machine is specified"},
560
472
  "virtual_machine": {"help_text": "Required if no device is specified"},
561
473
  }
562
- # TODO(jathan): We need to account for the "parent" field from the `ServiceTable` which is
563
- # an either/or column for `device` or `virtual_machine`. For now it's hard-coded to
564
- # `device`.
565
- # list_display_fields = ["name", "parent", "protocol", "ports", "description"]
566
- list_display_fields = ["name", "device", "protocol", "ports", "description"]
567
474
 
568
475
  def validate(self, attrs):
569
476
  if attrs.get("device"):
@@ -9,6 +9,7 @@ from rest_framework.response import Response
9
9
  from rest_framework.serializers import IntegerField, ListSerializer
10
10
 
11
11
  from nautobot.core.api.authentication import TokenPermissions
12
+ from nautobot.core.constants import MAX_PAGE_SIZE_DEFAULT, PAGINATE_COUNT_DEFAULT
12
13
  from nautobot.core.models.querysets import count_related
13
14
  from nautobot.core.utils.config import get_settings_or_config
14
15
  from nautobot.dcim.models import Location
@@ -49,21 +50,19 @@ class NamespaceViewSet(NautobotModelViewSet):
49
50
 
50
51
 
51
52
  class VRFViewSet(NautobotModelViewSet):
52
- queryset = VRF.objects.select_related("namespace", "tenant").prefetch_related(
53
- "devices", "virtual_machines", "prefixes", "import_targets", "export_targets", "tags"
54
- )
53
+ queryset = VRF.objects.all()
55
54
  serializer_class = serializers.VRFSerializer
56
55
  filterset_class = filters.VRFFilterSet
57
56
 
58
57
 
59
58
  class VRFDeviceAssignmentViewSet(NautobotModelViewSet):
60
- queryset = VRFDeviceAssignment.objects.select_related("vrf", "device", "virtual_machine")
59
+ queryset = VRFDeviceAssignment.objects.all()
61
60
  serializer_class = serializers.VRFDeviceAssignmentSerializer
62
61
  filterset_class = filters.VRFDeviceAssignmentFilterSet
63
62
 
64
63
 
65
64
  class VRFPrefixAssignmentViewSet(NautobotModelViewSet):
66
- queryset = VRFPrefixAssignment.objects.select_related("vrf", "prefix")
65
+ queryset = VRFPrefixAssignment.objects.all()
67
66
  serializer_class = serializers.VRFPrefixAssignmentSerializer
68
67
  filterset_class = filters.VRFPrefixAssignmentFilterSet
69
68
 
@@ -74,7 +73,7 @@ class VRFPrefixAssignmentViewSet(NautobotModelViewSet):
74
73
 
75
74
 
76
75
  class RouteTargetViewSet(NautobotModelViewSet):
77
- queryset = RouteTarget.objects.select_related("tenant").prefetch_related("tags")
76
+ queryset = RouteTarget.objects.all()
78
77
  serializer_class = serializers.RouteTargetSerializer
79
78
  filterset_class = filters.RouteTargetFilterSet
80
79
 
@@ -109,21 +108,14 @@ class RIRViewSet(NautobotModelViewSet):
109
108
  update=extend_schema(responses={"200": serializers.PrefixLegacySerializer}, versions=["2.0", "2.1"]),
110
109
  )
111
110
  class PrefixViewSet(NautobotModelViewSet):
112
- queryset = Prefix.objects.select_related(
113
- "namespace",
114
- "parent",
115
- "rir",
116
- "role",
117
- "status",
118
- "tenant",
119
- "vlan",
120
- ).prefetch_related("locations", "tags")
111
+ queryset = Prefix.objects.all()
121
112
  serializer_class = serializers.PrefixSerializer
122
113
  filterset_class = filters.PrefixFilterSet
123
114
 
124
115
  def get_serializer_class(self):
125
116
  if (
126
117
  not getattr(self, "swagger_fake_view", False)
118
+ and hasattr(self.request, "major_version")
127
119
  and self.request.major_version == 2
128
120
  and self.request.minor_version < 2
129
121
  ):
@@ -303,11 +295,15 @@ class PrefixViewSet(NautobotModelViewSet):
303
295
  # Determine the maximum number of IPs to return
304
296
  else:
305
297
  try:
306
- limit = int(request.query_params.get("limit", get_settings_or_config("PAGINATE_COUNT")))
298
+ limit = int(
299
+ request.query_params.get(
300
+ "limit", get_settings_or_config("PAGINATE_COUNT", fallback=PAGINATE_COUNT_DEFAULT)
301
+ )
302
+ )
307
303
  except ValueError:
308
- limit = get_settings_or_config("PAGINATE_COUNT")
309
- if get_settings_or_config("MAX_PAGE_SIZE"):
310
- limit = min(limit, get_settings_or_config("MAX_PAGE_SIZE"))
304
+ limit = get_settings_or_config("PAGINATE_COUNT", fallback=PAGINATE_COUNT_DEFAULT)
305
+ if get_settings_or_config("MAX_PAGE_SIZE", fallback=MAX_PAGE_SIZE_DEFAULT):
306
+ limit = min(limit, get_settings_or_config("MAX_PAGE_SIZE", fallback=MAX_PAGE_SIZE_DEFAULT))
311
307
 
312
308
  # Calculate available IPs within the prefix
313
309
  ip_list = []
@@ -328,7 +324,7 @@ class PrefixViewSet(NautobotModelViewSet):
328
324
 
329
325
 
330
326
  class PrefixLocationAssignmentViewSet(NautobotModelViewSet):
331
- queryset = PrefixLocationAssignment.objects.select_related("prefix", "location")
327
+ queryset = PrefixLocationAssignment.objects.all()
332
328
  serializer_class = serializers.PrefixLocationAssignmentSerializer
333
329
  filterset_class = filters.PrefixLocationAssignmentFilterSet
334
330
 
@@ -339,13 +335,7 @@ class PrefixLocationAssignmentViewSet(NautobotModelViewSet):
339
335
 
340
336
 
341
337
  class IPAddressViewSet(NautobotModelViewSet):
342
- queryset = IPAddress.objects.select_related(
343
- "nat_inside",
344
- "parent",
345
- "role",
346
- "status",
347
- "tenant",
348
- ).prefetch_related("tags", "nat_outside_list")
338
+ queryset = IPAddress.objects.select_related("parent__namespace")
349
339
  serializer_class = serializers.IPAddressSerializer
350
340
  filterset_class = filters.IPAddressFilterSet
351
341
 
@@ -356,7 +346,7 @@ class IPAddressViewSet(NautobotModelViewSet):
356
346
 
357
347
 
358
348
  class IPAddressToInterfaceViewSet(NautobotModelViewSet):
359
- queryset = IPAddressToInterface.objects.select_related("interface", "ip_address", "vm_interface")
349
+ queryset = IPAddressToInterface.objects.all()
360
350
  serializer_class = serializers.IPAddressToInterfaceSerializer
361
351
  filterset_class = filters.IPAddressToInterfaceFilterSet
362
352
 
@@ -367,11 +357,7 @@ class IPAddressToInterfaceViewSet(NautobotModelViewSet):
367
357
 
368
358
 
369
359
  class VLANGroupViewSet(NautobotModelViewSet):
370
- queryset = (
371
- VLANGroup.objects.select_related("location")
372
- .prefetch_related("tags")
373
- .annotate(vlan_count=count_related(VLAN, "vlan_group"))
374
- )
360
+ queryset = VLANGroup.objects.annotate(vlan_count=count_related(VLAN, "vlan_group"))
375
361
  serializer_class = serializers.VLANGroupSerializer
376
362
  filterset_class = filters.VLANGroupFilterSet
377
363
 
@@ -503,12 +489,16 @@ class VLANGroupViewSet(NautobotModelViewSet):
503
489
 
504
490
  else:
505
491
  try:
506
- limit = int(request.query_params.get("limit", get_settings_or_config("PAGINATE_COUNT")))
492
+ limit = int(
493
+ request.query_params.get(
494
+ "limit", get_settings_or_config("PAGINATE_COUNT", fallback=PAGINATE_COUNT_DEFAULT)
495
+ )
496
+ )
507
497
  except ValueError:
508
- limit = get_settings_or_config("PAGINATE_COUNT")
498
+ limit = get_settings_or_config("PAGINATE_COUNT", fallback=PAGINATE_COUNT_DEFAULT)
509
499
 
510
- if get_settings_or_config("MAX_PAGE_SIZE"):
511
- limit = min(limit, get_settings_or_config("MAX_PAGE_SIZE"))
500
+ if get_settings_or_config("MAX_PAGE_SIZE", fallback=MAX_PAGE_SIZE_DEFAULT):
501
+ limit = min(limit, get_settings_or_config("MAX_PAGE_SIZE", fallback=MAX_PAGE_SIZE_DEFAULT))
512
502
 
513
503
  if isinstance(limit, int) and limit >= 0:
514
504
  vids = vlan_group.available_vids[0:limit]
@@ -549,16 +539,7 @@ class VLANGroupViewSet(NautobotModelViewSet):
549
539
  update=extend_schema(responses={"200": serializers.VLANLegacySerializer}, versions=["2.0", "2.1"]),
550
540
  )
551
541
  class VLANViewSet(NautobotModelViewSet):
552
- queryset = (
553
- VLAN.objects.select_related(
554
- "vlan_group",
555
- "status",
556
- "role",
557
- "tenant",
558
- )
559
- .prefetch_related("tags")
560
- .annotate(prefix_count=count_related(Prefix, "vlan"))
561
- )
542
+ queryset = VLAN.objects.annotate(prefix_count=count_related(Prefix, "vlan"))
562
543
  serializer_class = serializers.VLANSerializer
563
544
  filterset_class = filters.VLANFilterSet
564
545
 
@@ -573,6 +554,7 @@ class VLANViewSet(NautobotModelViewSet):
573
554
  def get_serializer_class(self):
574
555
  if (
575
556
  not getattr(self, "swagger_fake_view", False)
557
+ and hasattr(self.request, "major_version")
576
558
  and self.request.major_version == 2
577
559
  and self.request.minor_version < 2
578
560
  ):
@@ -600,7 +582,7 @@ class VLANViewSet(NautobotModelViewSet):
600
582
 
601
583
 
602
584
  class VLANLocationAssignmentViewSet(NautobotModelViewSet):
603
- queryset = VLANLocationAssignment.objects.select_related("vlan", "location")
585
+ queryset = VLANLocationAssignment.objects.all()
604
586
  serializer_class = serializers.VLANLocationAssignmentSerializer
605
587
  filterset_class = filters.VLANLocationAssignmentFilterSet
606
588
 
@@ -611,6 +593,6 @@ class VLANLocationAssignmentViewSet(NautobotModelViewSet):
611
593
 
612
594
 
613
595
  class ServiceViewSet(NautobotModelViewSet):
614
- queryset = Service.objects.select_related("device", "virtual_machine").prefetch_related("tags", "ip_addresses")
596
+ queryset = Service.objects.all()
615
597
  serializer_class = serializers.ServiceSerializer
616
598
  filterset_class = filters.ServiceFilterSet
nautobot/ipam/factory.py CHANGED
@@ -410,7 +410,7 @@ class PrefixFactory(PrimaryModelFactory):
410
410
  # Calculate prefix length for child prefixes to allow them to fit in the parent prefix without creating duplicate prefix
411
411
  child_cidr = self.prefix_length + max(1, math.ceil(math.log(child_count, 2)))
412
412
  # Raise exception for invalid cidr length (>128 for ipv6, >32 for ipv4)
413
- if child_cidr > 128 or self.ip_version == 4 and child_cidr > 32:
413
+ if child_cidr > 128 or (self.ip_version == 4 and child_cidr > 32):
414
414
  raise ValueError(f"Unable to create {child_count} child prefixes in container prefix {self.cidr_str}.")
415
415
 
416
416
  weights = [1, 6, 3] # prefer network and pool prefixes
nautobot/ipam/filters.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ import uuid
2
3
 
3
4
  from django.core.exceptions import ValidationError
4
5
  from django.db.models import Q
@@ -323,7 +324,7 @@ class PrefixFilterSet(
323
324
  return prefixes_queryset
324
325
 
325
326
  def generate_query_filter_present_in_vrf(self, value):
326
- if isinstance(value, str):
327
+ if isinstance(value, (str, uuid.UUID)):
327
328
  value = VRF.objects.get(pk=value)
328
329
 
329
330
  query = Q(vrfs=value) | Q(vrfs__export_targets__in=value.import_targets.all())
@@ -485,7 +486,7 @@ class IPAddressFilterSet(
485
486
  return queryset.none()
486
487
 
487
488
  def generate_query_filter_present_in_vrf(self, value):
488
- if isinstance(value, str):
489
+ if isinstance(value, (str, uuid.UUID)):
489
490
  value = VRF.objects.get(pk=value)
490
491
 
491
492
  query = Q(parent__vrfs=value) | Q(parent__vrfs__export_targets__in=value.import_targets.all())
nautobot/ipam/models.py CHANGED
@@ -27,18 +27,18 @@ from .querysets import IPAddressQuerySet, PrefixQuerySet, RIRQuerySet, VLANQuery
27
27
  from .validators import DNSValidator
28
28
 
29
29
  __all__ = (
30
+ "RIR",
31
+ "VLAN",
32
+ "VRF",
30
33
  "IPAddress",
31
34
  "IPAddressToInterface",
32
35
  "Namespace",
33
36
  "Prefix",
34
37
  "PrefixLocationAssignment",
35
- "RIR",
36
38
  "RouteTarget",
37
39
  "Service",
38
- "VLAN",
39
40
  "VLANGroup",
40
41
  "VLANLocationAssignment",
41
- "VRF",
42
42
  "VRFDeviceAssignment",
43
43
  "VRFPrefixAssignment",
44
44
  )
@@ -648,19 +648,18 @@ class Prefix(PrimaryModel):
648
648
  return None
649
649
 
650
650
  def clean(self):
651
- if self.prefix:
652
- # self.parent depends on self.prefix having a value
653
- self.parent = self.get_parent()
654
- super().clean()
655
-
656
- def save(self, *args, **kwargs):
657
- if isinstance(self.prefix, netaddr.IPNetwork):
651
+ if self.prefix is not None: # missing network/prefix_length will be caught by super().clean()
658
652
  # Clear host bits from prefix
659
653
  # This also has the subtle side effect of calling self._deconstruct_prefix(),
660
654
  # which will (re)set the broadcast and ip_version values of this instance to their correct values.
661
655
  self.prefix = self.prefix.cidr
662
656
 
663
- self.parent = self.get_parent()
657
+ self.parent = self.get_parent()
658
+
659
+ super().clean()
660
+
661
+ def save(self, *args, **kwargs):
662
+ self.clean()
664
663
 
665
664
  # Validate that creation of this prefix does not create an invalid parent/child relationship
666
665
  # 3.0 TODO: uncomment this to enforce this constraint
@@ -1408,7 +1407,6 @@ class VLANGroup(PrimaryModel):
1408
1407
 
1409
1408
  def clean(self):
1410
1409
  super().clean()
1411
-
1412
1410
  # Validate location
1413
1411
  if self.location is not None:
1414
1412
  if ContentType.objects.get_for_model(self) not in self.location.location_type.content_types.all():
@@ -1,7 +1,4 @@
1
1
  from nautobot.core.apps import (
2
- NavContext,
3
- NavGrouping,
4
- NavItem,
5
2
  NavMenuAddButton,
6
3
  NavMenuGroup,
7
4
  NavMenuItem,
@@ -205,90 +202,3 @@ menu_items = (
205
202
  ),
206
203
  ),
207
204
  )
208
-
209
-
210
- navigation = (
211
- NavContext(
212
- name="Networks",
213
- groups=(
214
- NavGrouping(
215
- name="IP Management",
216
- weight=100,
217
- items=(
218
- NavItem(
219
- name="IP Addresses",
220
- weight=100,
221
- link="ipam:ipaddress_list",
222
- permissions=["ipam.view_ipaddress"],
223
- ),
224
- NavItem(
225
- name="Prefixes",
226
- weight=200,
227
- link="ipam:prefix_list",
228
- permissions=["ipam.view_prefix"],
229
- ),
230
- NavItem(
231
- name="RIRs",
232
- weight=300,
233
- link="ipam:rir_list",
234
- permissions=["ipam.view_rir"],
235
- ),
236
- ),
237
- ),
238
- NavGrouping(
239
- name="Layer 2 / Switching",
240
- weight=200,
241
- items=(
242
- NavItem(
243
- name="VLANs",
244
- weight=100,
245
- link="ipam:vlan_list",
246
- permissions=["ipam.view_vlan"],
247
- ),
248
- NavItem(
249
- name="VLAN Groups",
250
- weight=200,
251
- link="ipam:vlangroup_list",
252
- permissions=["ipam.view_vlangroup"],
253
- ),
254
- ),
255
- ),
256
- NavGrouping(
257
- name="Layer 3 / Routing",
258
- weight=300,
259
- items=(
260
- NavItem(
261
- name="Namespaces",
262
- weight=100,
263
- link="ipam:namespace_list",
264
- permissions=["ipam.view_namespace"],
265
- ),
266
- NavItem(
267
- name="VRFs",
268
- weight=200,
269
- link="ipam:vrf_list",
270
- permissions=["ipam.view_vrf"],
271
- ),
272
- NavItem(
273
- name="Route Targets",
274
- weight=300,
275
- link="ipam:routetarget_list",
276
- permissions=["ipam.view_routetarget"],
277
- ),
278
- ),
279
- ),
280
- NavGrouping(
281
- name="Services",
282
- weight=400,
283
- items=(
284
- NavItem(
285
- name="Services",
286
- weight=100,
287
- link="ipam:service_list",
288
- permissions=["ipam.view_service"],
289
- ),
290
- ),
291
- ),
292
- ),
293
- ),
294
- )
nautobot/ipam/tables.py CHANGED
@@ -43,9 +43,11 @@ UTILIZATION_GRAPH = """
43
43
  """
44
44
 
45
45
 
46
+ # record: the Prefix being rendered in this row
47
+ # object: the base ancestor Prefix, in the case of PrefixDetailTable, else None
46
48
  PREFIX_COPY_LINK = """
47
49
  {% load helpers %}
48
- {% tree_hierarchy_ui_representation record.ancestors.count|as_range table.hide_hierarchy_ui%}
50
+ {% tree_hierarchy_ui_representation record.ancestors.count|as_range table.hide_hierarchy_ui base_tree_depth|default:0 %}
49
51
  <span class="hover_copy">
50
52
  <a href="\
51
53
  {% if record.present_in_database %}\
@@ -83,15 +83,7 @@
83
83
  <strong>Operational Details</strong>
84
84
  </div>
85
85
  <table class="table table-hover panel-body attr-table">
86
- <tr>
87
- <td>Tenant</td>
88
- <td>
89
- {% if object.tenant and object.tenant.tenant_group %}
90
- {{ object.tenant.tenant_group|hyperlinked_object }} /
91
- {% endif %}
92
- {{ object.tenant|hyperlinked_object }}
93
- </td>
94
- </tr>
86
+ {% include 'inc/tenant_table_row.html' %}
95
87
  <tr>
96
88
  <td>Assignment</td>
97
89
  <td>
@@ -21,12 +21,6 @@
21
21
  {% render_field model_form.description %}
22
22
  </div>
23
23
  </div>
24
- <div class="panel panel-default">
25
- <div class="panel-heading"><strong>Tenancy</strong></div>
26
- <div class="panel-body">
27
- {% render_field model_form.tenant_group %}
28
- {% render_field model_form.tenant %}
29
- </div>
30
- </div>
24
+ {% include 'inc/tenancy_form_panel.html' %}
31
25
  {% include 'inc/extras_features_edit_form_fields.html' with form=model_form %}
32
26
  {% endblock %}
@@ -22,13 +22,7 @@
22
22
  {% render_field form.description %}
23
23
  </div>
24
24
  </div>
25
- <div class="panel panel-default">
26
- <div class="panel-heading"><strong>Tenancy</strong></div>
27
- <div class="panel-body">
28
- {% render_field form.tenant_group %}
29
- {% render_field form.tenant %}
30
- </div>
31
- </div>
25
+ {% include 'inc/tenancy_form_panel.html' %}
32
26
  <div class="panel panel-default">
33
27
  <div class="panel-heading"><strong>NAT IP (Inside)</strong></div>
34
28
  <div class="panel-body">