nautobot 2.0.0a2__py3-none-any.whl → 2.0.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1029) hide show
  1. nautobot/__init__.py +1 -5
  2. nautobot/apps/api.py +6 -8
  3. nautobot/apps/forms.py +0 -2
  4. nautobot/apps/ui.py +0 -8
  5. nautobot/circuits/api/serializers.py +9 -119
  6. nautobot/circuits/api/urls.py +1 -1
  7. nautobot/circuits/api/views.py +0 -1
  8. nautobot/circuits/choices.py +0 -2
  9. nautobot/circuits/filters.py +7 -6
  10. nautobot/circuits/forms.py +3 -73
  11. nautobot/circuits/migrations/0001_initial_part_1.py +0 -1
  12. nautobot/circuits/migrations/0002_initial_part_2.py +0 -1
  13. nautobot/circuits/migrations/0003_auto_slug.py +0 -1
  14. nautobot/circuits/migrations/0004_increase_provider_account_length.py +0 -1
  15. nautobot/circuits/migrations/0005_providernetwork.py +0 -1
  16. nautobot/circuits/migrations/0006_cache_circuit_terminations.py +0 -1
  17. nautobot/circuits/migrations/0007_circuitterminations_primary_model.py +0 -1
  18. nautobot/circuits/migrations/0008_add_natural_indexing.py +0 -1
  19. nautobot/circuits/migrations/0009_circuittermination_location.py +0 -1
  20. nautobot/circuits/migrations/0010_rename_foreign_keys_and_related_names.py +0 -1
  21. nautobot/circuits/migrations/0011_remove_site_foreign_key_from_circuit_termination_class.py +0 -1
  22. nautobot/circuits/migrations/0012_created_datetime.py +0 -1
  23. nautobot/circuits/migrations/0013_alter_circuittermination__path.py +0 -1
  24. nautobot/circuits/migrations/0014_related_name_changes.py +1 -2
  25. nautobot/circuits/migrations/0015_remove_circuittype_provider_slug.py +20 -0
  26. nautobot/circuits/migrations/0016_tagsfield.py +34 -0
  27. nautobot/circuits/migrations/0017_fixup_null_statuses.py +22 -0
  28. nautobot/circuits/migrations/0018_status_nonnullable.py +22 -0
  29. nautobot/circuits/models.py +3 -93
  30. nautobot/circuits/navigation.py +14 -69
  31. nautobot/circuits/signals.py +0 -2
  32. nautobot/circuits/tables.py +42 -5
  33. nautobot/circuits/templates/circuits/circuit_retrieve.html +1 -1
  34. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +1 -1
  35. nautobot/circuits/templates/circuits/circuittype_retrieve.html +1 -1
  36. nautobot/circuits/templates/circuits/provider_create.html +0 -1
  37. nautobot/circuits/templates/circuits/provider_retrieve.html +1 -1
  38. nautobot/circuits/tests/integration/test_relationships.py +13 -16
  39. nautobot/circuits/tests/test_api.py +13 -43
  40. nautobot/circuits/tests/test_filters.py +20 -15
  41. nautobot/circuits/tests/test_models.py +7 -3
  42. nautobot/circuits/tests/test_views.py +57 -67
  43. nautobot/circuits/views.py +18 -9
  44. nautobot/core/api/__init__.py +8 -2
  45. nautobot/core/api/authentication.py +0 -3
  46. nautobot/core/api/fields.py +15 -6
  47. nautobot/core/api/filter_backends.py +3 -2
  48. nautobot/core/api/metadata.py +237 -30
  49. nautobot/core/api/mixins.py +94 -0
  50. nautobot/core/api/pagination.py +3 -3
  51. nautobot/core/api/parsers.py +154 -0
  52. nautobot/core/api/renderers.py +153 -2
  53. nautobot/core/api/schema.py +47 -3
  54. nautobot/core/api/serializers.py +377 -37
  55. nautobot/core/api/urls.py +11 -3
  56. nautobot/core/api/utils.py +174 -2
  57. nautobot/core/api/versioning.py +32 -10
  58. nautobot/core/api/views.py +266 -75
  59. nautobot/core/apps/__init__.py +138 -221
  60. nautobot/core/celery/__init__.py +112 -41
  61. nautobot/core/celery/backends.py +19 -13
  62. nautobot/core/celery/control.py +46 -0
  63. nautobot/core/celery/encoders.py +53 -0
  64. nautobot/core/celery/log.py +38 -0
  65. nautobot/core/celery/schedulers.py +23 -4
  66. nautobot/core/celery/task.py +1 -16
  67. nautobot/core/checks.py +0 -27
  68. nautobot/core/choices.py +21 -113
  69. nautobot/core/{cli.py → cli/__init__.py} +1 -2
  70. nautobot/core/cli/__main__.py +3 -0
  71. nautobot/core/constants.py +25 -43
  72. nautobot/core/context_processors.py +12 -0
  73. nautobot/core/filters.py +2 -2
  74. nautobot/core/forms/__init__.py +0 -4
  75. nautobot/core/forms/fields.py +39 -68
  76. nautobot/core/forms/forms.py +27 -27
  77. nautobot/core/forms/utils.py +7 -59
  78. nautobot/core/forms/widgets.py +0 -1
  79. nautobot/core/graphql/__init__.py +2 -2
  80. nautobot/core/graphql/schema.py +4 -27
  81. nautobot/core/jobs/__init__.py +75 -0
  82. nautobot/core/management/commands/build_ui.py +255 -0
  83. nautobot/core/management/commands/celery.py +0 -1
  84. nautobot/core/management/commands/generate_test_data.py +18 -13
  85. nautobot/core/management/commands/post_upgrade.py +24 -24
  86. nautobot/core/management/commands/validate_models.py +0 -1
  87. nautobot/core/middleware.py +0 -1
  88. nautobot/core/models/__init__.py +26 -1
  89. nautobot/core/models/fields.py +24 -5
  90. nautobot/core/models/generics.py +2 -46
  91. nautobot/core/models/managers.py +5 -0
  92. nautobot/core/models/name_color_content_types.py +1 -19
  93. nautobot/core/models/tree_queries.py +14 -4
  94. nautobot/core/models/utils.py +9 -10
  95. nautobot/core/models/validators.py +17 -8
  96. nautobot/core/releases.py +8 -10
  97. nautobot/core/settings.py +81 -53
  98. nautobot/core/tables.py +5 -5
  99. nautobot/core/tasks.py +4 -7
  100. nautobot/core/templates/base.html +1 -49
  101. nautobot/core/templates/base_django.html +49 -0
  102. nautobot/core/templates/base_react.html +55 -0
  103. nautobot/core/templates/buttons/export.html +6 -4
  104. nautobot/core/templates/generic/object_bulk_create.html +10 -21
  105. nautobot/core/templates/generic/object_list.html +4 -1
  106. nautobot/core/templates/generic/object_retrieve_plugin_full_width.html +3 -0
  107. nautobot/core/templates/inc/footer.html +1 -0
  108. nautobot/core/templates/inc/javascript.html +0 -14
  109. nautobot/core/templates/inc/nav_menu.html +28 -33
  110. nautobot/core/templates/inc/object_details_advanced_panel.html +13 -0
  111. nautobot/core/templates/inc/relationships_table_rows.html +2 -2
  112. nautobot/core/templates/nautobot_config.py.j2 +8 -25
  113. nautobot/core/templates/plugin_template/__init__.py-tpl +1 -2
  114. nautobot/core/templates/rest_framework/api.html +8 -0
  115. nautobot/core/templatetags/buttons.py +32 -29
  116. nautobot/core/templatetags/helpers.py +1 -1
  117. nautobot/core/testing/__init__.py +47 -44
  118. nautobot/core/testing/api.py +365 -47
  119. nautobot/core/testing/filters.py +12 -7
  120. nautobot/core/testing/integration.py +1 -1
  121. nautobot/core/testing/migrations.py +2 -0
  122. nautobot/core/testing/mixins.py +22 -12
  123. nautobot/core/testing/schema.py +2 -1
  124. nautobot/core/testing/views.py +28 -51
  125. nautobot/core/tests/integration/test_filters.py +17 -8
  126. nautobot/core/tests/integration/test_navbar.py +11 -34
  127. nautobot/core/tests/integration/test_plugin_navbar.py +9 -103
  128. nautobot/core/tests/nautobot_config.py +2 -3
  129. nautobot/core/tests/runner.py +0 -1
  130. nautobot/core/tests/test_api.py +290 -24
  131. nautobot/core/tests/test_authentication.py +57 -14
  132. nautobot/core/tests/test_checks.py +0 -7
  133. nautobot/core/tests/test_choices.py +0 -1
  134. nautobot/core/tests/test_filters.py +117 -110
  135. nautobot/core/tests/test_forms.py +47 -110
  136. nautobot/core/tests/test_graphql.py +158 -135
  137. nautobot/core/tests/test_logging.py +4 -1
  138. nautobot/core/tests/test_managers.py +3 -5
  139. nautobot/core/tests/test_models.py +2 -0
  140. nautobot/core/tests/test_ordering.py +0 -2
  141. nautobot/core/tests/test_paginator.py +3 -1
  142. nautobot/core/tests/test_releases.py +12 -12
  143. nautobot/core/tests/test_templatetags_helpers.py +7 -4
  144. nautobot/core/tests/test_utils.py +112 -78
  145. nautobot/core/tests/test_views.py +12 -17
  146. nautobot/core/tests/test_views_utils.py +6 -9
  147. nautobot/core/utils/data.py +17 -0
  148. nautobot/core/utils/deprecation.py +13 -20
  149. nautobot/core/utils/filtering.py +53 -9
  150. nautobot/core/utils/git.py +12 -4
  151. nautobot/core/utils/lookup.py +3 -1
  152. nautobot/core/utils/requests.py +23 -116
  153. nautobot/core/views/__init__.py +1 -2
  154. nautobot/core/views/generic.py +131 -119
  155. nautobot/core/views/mixins.py +53 -62
  156. nautobot/core/views/paginator.py +0 -1
  157. nautobot/core/views/renderers.py +14 -12
  158. nautobot/core/views/utils.py +87 -4
  159. nautobot/dcim/api/serializers.py +160 -672
  160. nautobot/dcim/api/urls.py +1 -1
  161. nautobot/dcim/api/views.py +7 -46
  162. nautobot/dcim/choices.py +2 -25
  163. nautobot/dcim/elevations.py +0 -1
  164. nautobot/dcim/factory.py +15 -4
  165. nautobot/dcim/filters/__init__.py +42 -13
  166. nautobot/dcim/form_mixins.py +1 -27
  167. nautobot/dcim/forms.py +58 -797
  168. nautobot/dcim/management/commands/trace_paths.py +0 -1
  169. nautobot/dcim/migrations/0001_initial_part_1.py +0 -1
  170. nautobot/dcim/migrations/0002_initial_part_2.py +0 -1
  171. nautobot/dcim/migrations/0003_initial_part_3.py +0 -1
  172. nautobot/dcim/migrations/0004_initial_part_4.py +0 -1
  173. nautobot/dcim/migrations/0005_device_local_context_schema.py +0 -1
  174. nautobot/dcim/migrations/0006_auto_slug.py +0 -1
  175. nautobot/dcim/migrations/0007_device_secrets_group.py +0 -1
  176. nautobot/dcim/migrations/0008_increase_all_serial_lengths.py +0 -1
  177. nautobot/dcim/migrations/0009_add_natural_indexing.py +0 -1
  178. nautobot/dcim/migrations/0010_interface_status.py +0 -1
  179. nautobot/dcim/migrations/0011_interface_status_data_migration.py +0 -1
  180. nautobot/dcim/migrations/0012_interface_parent_bridge.py +0 -1
  181. nautobot/dcim/migrations/0013_location_location_type.py +0 -1
  182. nautobot/dcim/migrations/0014_location_status_data_migration.py +0 -1
  183. nautobot/dcim/migrations/0015_device_components__changeloggedmodel.py +0 -1
  184. nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
  185. nautobot/dcim/migrations/0017_locationtype_nestable.py +0 -1
  186. nautobot/dcim/migrations/0018_device_redundancy_group.py +0 -1
  187. nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +0 -1
  188. nautobot/dcim/migrations/0020_move_site_fields_to_location_model.py +0 -1
  189. nautobot/dcim/migrations/0021_mptt_to_tree_queries.py +0 -1
  190. nautobot/dcim/migrations/0022_interface_mac_address_data_migration.py +0 -1
  191. nautobot/dcim/migrations/0023_alter_interface_mac_address.py +0 -1
  192. nautobot/dcim/migrations/0024_alter_device_and_rack_role_add_new_role.py +2 -2
  193. nautobot/dcim/migrations/0025_device_and_rack_roles_data_migrations.py +19 -14
  194. nautobot/dcim/migrations/0026_rename_device_and_rack_role.py +0 -1
  195. nautobot/dcim/migrations/0027_remove_device_role_and_rack_role.py +1 -2
  196. nautobot/dcim/migrations/0028_rename_foreignkey_fields.py +1 -2
  197. nautobot/dcim/migrations/0029_add_tree_managers_and_foreign_keys_pre_data_migration.py +0 -1
  198. nautobot/dcim/migrations/0030_migrate_region_and_site_data_to_locations.py +2 -2
  199. nautobot/dcim/migrations/0031_rename_path_end_point_related_name.py +0 -1
  200. nautobot/dcim/migrations/0032_remove_site_foreign_key_from_dcim_models.py +0 -1
  201. nautobot/dcim/migrations/0033_created_datetime.py +0 -1
  202. nautobot/dcim/migrations/0034_fixup_fks_and_related_names.py +0 -1
  203. nautobot/dcim/migrations/0035_related_name_changes.py +1 -2
  204. nautobot/dcim/migrations/0036_remove_region_and_site.py +1 -2
  205. nautobot/dcim/migrations/0037_interface_ip_addresses_m2m.py +0 -1
  206. nautobot/dcim/migrations/0038_alter_location_managers.py +0 -1
  207. nautobot/dcim/migrations/0039_remove_slug.py +24 -0
  208. nautobot/dcim/migrations/0040_tagsfield.py +109 -0
  209. nautobot/dcim/migrations/0041_ipam__namespaces.py +25 -0
  210. nautobot/dcim/migrations/0042_fixup_null_statuses.py +51 -0
  211. nautobot/dcim/migrations/0043_status_nonnullable.py +72 -0
  212. nautobot/dcim/models/cables.py +4 -35
  213. nautobot/dcim/models/device_component_templates.py +7 -2
  214. nautobot/dcim/models/device_components.py +26 -203
  215. nautobot/dcim/models/devices.py +30 -152
  216. nautobot/dcim/models/locations.py +3 -64
  217. nautobot/dcim/models/power.py +3 -51
  218. nautobot/dcim/models/racks.py +7 -86
  219. nautobot/dcim/navigation.py +141 -467
  220. nautobot/dcim/signals.py +0 -2
  221. nautobot/dcim/tables/devices.py +8 -5
  222. nautobot/dcim/tables/devicetypes.py +1 -1
  223. nautobot/dcim/tables/locations.py +2 -2
  224. nautobot/dcim/tables/power.py +2 -2
  225. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -0
  226. nautobot/dcim/templates/dcim/device.html +15 -4
  227. nautobot/dcim/templates/dcim/device_edit.html +6 -0
  228. nautobot/dcim/templates/dcim/deviceredundancygroup_create.html +0 -1
  229. nautobot/dcim/templates/dcim/devicetype.html +2 -2
  230. nautobot/dcim/templates/dcim/interface.html +4 -0
  231. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -0
  232. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  233. nautobot/dcim/templates/dcim/location.html +16 -1
  234. nautobot/dcim/templates/dcim/locationtype.html +15 -0
  235. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -0
  236. nautobot/dcim/templates/dcim/rackgroup.html +0 -12
  237. nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
  238. nautobot/dcim/tests/test_api.py +202 -130
  239. nautobot/dcim/tests/test_cablepaths.py +47 -42
  240. nautobot/dcim/tests/test_filters.py +156 -134
  241. nautobot/dcim/tests/test_forms.py +12 -213
  242. nautobot/dcim/tests/test_graphql.py +8 -3
  243. nautobot/dcim/tests/test_migrations.py +6 -11
  244. nautobot/dcim/tests/test_models.py +208 -158
  245. nautobot/dcim/tests/test_natural_ordering.py +12 -14
  246. nautobot/dcim/tests/test_signals.py +7 -4
  247. nautobot/dcim/tests/test_views.py +270 -264
  248. nautobot/dcim/urls.py +21 -26
  249. nautobot/dcim/views.py +14 -156
  250. nautobot/docs/additional-features/caching.md +6 -87
  251. nautobot/docs/additional-features/job-scheduling-and-approvals.md +3 -0
  252. nautobot/docs/additional-features/jobs.md +179 -197
  253. nautobot/docs/administration/nautobot-server.md +9 -24
  254. nautobot/docs/administration/nautobot-shell.md +6 -6
  255. nautobot/docs/administration/replicating-nautobot.md +0 -10
  256. nautobot/docs/configuration/index.md +9 -9
  257. nautobot/docs/configuration/optional-settings.md +32 -61
  258. nautobot/docs/configuration/required-settings.md +11 -52
  259. nautobot/docs/development/application-registry.md +2 -13
  260. nautobot/docs/development/best-practices.md +2 -1
  261. nautobot/docs/development/docker-compose-advanced-use-cases.md +1 -1
  262. nautobot/docs/development/extending-models.md +15 -17
  263. nautobot/docs/development/generic-views.md +0 -2
  264. nautobot/docs/development/getting-started.md +56 -6
  265. nautobot/docs/development/navigation-menu.md +22 -93
  266. nautobot/docs/development/react-ui.md +105 -0
  267. nautobot/docs/development/release-checklist.md +3 -3
  268. nautobot/docs/development/role-internals.md +1 -3
  269. nautobot/docs/development/style-guide.md +6 -4
  270. nautobot/docs/development/templates.md +2 -1
  271. nautobot/docs/docker/index.md +16 -14
  272. nautobot/docs/index.md +7 -3
  273. nautobot/docs/installation/index.md +4 -1
  274. nautobot/docs/installation/migrating-from-netbox.md +12 -43
  275. nautobot/docs/installation/migrating-from-postgresql.md +1 -1
  276. nautobot/docs/installation/nautobot.md +1 -1
  277. nautobot/docs/installation/tables/v2-api-behavior-changes.yaml +70 -0
  278. nautobot/docs/installation/tables/v2-api-removed-fields.yaml +142 -0
  279. nautobot/docs/installation/tables/v2-api-renamed-fields.yaml +124 -0
  280. nautobot/docs/installation/tables/v2-code-location-changes.yaml +241 -0
  281. nautobot/docs/installation/tables/v2-code-removals.yaml +67 -0
  282. nautobot/docs/installation/tables/v2-database-behavior-changes.yaml +37 -0
  283. nautobot/docs/installation/tables/v2-database-removed-fields.yaml +166 -0
  284. nautobot/docs/installation/tables/v2-database-renamed-fields.yaml +340 -0
  285. nautobot/docs/installation/tables/v2-filters-corrected-fields.yaml +28 -0
  286. nautobot/docs/installation/tables/v2-filters-enhanced-fields.yaml +241 -0
  287. nautobot/docs/installation/tables/v2-filters-removed-fields.yaml +553 -0
  288. nautobot/docs/installation/tables/v2-filters-renamed-fields.yaml +223 -0
  289. nautobot/docs/installation/tables/v2-logging-renamed-loggers.yaml +23 -0
  290. nautobot/docs/installation/upgrading-from-nautobot-v1.md +190 -636
  291. nautobot/docs/installation/upgrading.md +5 -2
  292. nautobot/docs/models/dcim/device.md +3 -0
  293. nautobot/docs/models/dcim/deviceredundancygroup.md +3 -3
  294. nautobot/docs/models/extras/computedfield.md +4 -4
  295. nautobot/docs/models/extras/dynamicgroup.md +9 -9
  296. nautobot/docs/models/extras/gitrepository.md +3 -0
  297. nautobot/docs/models/extras/job.md +1 -0
  298. nautobot/docs/models/extras/jobbutton.md +18 -13
  299. nautobot/docs/models/extras/jobhook.md +7 -4
  300. nautobot/docs/models/extras/jobresult.md +6 -2
  301. nautobot/docs/models/extras/relationship.md +2 -2
  302. nautobot/docs/models/extras/status.md +6 -19
  303. nautobot/docs/models/ipam/ipaddress.md +3 -0
  304. nautobot/docs/models/ipam/vrf.md +0 -3
  305. nautobot/docs/models/virtualization/virtualmachine.md +3 -0
  306. nautobot/docs/plugins/development.md +92 -24
  307. nautobot/docs/release-notes/version-1.5.md +96 -0
  308. nautobot/docs/release-notes/version-2.0.md +216 -0
  309. nautobot/docs/requirements.txt +5 -4
  310. nautobot/docs/rest-api/overview.md +384 -215
  311. nautobot/docs/rest-api/ui-related-endpoints.md +9 -0
  312. nautobot/extras/admin.py +3 -5
  313. nautobot/extras/api/customfields.py +15 -39
  314. nautobot/extras/api/fields.py +0 -11
  315. nautobot/extras/api/mixins.py +45 -0
  316. nautobot/extras/api/relationships.py +63 -159
  317. nautobot/extras/api/serializers.py +165 -706
  318. nautobot/extras/api/urls.py +1 -1
  319. nautobot/extras/api/views.py +295 -282
  320. nautobot/extras/apps.py +4 -7
  321. nautobot/extras/choices.py +11 -22
  322. nautobot/extras/constants.py +9 -3
  323. nautobot/extras/datasources/__init__.py +2 -0
  324. nautobot/extras/datasources/git.py +135 -186
  325. nautobot/extras/datasources/registry.py +25 -35
  326. nautobot/extras/factory.py +1 -3
  327. nautobot/extras/filters/__init__.py +49 -47
  328. nautobot/extras/filters/mixins.py +10 -8
  329. nautobot/extras/forms/forms.py +72 -148
  330. nautobot/extras/forms/mixins.py +34 -57
  331. nautobot/extras/health_checks.py +0 -33
  332. nautobot/extras/jobs.py +387 -566
  333. nautobot/extras/management/__init__.py +55 -48
  334. nautobot/extras/management/commands/renaturalize.py +0 -1
  335. nautobot/extras/management/commands/runjob.py +24 -62
  336. nautobot/extras/management/commands/webhook_receiver.py +0 -1
  337. nautobot/extras/managers.py +30 -7
  338. nautobot/extras/migrations/0001_initial_part_1.py +0 -1
  339. nautobot/extras/migrations/0002_initial_part_2.py +0 -1
  340. nautobot/extras/migrations/0003_initial_part_3.py +0 -1
  341. nautobot/extras/migrations/0004_populate_default_status_records.py +0 -1
  342. nautobot/extras/migrations/0005_configcontext_device_types.py +0 -1
  343. nautobot/extras/migrations/0006_graphqlquery.py +0 -1
  344. nautobot/extras/migrations/0007_configcontextschema.py +0 -1
  345. nautobot/extras/migrations/0008_jobresult__custom_field_data.py +0 -1
  346. nautobot/extras/migrations/0009_computedfield.py +0 -1
  347. nautobot/extras/migrations/0010_change_cf_validation_max_min_field_to_bigint.py +0 -1
  348. nautobot/extras/migrations/0011_fileattachment_fileproxy.py +0 -1
  349. nautobot/extras/migrations/0012_healthchecktestmodel.py +0 -1
  350. nautobot/extras/migrations/0013_default_fallback_value_computedfield.py +0 -1
  351. nautobot/extras/migrations/0014_auto_slug.py +0 -1
  352. nautobot/extras/migrations/0015_scheduled_job.py +0 -1
  353. nautobot/extras/migrations/0016_secret.py +0 -1
  354. nautobot/extras/migrations/0017_joblogentry.py +0 -1
  355. nautobot/extras/migrations/0018_joblog_data_migration.py +0 -2
  356. nautobot/extras/migrations/0019_joblogentry__meta_options__related_name.py +0 -1
  357. nautobot/extras/migrations/0020_customfield_changelog.py +0 -1
  358. nautobot/extras/migrations/0021_customfield_changelog_data.py +0 -1
  359. nautobot/extras/migrations/0022_objectchange_object_datav2.py +0 -1
  360. nautobot/extras/migrations/0023_job_model.py +0 -1
  361. nautobot/extras/migrations/0024_job_data_migration.py +0 -1
  362. nautobot/extras/migrations/0025_add_advanced_ui_boolean_to_customfield_conputedfield_and_relationship.py +0 -1
  363. nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +0 -1
  364. nautobot/extras/migrations/0027_job_gitrepository_data_migration.py +0 -1
  365. nautobot/extras/migrations/0028_job_reduce_source.py +0 -1
  366. nautobot/extras/migrations/0029_dynamicgroup.py +0 -1
  367. nautobot/extras/migrations/0030_webhook_alter_unique_together.py +0 -1
  368. nautobot/extras/migrations/0031_tag_content_types.py +0 -1
  369. nautobot/extras/migrations/0032_tag_content_types_data_migration.py +0 -1
  370. nautobot/extras/migrations/0033_add__optimized_indexing.py +0 -1
  371. nautobot/extras/migrations/0034_alter_fileattachment_mimetype.py +0 -1
  372. nautobot/extras/migrations/0035_scheduledjob_crontab.py +0 -1
  373. nautobot/extras/migrations/0036_job_add_has_sensitive_variables.py +0 -1
  374. nautobot/extras/migrations/0037_configcontextschema__remove_name_unique__create_constraint_unique_name_owner.py +0 -1
  375. nautobot/extras/migrations/0038_configcontext_locations.py +0 -1
  376. nautobot/extras/migrations/0039_objectchange__add_change_context.py +0 -1
  377. nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +0 -1
  378. nautobot/extras/migrations/0041_jobresult_job_kwargs.py +0 -1
  379. nautobot/extras/migrations/0042_job__add_is_job_hook_receiver.py +0 -1
  380. nautobot/extras/migrations/0043_note.py +0 -1
  381. nautobot/extras/migrations/0044_add_job_hook.py +0 -1
  382. nautobot/extras/migrations/0045_add_custom_field_slug.py +0 -1
  383. nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +0 -1
  384. nautobot/extras/migrations/0047_enforce_custom_field_slug.py +0 -1
  385. nautobot/extras/migrations/0048_alter_objectchange_change_context_detail.py +0 -1
  386. nautobot/extras/migrations/0049_alter_tag_slug.py +0 -1
  387. nautobot/extras/migrations/0050_customfield_grouping.py +0 -1
  388. nautobot/extras/migrations/0051_add_job_task_queues.py +0 -1
  389. nautobot/extras/migrations/0052_configcontext_device_redundancy_groups.py +0 -1
  390. nautobot/extras/migrations/0053_relationship_required_on.py +0 -1
  391. nautobot/extras/migrations/0054_scheduledjob_kwargs_request_user_change.py +0 -1
  392. nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +0 -1
  393. nautobot/extras/migrations/0056_objectchange_add_reverse_time_idx.py +0 -1
  394. nautobot/extras/migrations/0057_jobbutton.py +0 -1
  395. nautobot/extras/migrations/0058_jobresult_add_time_status_idxs.py +38 -0
  396. nautobot/extras/migrations/{0058_joblogentry_scheduledjob_webhook_data_migration.py → 0059_joblogentry_scheduledjob_webhook_data_migration.py} +1 -2
  397. nautobot/extras/migrations/{0059_alter_joblogentry_scheduledjob_webhook_fields.py → 0060_alter_joblogentry_scheduledjob_webhook_fields.py} +1 -2
  398. nautobot/extras/migrations/{0060_role_and_alter_status.py → 0061_role_and_alter_status.py} +1 -8
  399. nautobot/extras/migrations/{0061_collect_roles_from_related_apps_roles.py → 0062_collect_roles_from_related_apps_roles.py} +33 -33
  400. nautobot/extras/migrations/{0062_alter_role_options.py → 0063_alter_role_options.py} +1 -2
  401. nautobot/extras/migrations/{0063_alter_configcontext_and_add_new_role.py → 0064_alter_configcontext_and_add_new_role.py} +1 -2
  402. nautobot/extras/migrations/0065_configcontext_data_migrations.py +44 -0
  403. nautobot/extras/migrations/{0065_rename_configcontext_role.py → 0066_rename_configcontext_role.py} +1 -2
  404. nautobot/extras/migrations/{0066_jobresult__add_celery_fields.py → 0067_jobresult__add_celery_fields.py} +36 -3
  405. nautobot/extras/migrations/{0067_created_datetime.py → 0068_created_datetime.py} +1 -2
  406. nautobot/extras/migrations/{0068_remove_site_and_region_attributes_from_config_context.py → 0069_remove_site_and_region_attributes_from_config_context.py} +1 -2
  407. nautobot/extras/migrations/{0069_replace_related_names.py → 0070_replace_related_names.py} +1 -1
  408. nautobot/extras/migrations/{0070_rename_model_fields.py → 0071_rename_model_fields.py} +1 -2
  409. nautobot/extras/migrations/0072_job__unique_name_data_migration.py +86 -0
  410. nautobot/extras/migrations/{0072_job__unique_name.py → 0073_job__unique_name.py} +13 -10
  411. nautobot/extras/migrations/{0073_remove_gitrepository_fields.py → 0074_remove_gitrepository_fields.py} +1 -2
  412. nautobot/extras/migrations/{0074_rename_slug_to_key_for_custom_field.py → 0075_rename_slug_to_key_for_custom_field.py} +1 -1
  413. nautobot/extras/migrations/{0075_migrate_custom_field_data.py → 0076_migrate_custom_field_data.py} +1 -1
  414. nautobot/extras/migrations/{0076_remove_name_field_and_make_label_field_non_nullable.py → 0077_remove_name_field_and_make_label_field_non_nullable.py} +1 -1
  415. nautobot/extras/migrations/0078_remove_slug.py +45 -0
  416. nautobot/extras/migrations/0079_tagsfield.py +28 -0
  417. nautobot/extras/migrations/0080_rename_relationship_slug_to_key.py +17 -0
  418. nautobot/extras/migrations/0081_rename_relationship_name_to_label.py +29 -0
  419. nautobot/extras/migrations/0082_ensure_relationship_keys_are_unique.py +43 -0
  420. nautobot/extras/migrations/0083_rename_computed_field_slug_to_key.py +21 -0
  421. nautobot/extras/migrations/0084_taggeditem_cleanup.py +43 -0
  422. nautobot/extras/migrations/0085_taggeditem_uniqueness.py +22 -0
  423. nautobot/extras/migrations/0086_job__celery_task_fields__dryrun_support.py +81 -0
  424. nautobot/extras/migrations/0087_job__commit_default_data_migration.py +26 -0
  425. nautobot/extras/migrations/0088_joblogentry__log_level_default.py +17 -0
  426. nautobot/extras/migrations/0089_joblogentry__log_level_data_migration.py +34 -0
  427. nautobot/extras/migrations/0090_scheduledjob__data_migration.py +57 -0
  428. nautobot/extras/models/__init__.py +2 -3
  429. nautobot/extras/models/change_logging.py +0 -36
  430. nautobot/extras/models/customfields.py +39 -33
  431. nautobot/extras/models/datasources.py +48 -50
  432. nautobot/extras/models/groups.py +5 -12
  433. nautobot/extras/models/jobs.py +190 -323
  434. nautobot/extras/models/mixins.py +0 -71
  435. nautobot/extras/models/models.py +1 -22
  436. nautobot/extras/models/relationships.py +20 -21
  437. nautobot/extras/models/roles.py +0 -23
  438. nautobot/extras/models/secrets.py +2 -31
  439. nautobot/extras/models/statuses.py +6 -5
  440. nautobot/extras/models/tags.py +2 -17
  441. nautobot/extras/navigation.py +89 -307
  442. nautobot/extras/plugins/__init__.py +3 -121
  443. nautobot/extras/plugins/utils.py +0 -3
  444. nautobot/extras/plugins/validators.py +5 -4
  445. nautobot/extras/plugins/views.py +16 -4
  446. nautobot/extras/querysets.py +1 -7
  447. nautobot/extras/registry.py +3 -0
  448. nautobot/extras/signals.py +26 -60
  449. nautobot/extras/tables.py +42 -49
  450. nautobot/extras/tasks.py +0 -12
  451. nautobot/extras/templates/extras/configcontext.html +1 -1
  452. nautobot/extras/templates/extras/configcontextschema.html +16 -1
  453. nautobot/extras/templates/extras/customfield.html +0 -13
  454. nautobot/extras/templates/extras/dynamicgroup_edit.html +0 -1
  455. nautobot/extras/templates/extras/gitrepository.html +3 -3
  456. nautobot/extras/templates/extras/inc/jobresult.html +10 -0
  457. nautobot/extras/templates/extras/inc/panel_jobhistory.html +1 -1
  458. nautobot/extras/templates/extras/job.html +35 -25
  459. nautobot/extras/templates/extras/job_approval_request.html +15 -30
  460. nautobot/extras/templates/extras/job_detail.html +13 -31
  461. nautobot/extras/templates/extras/job_edit.html +14 -17
  462. nautobot/extras/templates/extras/jobresult.html +24 -6
  463. nautobot/extras/templates/extras/objectchange_list.html +1 -1
  464. nautobot/extras/templates/extras/scheduledjob.html +2 -2
  465. nautobot/extras/templates/extras/secret.html +28 -0
  466. nautobot/extras/templates/extras/secret_edit.html +0 -1
  467. nautobot/extras/templates/extras/secretsgroup_edit.html +0 -1
  468. nautobot/extras/templatetags/custom_links.py +0 -2
  469. nautobot/extras/templatetags/job_buttons.py +1 -0
  470. nautobot/extras/templatetags/plugins.py +0 -1
  471. nautobot/extras/{tests/example_jobs → test_jobs}/api_test_job.py +13 -6
  472. nautobot/extras/test_jobs/atomic_transaction.py +53 -0
  473. nautobot/extras/test_jobs/dry_run.py +29 -0
  474. nautobot/extras/{tests/example_jobs/test_duplicate_name.py → test_jobs/duplicate_name.py} +4 -0
  475. nautobot/extras/test_jobs/duplicate_name2.py +9 -0
  476. nautobot/extras/test_jobs/fail.py +23 -0
  477. nautobot/extras/{tests/example_jobs/test_field_default.py → test_jobs/field_default.py} +4 -0
  478. nautobot/extras/{tests/example_jobs/test_field_order.py → test_jobs/field_order.py} +4 -0
  479. nautobot/extras/{tests/example_jobs/test_file_upload_fail.py → test_jobs/file_upload_fail.py} +11 -6
  480. nautobot/extras/test_jobs/file_upload_pass.py +25 -0
  481. nautobot/extras/test_jobs/has_sensitive_variables.py +25 -0
  482. nautobot/extras/test_jobs/ipaddress_vars.py +66 -0
  483. nautobot/extras/test_jobs/job_button_receiver.py +28 -0
  484. nautobot/extras/test_jobs/job_hook_receiver.py +29 -0
  485. nautobot/extras/test_jobs/job_variables.py +88 -0
  486. nautobot/extras/test_jobs/location_with_custom_field.py +45 -0
  487. nautobot/extras/test_jobs/log_redaction.py +20 -0
  488. nautobot/extras/test_jobs/log_skip_db_logging.py +17 -0
  489. nautobot/extras/test_jobs/modify_db.py +25 -0
  490. nautobot/extras/{tests/example_jobs/test_no_field_order.py → test_jobs/no_field_order.py} +4 -0
  491. nautobot/extras/test_jobs/object_var_optional.py +21 -0
  492. nautobot/extras/test_jobs/object_var_required.py +21 -0
  493. nautobot/extras/test_jobs/object_vars.py +26 -0
  494. nautobot/extras/test_jobs/pass.py +25 -0
  495. nautobot/extras/test_jobs/profiling.py +32 -0
  496. nautobot/extras/test_jobs/read_only_job.py +15 -0
  497. nautobot/extras/{tests/example_jobs/test_required_args.py → test_jobs/required_args.py} +4 -0
  498. nautobot/extras/{tests/example_jobs/test_soft_time_limit_greater_than_time_limit.py → test_jobs/soft_time_limit_greater_than_time_limit.py} +5 -1
  499. nautobot/extras/{tests/example_jobs/test_task_queues.py → test_jobs/task_queues.py} +5 -1
  500. nautobot/extras/tests/integration/__init__.py +3 -3
  501. nautobot/extras/tests/integration/test_computedfields.py +1 -1
  502. nautobot/extras/tests/integration/test_configcontextschema.py +7 -5
  503. nautobot/extras/tests/integration/test_customfields.py +4 -2
  504. nautobot/extras/tests/integration/test_dynamicgroups.py +2 -2
  505. nautobot/extras/tests/integration/test_jobs.py +25 -27
  506. nautobot/extras/tests/integration/test_notes.py +8 -4
  507. nautobot/extras/tests/integration/test_plugins.py +4 -4
  508. nautobot/extras/tests/integration/test_relationships.py +2 -2
  509. nautobot/extras/tests/test_api.py +371 -381
  510. nautobot/extras/tests/test_changelog.py +17 -16
  511. nautobot/extras/tests/test_context_managers.py +5 -6
  512. nautobot/extras/tests/test_customfields.py +112 -73
  513. nautobot/extras/tests/test_datasources.py +191 -117
  514. nautobot/extras/tests/test_dynamicgroups.py +45 -68
  515. nautobot/extras/tests/test_filters.py +170 -130
  516. nautobot/extras/tests/test_forms.py +107 -109
  517. nautobot/extras/tests/{test_scripts.py → test_job_variables.py} +43 -49
  518. nautobot/extras/tests/test_jobs.py +271 -273
  519. nautobot/extras/tests/test_management.py +3 -6
  520. nautobot/extras/tests/test_migrations.py +5 -3
  521. nautobot/extras/tests/test_models.py +121 -173
  522. nautobot/extras/tests/test_notes.py +0 -1
  523. nautobot/extras/tests/test_plugins.py +55 -89
  524. nautobot/extras/tests/test_relationships.py +174 -130
  525. nautobot/extras/tests/test_tags.py +6 -12
  526. nautobot/extras/tests/test_utils.py +31 -1
  527. nautobot/extras/tests/test_views.py +223 -184
  528. nautobot/extras/tests/test_webhooks.py +16 -15
  529. nautobot/extras/urls.py +69 -69
  530. nautobot/extras/utils.py +137 -163
  531. nautobot/extras/views.py +81 -153
  532. nautobot/ipam/api/fields.py +17 -0
  533. nautobot/ipam/api/serializers.py +77 -164
  534. nautobot/ipam/api/urls.py +4 -1
  535. nautobot/ipam/api/views.py +28 -19
  536. nautobot/ipam/apps.py +1 -0
  537. nautobot/ipam/choices.py +5 -12
  538. nautobot/ipam/constants.py +1 -0
  539. nautobot/ipam/factory.py +41 -30
  540. nautobot/ipam/filters.py +58 -25
  541. nautobot/ipam/forms.py +82 -211
  542. nautobot/ipam/graphql/types.py +0 -9
  543. nautobot/ipam/lookups.py +13 -8
  544. nautobot/ipam/management/commands/__init__.py +0 -0
  545. nautobot/ipam/management/commands/fix_prefix_broadcast.py +17 -0
  546. nautobot/ipam/migrations/0001_initial_part_1.py +0 -1
  547. nautobot/ipam/migrations/0002_initial_part_2.py +0 -1
  548. nautobot/ipam/migrations/0003_remove_max_length.py +0 -1
  549. nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
  550. nautobot/ipam/migrations/0005_auto_slug.py +0 -1
  551. nautobot/ipam/migrations/0006_ipaddress_nat_outside_list.py +0 -1
  552. nautobot/ipam/migrations/0007_add_natural_indexing.py +0 -1
  553. nautobot/ipam/migrations/0008_prefix_vlan_vlangroup_location.py +0 -1
  554. nautobot/ipam/migrations/0009_alter_vlan_name.py +0 -1
  555. nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -2
  556. nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +32 -39
  557. nautobot/ipam/migrations/0012_rename_ipam_roles.py +0 -1
  558. nautobot/ipam/migrations/0013_delete_role.py +0 -1
  559. nautobot/ipam/migrations/0014_rename_foreign_keys_and_related_names.py +0 -1
  560. nautobot/ipam/migrations/0015_prefix_add_type.py +0 -1
  561. nautobot/ipam/migrations/0016_prefix_type_data_migration.py +0 -3
  562. nautobot/ipam/migrations/0017_prefix_remove_is_pool.py +0 -1
  563. nautobot/ipam/migrations/0018_remove_site_foreign_key_from_ipam_models.py +0 -1
  564. nautobot/ipam/migrations/0019_created_datetime.py +0 -1
  565. nautobot/ipam/migrations/0020_related_name_changes.py +1 -2
  566. nautobot/ipam/migrations/0021_prefix_add_rir_and_date_allocated.py +0 -1
  567. nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +3 -5
  568. nautobot/ipam/migrations/0023_delete_aggregate.py +0 -1
  569. nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +0 -1
  570. nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +0 -1
  571. nautobot/ipam/migrations/0026_ipaddress_remove_assigned_object.py +0 -1
  572. nautobot/ipam/migrations/0027_remove_rir_slug.py +16 -0
  573. nautobot/ipam/migrations/0028_tagsfield.py +44 -0
  574. nautobot/ipam/migrations/0029_ip_address_to_interface_uniqueness_constraints.py +18 -0
  575. nautobot/ipam/migrations/0030_ipam__namespaces.py +231 -0
  576. nautobot/ipam/migrations/0031_ipam__prefix__add_parent.py +58 -0
  577. nautobot/ipam/migrations/0032_ipam__namespaces_finish.py +63 -0
  578. nautobot/ipam/migrations/0033_fixup_null_statuses.py +26 -0
  579. nautobot/ipam/migrations/0034_status_nonnullable.py +36 -0
  580. nautobot/ipam/models.py +579 -368
  581. nautobot/ipam/navigation.py +36 -159
  582. nautobot/ipam/querysets.py +117 -90
  583. nautobot/ipam/signals.py +89 -0
  584. nautobot/ipam/tables.py +86 -28
  585. nautobot/ipam/templates/ipam/ipaddress.html +14 -30
  586. nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -0
  587. nautobot/ipam/templates/ipam/namespace_ipaddresses.html +11 -0
  588. nautobot/ipam/templates/ipam/namespace_prefixes.html +11 -0
  589. nautobot/ipam/templates/ipam/namespace_retrieve.html +42 -0
  590. nautobot/ipam/templates/ipam/namespace_vrfs.html +11 -0
  591. nautobot/ipam/templates/ipam/prefix.html +27 -33
  592. nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
  593. nautobot/ipam/templates/ipam/vlangroup.html +0 -13
  594. nautobot/ipam/templates/ipam/vrf.html +6 -4
  595. nautobot/ipam/templates/ipam/vrf_edit.html +20 -2
  596. nautobot/ipam/tests/integration/test_prefixes.py +4 -27
  597. nautobot/ipam/tests/test_api.py +60 -61
  598. nautobot/ipam/tests/test_filters.py +187 -126
  599. nautobot/ipam/tests/test_forms.py +12 -6
  600. nautobot/ipam/tests/test_graphql.py +8 -6
  601. nautobot/ipam/tests/test_migrations.py +8 -13
  602. nautobot/ipam/tests/test_models.py +426 -274
  603. nautobot/ipam/tests/test_ordering.py +6 -3
  604. nautobot/ipam/tests/test_querysets.py +340 -96
  605. nautobot/ipam/tests/test_views.py +100 -55
  606. nautobot/ipam/urls.py +28 -5
  607. nautobot/ipam/{utils.py → utils/__init__.py} +2 -2
  608. nautobot/ipam/utils/migrations.py +713 -0
  609. nautobot/ipam/views.py +237 -122
  610. nautobot/project-static/docs/404.html +1399 -166
  611. nautobot/project-static/docs/additional-features/caching.html +1416 -320
  612. nautobot/project-static/docs/additional-features/change-logging.html +1389 -190
  613. nautobot/project-static/docs/additional-features/config-contexts.html +1389 -190
  614. nautobot/project-static/docs/additional-features/graphql.html +1389 -190
  615. nautobot/project-static/docs/additional-features/healthcheck.html +1389 -190
  616. nautobot/project-static/docs/additional-features/job-scheduling-and-approvals.html +1393 -190
  617. nautobot/project-static/docs/additional-features/jobs.html +1677 -460
  618. nautobot/project-static/docs/additional-features/napalm.html +1389 -190
  619. nautobot/project-static/docs/additional-features/prometheus-metrics.html +1389 -190
  620. nautobot/project-static/docs/additional-features/template-filters.html +1389 -190
  621. nautobot/project-static/docs/administration/celery-queues.html +1389 -190
  622. nautobot/project-static/docs/administration/nautobot-server.html +1553 -375
  623. nautobot/project-static/docs/administration/nautobot-shell.html +1395 -196
  624. nautobot/project-static/docs/administration/permissions.html +1389 -190
  625. nautobot/project-static/docs/administration/replicating-nautobot.html +1387 -207
  626. nautobot/project-static/docs/apps/index.html +1389 -190
  627. nautobot/project-static/docs/apps/nautobot-apps.html +1387 -175
  628. nautobot/project-static/docs/assets/javascripts/bundle.51198bba.min.js +29 -0
  629. nautobot/project-static/docs/assets/javascripts/bundle.51198bba.min.js.map +8 -0
  630. nautobot/project-static/docs/assets/javascripts/workers/{search.16e2a7d4.min.js → search.208ed371.min.js} +9 -15
  631. nautobot/project-static/docs/assets/javascripts/workers/{search.16e2a7d4.min.js.map → search.208ed371.min.js.map} +4 -4
  632. nautobot/project-static/docs/assets/stylesheets/main.ded33207.min.css +1 -0
  633. nautobot/project-static/docs/assets/stylesheets/main.ded33207.min.css.map +1 -0
  634. nautobot/project-static/docs/assets/stylesheets/palette.a0c5b2b5.min.css +1 -0
  635. nautobot/project-static/docs/assets/stylesheets/palette.a0c5b2b5.min.css.map +1 -0
  636. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +1775 -590
  637. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +1389 -190
  638. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +3588 -1922
  639. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +1461 -262
  640. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1401 -170
  641. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1396 -191
  642. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +2095 -894
  643. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +2357 -1194
  644. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2258 -940
  645. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1389 -190
  646. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1400 -201
  647. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +11068 -7861
  648. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +2867 -2224
  649. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1389 -190
  650. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +2641 -1573
  651. nautobot/project-static/docs/configuration/authentication/ldap.html +1389 -190
  652. nautobot/project-static/docs/configuration/authentication/remote.html +1389 -190
  653. nautobot/project-static/docs/configuration/authentication/sso.html +1389 -190
  654. nautobot/project-static/docs/configuration/index.html +1398 -199
  655. nautobot/project-static/docs/configuration/optional-settings.html +1418 -274
  656. nautobot/project-static/docs/configuration/required-settings.html +1419 -287
  657. nautobot/project-static/docs/core-functionality/circuits.html +1446 -247
  658. nautobot/project-static/docs/core-functionality/device-types.html +1448 -249
  659. nautobot/project-static/docs/core-functionality/devices.html +1452 -249
  660. nautobot/project-static/docs/core-functionality/ipam.html +1452 -253
  661. nautobot/project-static/docs/core-functionality/power.html +1448 -249
  662. nautobot/project-static/docs/core-functionality/secrets.html +1448 -249
  663. nautobot/project-static/docs/core-functionality/services.html +1448 -249
  664. nautobot/project-static/docs/core-functionality/sites-and-racks.html +1448 -249
  665. nautobot/project-static/docs/core-functionality/tenancy.html +1448 -249
  666. nautobot/project-static/docs/core-functionality/virtualization.html +1452 -249
  667. nautobot/project-static/docs/core-functionality/vlans.html +1448 -249
  668. nautobot/project-static/docs/development/application-registry.html +1393 -214
  669. nautobot/project-static/docs/development/best-practices.html +1392 -192
  670. nautobot/project-static/docs/development/docker-compose-advanced-use-cases.html +1390 -191
  671. nautobot/project-static/docs/development/extending-models.html +1443 -257
  672. nautobot/project-static/docs/development/generic-views.html +1403 -174
  673. nautobot/project-static/docs/development/getting-started.html +1568 -262
  674. nautobot/project-static/docs/development/homepage.html +1389 -190
  675. nautobot/project-static/docs/development/index.html +1389 -190
  676. nautobot/project-static/docs/development/model-features.html +1389 -190
  677. nautobot/project-static/docs/development/natural-keys.html +1389 -190
  678. nautobot/project-static/docs/development/navigation-menu.html +1451 -330
  679. nautobot/project-static/docs/development/react-ui.html +4199 -0
  680. nautobot/project-static/docs/development/release-checklist.html +1392 -193
  681. nautobot/project-static/docs/development/role-internals.html +1402 -172
  682. nautobot/project-static/docs/development/style-guide.html +1399 -199
  683. nautobot/project-static/docs/development/templates.html +1391 -191
  684. nautobot/project-static/docs/development/testing.html +1389 -190
  685. nautobot/project-static/docs/development/user-preferences.html +1389 -190
  686. nautobot/project-static/docs/docker/index.html +1408 -206
  687. nautobot/project-static/docs/index.html +1397 -180
  688. nautobot/project-static/docs/installation/centos.html +1401 -170
  689. nautobot/project-static/docs/installation/external-authentication.html +1389 -190
  690. nautobot/project-static/docs/installation/http-server.html +1389 -190
  691. nautobot/project-static/docs/installation/index.html +1394 -191
  692. nautobot/project-static/docs/installation/migrating-from-netbox.html +1452 -305
  693. nautobot/project-static/docs/installation/migrating-from-postgresql.html +1390 -191
  694. nautobot/project-static/docs/installation/nautobot.html +1390 -191
  695. nautobot/project-static/docs/installation/region-and-site-data-migration-guide.html +1389 -190
  696. nautobot/project-static/docs/installation/selinux-troubleshooting.html +1401 -170
  697. nautobot/project-static/docs/installation/services.html +1389 -190
  698. nautobot/project-static/docs/installation/tables/v2-api-behavior-changes.yaml +70 -0
  699. nautobot/project-static/docs/installation/tables/v2-api-removed-fields.yaml +142 -0
  700. nautobot/project-static/docs/installation/tables/v2-api-renamed-fields.yaml +124 -0
  701. nautobot/project-static/docs/installation/tables/v2-code-location-changes.yaml +241 -0
  702. nautobot/project-static/docs/installation/tables/v2-code-removals.yaml +67 -0
  703. nautobot/project-static/docs/installation/tables/v2-database-behavior-changes.yaml +37 -0
  704. nautobot/project-static/docs/installation/tables/v2-database-removed-fields.yaml +166 -0
  705. nautobot/project-static/docs/installation/tables/v2-database-renamed-fields.yaml +340 -0
  706. nautobot/project-static/docs/installation/tables/v2-filters-corrected-fields.yaml +28 -0
  707. nautobot/project-static/docs/installation/tables/v2-filters-enhanced-fields.yaml +241 -0
  708. nautobot/project-static/docs/installation/tables/v2-filters-removed-fields.yaml +553 -0
  709. nautobot/project-static/docs/installation/tables/v2-filters-renamed-fields.yaml +223 -0
  710. nautobot/project-static/docs/installation/tables/v2-logging-renamed-loggers.yaml +23 -0
  711. nautobot/project-static/docs/installation/ubuntu.html +1401 -170
  712. nautobot/project-static/docs/installation/upgrading-from-nautobot-v1.html +4254 -1923
  713. nautobot/project-static/docs/installation/upgrading.html +1395 -192
  714. nautobot/project-static/docs/models/circuits/circuit.html +1427 -174
  715. nautobot/project-static/docs/models/circuits/circuittermination.html +1427 -174
  716. nautobot/project-static/docs/models/circuits/circuittype.html +1427 -174
  717. nautobot/project-static/docs/models/circuits/provider.html +1427 -174
  718. nautobot/project-static/docs/models/circuits/providernetwork.html +1427 -174
  719. nautobot/project-static/docs/models/dcim/cable.html +1458 -174
  720. nautobot/project-static/docs/models/dcim/consoleport.html +1427 -174
  721. nautobot/project-static/docs/models/dcim/consoleporttemplate.html +1427 -174
  722. nautobot/project-static/docs/models/dcim/consoleserverport.html +1427 -174
  723. nautobot/project-static/docs/models/dcim/consoleserverporttemplate.html +1427 -174
  724. nautobot/project-static/docs/models/dcim/device.html +1431 -174
  725. nautobot/project-static/docs/models/dcim/devicebay.html +1427 -174
  726. nautobot/project-static/docs/models/dcim/devicebaytemplate.html +1427 -174
  727. nautobot/project-static/docs/models/dcim/deviceredundancygroup.html +1522 -177
  728. nautobot/project-static/docs/models/dcim/devicetype.html +1427 -174
  729. nautobot/project-static/docs/models/dcim/frontport.html +1427 -174
  730. nautobot/project-static/docs/models/dcim/frontporttemplate.html +1427 -174
  731. nautobot/project-static/docs/models/dcim/interface.html +1427 -174
  732. nautobot/project-static/docs/models/dcim/interfacetemplate.html +1427 -174
  733. nautobot/project-static/docs/models/dcim/inventoryitem.html +1427 -174
  734. nautobot/project-static/docs/models/dcim/location.html +1427 -174
  735. nautobot/project-static/docs/models/dcim/locationtype.html +1427 -174
  736. nautobot/project-static/docs/models/dcim/manufacturer.html +1427 -174
  737. nautobot/project-static/docs/models/dcim/platform.html +1427 -174
  738. nautobot/project-static/docs/models/dcim/powerfeed.html +1425 -172
  739. nautobot/project-static/docs/models/dcim/poweroutlet.html +1427 -174
  740. nautobot/project-static/docs/models/dcim/poweroutlettemplate.html +1427 -174
  741. nautobot/project-static/docs/models/dcim/powerpanel.html +1425 -172
  742. nautobot/project-static/docs/models/dcim/powerport.html +1427 -174
  743. nautobot/project-static/docs/models/dcim/powerporttemplate.html +1427 -174
  744. nautobot/project-static/docs/models/dcim/rack.html +1427 -174
  745. nautobot/project-static/docs/models/dcim/rackgroup.html +1427 -174
  746. nautobot/project-static/docs/models/dcim/rackreservation.html +1427 -174
  747. nautobot/project-static/docs/models/dcim/rearport.html +1427 -174
  748. nautobot/project-static/docs/models/dcim/rearporttemplate.html +1427 -174
  749. nautobot/project-static/docs/models/dcim/region.html +1401 -170
  750. nautobot/project-static/docs/models/dcim/site.html +1401 -170
  751. nautobot/project-static/docs/models/dcim/virtualchassis.html +1425 -172
  752. nautobot/project-static/docs/models/extras/computedfield.html +1393 -194
  753. nautobot/project-static/docs/models/extras/configcontext.html +1465 -174
  754. nautobot/project-static/docs/models/extras/configcontextschema.html +1421 -168
  755. nautobot/project-static/docs/models/extras/customfield.html +1389 -190
  756. nautobot/project-static/docs/models/extras/customlink.html +1389 -190
  757. nautobot/project-static/docs/models/extras/dynamicgroup.html +1398 -199
  758. nautobot/project-static/docs/models/extras/exporttemplate.html +1389 -190
  759. nautobot/project-static/docs/models/extras/gitrepository.html +1393 -190
  760. nautobot/project-static/docs/models/extras/graphqlquery.html +1469 -171
  761. nautobot/project-static/docs/models/extras/imageattachment.html +1434 -181
  762. nautobot/project-static/docs/models/extras/job.html +1411 -157
  763. nautobot/project-static/docs/models/extras/jobbutton.html +1410 -207
  764. nautobot/project-static/docs/models/extras/jobhook.html +1397 -194
  765. nautobot/project-static/docs/models/extras/joblogentry.html +1408 -155
  766. nautobot/project-static/docs/models/extras/jobresult.html +1417 -159
  767. nautobot/project-static/docs/models/extras/note.html +1389 -190
  768. nautobot/project-static/docs/models/extras/relationship.html +1391 -192
  769. nautobot/project-static/docs/models/extras/role.html +1495 -198
  770. nautobot/project-static/docs/models/extras/secret.html +1492 -201
  771. nautobot/project-static/docs/models/extras/secretsgroup.html +1410 -157
  772. nautobot/project-static/docs/models/extras/status.html +1381 -221
  773. nautobot/project-static/docs/models/extras/tag.html +1389 -190
  774. nautobot/project-static/docs/models/extras/webhook.html +1389 -190
  775. nautobot/project-static/docs/models/ipam/ipaddress.html +1488 -200
  776. nautobot/project-static/docs/models/ipam/prefix.html +1410 -157
  777. nautobot/project-static/docs/models/ipam/rir.html +1410 -157
  778. nautobot/project-static/docs/models/ipam/routetarget.html +1410 -157
  779. nautobot/project-static/docs/models/ipam/service.html +1410 -157
  780. nautobot/project-static/docs/models/ipam/vlan.html +1410 -157
  781. nautobot/project-static/docs/models/ipam/vlangroup.html +1410 -157
  782. nautobot/project-static/docs/models/ipam/vrf.html +1410 -161
  783. nautobot/project-static/docs/models/tenancy/tenant.html +1412 -159
  784. nautobot/project-static/docs/models/tenancy/tenantgroup.html +1412 -159
  785. nautobot/project-static/docs/models/users/objectpermission.html +1462 -171
  786. nautobot/project-static/docs/models/users/token.html +1410 -157
  787. nautobot/project-static/docs/models/virtualization/cluster.html +1410 -157
  788. nautobot/project-static/docs/models/virtualization/clustergroup.html +1410 -157
  789. nautobot/project-static/docs/models/virtualization/clustertype.html +1410 -157
  790. nautobot/project-static/docs/models/virtualization/virtualmachine.html +1414 -157
  791. nautobot/project-static/docs/models/virtualization/vminterface.html +1410 -157
  792. nautobot/project-static/docs/objects.inv +0 -0
  793. nautobot/project-static/docs/plugins/development.html +1916 -646
  794. nautobot/project-static/docs/plugins/index.html +1389 -190
  795. nautobot/project-static/docs/plugins/porting-from-netbox.html +1389 -190
  796. nautobot/project-static/docs/release-notes/index.html +1389 -190
  797. nautobot/project-static/docs/release-notes/version-1.0.html +1389 -190
  798. nautobot/project-static/docs/release-notes/version-1.1.html +1389 -190
  799. nautobot/project-static/docs/release-notes/version-1.2.html +1389 -190
  800. nautobot/project-static/docs/release-notes/version-1.3.html +1389 -190
  801. nautobot/project-static/docs/release-notes/version-1.4.html +1389 -190
  802. nautobot/project-static/docs/release-notes/version-1.5.html +2016 -397
  803. nautobot/project-static/docs/release-notes/version-2.0.html +1935 -287
  804. nautobot/project-static/docs/requirements.txt +5 -4
  805. nautobot/project-static/docs/rest-api/authentication.html +1389 -190
  806. nautobot/project-static/docs/rest-api/filtering.html +1389 -190
  807. nautobot/project-static/docs/rest-api/overview.html +2002 -576
  808. nautobot/project-static/docs/rest-api/ui-related-endpoints.html +4057 -0
  809. nautobot/project-static/docs/search/search_index.json +1 -1
  810. nautobot/project-static/docs/sitemap.xml +197 -187
  811. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  812. nautobot/project-static/docs/user-guides/custom-fields.html +1390 -191
  813. nautobot/project-static/docs/user-guides/getting-started/creating-devices.html +1392 -193
  814. nautobot/project-static/docs/user-guides/getting-started/index.html +1388 -189
  815. nautobot/project-static/docs/user-guides/getting-started/interfaces.html +1388 -189
  816. nautobot/project-static/docs/user-guides/getting-started/ipam.html +1386 -187
  817. nautobot/project-static/docs/user-guides/getting-started/platforms.html +1448 -249
  818. nautobot/project-static/docs/user-guides/getting-started/regions.html +1411 -212
  819. nautobot/project-static/docs/user-guides/getting-started/search-bar.html +1395 -196
  820. nautobot/project-static/docs/user-guides/getting-started/tenants.html +1448 -249
  821. nautobot/project-static/docs/user-guides/getting-started/vlans-and-vlan-groups.html +1448 -249
  822. nautobot/project-static/docs/user-guides/git-data-source.html +1405 -206
  823. nautobot/project-static/docs/user-guides/graphql.html +1402 -203
  824. nautobot/project-static/docs/user-guides/relationships.html +1448 -249
  825. nautobot/project-static/docs/user-guides/s3-django-storage.html +1448 -249
  826. nautobot/project-static/js/forms.js +16 -9
  827. nautobot/project-static/js/theme.js +5 -0
  828. nautobot/tenancy/api/serializers.py +4 -34
  829. nautobot/tenancy/api/urls.py +1 -1
  830. nautobot/tenancy/filters/__init__.py +9 -7
  831. nautobot/tenancy/filters/mixins.py +3 -2
  832. nautobot/tenancy/forms.py +3 -36
  833. nautobot/tenancy/migrations/0001_initial.py +0 -1
  834. nautobot/tenancy/migrations/0002_auto_slug.py +0 -1
  835. nautobot/tenancy/migrations/0003_mptt_to_tree_queries.py +0 -1
  836. nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +0 -1
  837. nautobot/tenancy/migrations/0005_rename_foreign_keys_and_related_names.py +0 -1
  838. nautobot/tenancy/migrations/0006_created_datetime.py +0 -1
  839. nautobot/tenancy/migrations/0007_remove_tenant_tenantgroup_slug.py +20 -0
  840. nautobot/tenancy/migrations/0008_tagsfield.py +19 -0
  841. nautobot/tenancy/models.py +0 -30
  842. nautobot/tenancy/navigation.py +6 -39
  843. nautobot/tenancy/tables.py +4 -4
  844. nautobot/tenancy/templates/tenancy/tenant.html +12 -12
  845. nautobot/tenancy/templates/tenancy/tenant_edit.html +0 -1
  846. nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
  847. nautobot/tenancy/tests/test_api.py +1 -12
  848. nautobot/tenancy/tests/test_filters.py +20 -12
  849. nautobot/tenancy/tests/test_views.py +11 -29
  850. nautobot/tenancy/urls.py +10 -10
  851. nautobot/tenancy/views.py +0 -3
  852. nautobot/ui/.eslintignore +6 -0
  853. nautobot/ui/.gitignore +10 -0
  854. nautobot/ui/.prettierignore +9 -0
  855. nautobot/ui/.prettierrc +4 -0
  856. nautobot/ui/README.md +33 -0
  857. nautobot/ui/app_imports.js.j2 +7 -0
  858. nautobot/ui/craco.config.js +46 -0
  859. nautobot/ui/jsconfig-base.json +11 -0
  860. nautobot/ui/jsconfig.json +5 -0
  861. nautobot/ui/lib/nautobot-craco-alias-plugin.js +40 -0
  862. nautobot/ui/package-lock.json +21451 -0
  863. nautobot/ui/package.json +70 -0
  864. nautobot/ui/public/index.html +47 -0
  865. nautobot/ui/public/logo192.png +0 -0
  866. nautobot/ui/public/logo512.png +0 -0
  867. nautobot/ui/public/manifest.json +25 -0
  868. nautobot/ui/public/nautobot_logo.svg +131 -0
  869. nautobot/ui/public/robots.txt +3 -0
  870. nautobot/ui/src/App.js +71 -0
  871. nautobot/ui/src/components/AppFullWidthComponents.js +8 -0
  872. nautobot/ui/src/components/AppTab.js +40 -0
  873. nautobot/ui/src/components/Apps.js +60 -0
  874. nautobot/ui/src/components/HomeChangelogPanel.js +98 -0
  875. nautobot/ui/src/components/HomePanel.js +58 -0
  876. nautobot/ui/src/components/JobHistoryTable.js +78 -0
  877. nautobot/ui/src/components/Layout.js +53 -0
  878. nautobot/ui/src/components/LoadingWidget.js +25 -0
  879. nautobot/ui/src/components/Navbar.js +116 -0
  880. nautobot/ui/src/components/NotificationPopover.js +27 -0
  881. nautobot/ui/src/components/ObjectListTable.js +209 -0
  882. nautobot/ui/src/components/ReferenceDataTag.js +35 -0
  883. nautobot/ui/src/components/RouterButton.js +10 -0
  884. nautobot/ui/src/components/RouterLink.js +10 -0
  885. nautobot/ui/src/components/SidebarNav.js +147 -0
  886. nautobot/ui/src/components/Table.js +48 -0
  887. nautobot/ui/src/components/TableItem.js +71 -0
  888. nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +16 -0
  889. nautobot/ui/src/components/__tests__/AppTab.test.js +21 -0
  890. nautobot/ui/src/components/__tests__/Apps.test.js +14 -0
  891. nautobot/ui/src/components/__tests__/Layout.test.js +33 -0
  892. nautobot/ui/src/components/__tests__/Table.test.js +36 -0
  893. nautobot/ui/src/components/__tests__/TableItem.test.js +37 -0
  894. nautobot/ui/src/components/__tests__/paginator.test.js +43 -0
  895. nautobot/ui/src/components/__tests__/paginator_form.test.js +13 -0
  896. nautobot/ui/src/components/pagination.js +93 -0
  897. nautobot/ui/src/components/paginator.js +79 -0
  898. nautobot/ui/src/components/paginator_form.js +43 -0
  899. nautobot/ui/src/components/usePagination.js +57 -0
  900. nautobot/ui/src/constants/apiPath.js +10 -0
  901. nautobot/ui/src/constants/icons.js +15 -0
  902. nautobot/ui/src/constants/size.js +15 -0
  903. nautobot/ui/src/index.js +65 -0
  904. nautobot/ui/src/reportWebVitals.js +15 -0
  905. nautobot/ui/src/router.js +77 -0
  906. nautobot/ui/src/utils/api.js +131 -0
  907. nautobot/ui/src/utils/app-import.js +15 -0
  908. nautobot/ui/src/utils/color.js +15 -0
  909. nautobot/ui/src/utils/date.js +14 -0
  910. nautobot/ui/src/utils/index.js +15 -0
  911. nautobot/ui/src/utils/navigation.js +32 -0
  912. nautobot/ui/src/utils/session.js +64 -0
  913. nautobot/ui/src/utils/store.js +242 -0
  914. nautobot/ui/src/utils/string.js +6 -0
  915. nautobot/ui/src/utils/url.js +4 -0
  916. nautobot/ui/src/views/Home.js +138 -0
  917. nautobot/ui/src/views/InstalledApps.js +80 -0
  918. nautobot/ui/src/views/Login.js +48 -0
  919. nautobot/ui/src/views/Logout.js +20 -0
  920. nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +11 -0
  921. nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +107 -0
  922. nautobot/ui/src/views/__tests__/Login.test.js +15 -0
  923. nautobot/ui/src/views/generic/GenericView.js +142 -0
  924. nautobot/ui/src/views/generic/ObjectCreate.js +96 -0
  925. nautobot/ui/src/views/generic/ObjectList.js +127 -0
  926. nautobot/ui/src/views/generic/ObjectRetrieve.js +551 -0
  927. nautobot/users/admin.py +1 -1
  928. nautobot/users/api/serializers.py +51 -61
  929. nautobot/users/api/urls.py +1 -1
  930. nautobot/users/api/views.py +53 -2
  931. nautobot/users/migrations/0001_initial.py +0 -1
  932. nautobot/users/migrations/0002_token_ordering_by_created.py +0 -1
  933. nautobot/users/migrations/0003_alter_user_options.py +0 -1
  934. nautobot/users/migrations/0004_alter_user_managers.py +0 -1
  935. nautobot/users/tests/test_api.py +109 -28
  936. nautobot/users/tests/test_filters.py +0 -4
  937. nautobot/users/tests/test_models.py +0 -1
  938. nautobot/users/views.py +0 -7
  939. nautobot/virtualization/api/serializers.py +18 -132
  940. nautobot/virtualization/api/urls.py +1 -1
  941. nautobot/virtualization/api/views.py +1 -22
  942. nautobot/virtualization/choices.py +0 -2
  943. nautobot/virtualization/filters.py +12 -7
  944. nautobot/virtualization/forms.py +21 -117
  945. nautobot/virtualization/migrations/0001_initial.py +0 -1
  946. nautobot/virtualization/migrations/0002_virtualmachine_local_context_schema.py +0 -1
  947. nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +0 -1
  948. nautobot/virtualization/migrations/0004_auto_slug.py +0 -1
  949. nautobot/virtualization/migrations/0005_add_natural_indexing.py +0 -1
  950. nautobot/virtualization/migrations/0006_vminterface_status.py +0 -1
  951. nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +0 -1
  952. nautobot/virtualization/migrations/0008_vminterface_parent.py +0 -1
  953. nautobot/virtualization/migrations/0009_cluster_location.py +0 -1
  954. nautobot/virtualization/migrations/0010_vminterface_mac_address_data_migration.py +0 -1
  955. nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +0 -1
  956. nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -2
  957. nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +18 -12
  958. nautobot/virtualization/migrations/0014_rename_virtualmachine_roles.py +0 -1
  959. nautobot/virtualization/migrations/0015_rename_foreignkey_fields.py +1 -2
  960. nautobot/virtualization/migrations/0016_remove_site_foreign_key_from_cluster_class.py +0 -1
  961. nautobot/virtualization/migrations/0017_created_datetime.py +0 -1
  962. nautobot/virtualization/migrations/0018_related_name_changes.py +1 -2
  963. nautobot/virtualization/migrations/0019_vminterface_ip_addresses_m2m.py +0 -1
  964. nautobot/virtualization/migrations/0020_remove_clustergroup_clustertype_slug.py +20 -0
  965. nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +39 -0
  966. nautobot/virtualization/migrations/0022_vminterface_timestamps_data_migration.py +17 -0
  967. nautobot/virtualization/migrations/0023_ipam__namespaces.py +25 -0
  968. nautobot/virtualization/migrations/0024_fixup_null_statuses.py +25 -0
  969. nautobot/virtualization/migrations/0025_status_nonnullable.py +29 -0
  970. nautobot/virtualization/models.py +39 -131
  971. nautobot/virtualization/navigation.py +18 -99
  972. nautobot/virtualization/tables.py +4 -4
  973. nautobot/virtualization/templates/virtualization/virtualmachine.html +13 -2
  974. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +6 -0
  975. nautobot/virtualization/tests/test_api.py +42 -52
  976. nautobot/virtualization/tests/test_filters.py +98 -75
  977. nautobot/virtualization/tests/test_models.py +36 -13
  978. nautobot/virtualization/tests/test_views.py +68 -73
  979. nautobot/virtualization/urls.py +10 -10
  980. nautobot/virtualization/views.py +8 -14
  981. {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/METADATA +15 -22
  982. {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/RECORD +987 -834
  983. {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/WHEEL +1 -1
  984. nautobot/circuits/api/nested_serializers.py +0 -69
  985. nautobot/core/templates/plugin_template/navigation.py-tpl +0 -22
  986. nautobot/dcim/api/nested_serializers.py +0 -356
  987. nautobot/dcim/templates/dcim/device_import.html +0 -5
  988. nautobot/dcim/templates/dcim/device_import_child.html +0 -5
  989. nautobot/dcim/templates/dcim/inc/device_import_header.html +0 -4
  990. nautobot/extras/api/nested_serializers.py +0 -353
  991. nautobot/extras/migrations/0064_configcontext_data_migrations.py +0 -42
  992. nautobot/extras/migrations/0071_job__unique_name_data_migration.py +0 -47
  993. nautobot/extras/reports.py +0 -60
  994. nautobot/extras/scripts.py +0 -72
  995. nautobot/extras/tests/example_jobs/script_variables.py +0 -67
  996. nautobot/extras/tests/example_jobs/test_duplicate_name2.py +0 -5
  997. nautobot/extras/tests/example_jobs/test_fail.py +0 -16
  998. nautobot/extras/tests/example_jobs/test_file_upload_pass.py +0 -20
  999. nautobot/extras/tests/example_jobs/test_ipaddress_vars.py +0 -52
  1000. nautobot/extras/tests/example_jobs/test_job_button_receiver.py +0 -21
  1001. nautobot/extras/tests/example_jobs/test_job_hook_receiver.py +0 -20
  1002. nautobot/extras/tests/example_jobs/test_location_with_custom_field.py +0 -35
  1003. nautobot/extras/tests/example_jobs/test_log_redaction.py +0 -14
  1004. nautobot/extras/tests/example_jobs/test_modify_db.py +0 -19
  1005. nautobot/extras/tests/example_jobs/test_object_var_optional.py +0 -14
  1006. nautobot/extras/tests/example_jobs/test_object_var_required.py +0 -14
  1007. nautobot/extras/tests/example_jobs/test_object_vars.py +0 -29
  1008. nautobot/extras/tests/example_jobs/test_pass.py +0 -19
  1009. nautobot/extras/tests/example_jobs/test_read_only_fail.py +0 -24
  1010. nautobot/extras/tests/example_jobs/test_read_only_no_commit_field.py +0 -10
  1011. nautobot/extras/tests/example_jobs/test_read_only_pass.py +0 -22
  1012. nautobot/ipam/api/nested_serializers.py +0 -143
  1013. nautobot/project-static/docs/assets/javascripts/bundle.5a2dcb6a.min.js +0 -29
  1014. nautobot/project-static/docs/assets/javascripts/bundle.5a2dcb6a.min.js.map +0 -8
  1015. nautobot/project-static/docs/assets/javascripts/extra/bundle.5f09fbc3.min.js +0 -18
  1016. nautobot/project-static/docs/assets/javascripts/extra/bundle.5f09fbc3.min.js.map +0 -8
  1017. nautobot/project-static/docs/assets/stylesheets/extra.0d2c79a8.min.css +0 -1
  1018. nautobot/project-static/docs/assets/stylesheets/extra.0d2c79a8.min.css.map +0 -1
  1019. nautobot/project-static/docs/assets/stylesheets/main.975780f9.min.css +0 -1
  1020. nautobot/project-static/docs/assets/stylesheets/main.975780f9.min.css.map +0 -1
  1021. nautobot/project-static/docs/assets/stylesheets/palette.2505c338.min.css +0 -1
  1022. nautobot/project-static/docs/assets/stylesheets/palette.2505c338.min.css.map +0 -1
  1023. nautobot/tenancy/api/nested_serializers.py +0 -31
  1024. nautobot/users/api/nested_serializers.py +0 -67
  1025. nautobot/virtualization/api/nested_serializers.py +0 -65
  1026. /nautobot/extras/{tests/example_jobs → test_jobs}/__init__.py +0 -0
  1027. /nautobot/{dcim/models/sites.py → ipam/management/__init__.py} +0 -0
  1028. {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/LICENSE.txt +0 -0
  1029. {nautobot-2.0.0a2.dist-info → nautobot-2.0.0b1.dist-info}/entry_points.txt +0 -0
@@ -2,166 +2,42 @@
2
2
 
3
3
  ## Dependency Changes
4
4
 
5
+ - Nautobot no longer uses or supports the use of `django-cryptography`.
5
6
  - Nautobot no longer uses or supports the use of `django-mptt`.
6
7
  - Nautobot no longer uses or supports the use of `django-rq`.
7
8
 
8
9
  ## Database (ORM) Changes
9
10
 
10
- ### Database Behavior Changes
11
+ ### Database Field Behavior Changes
11
12
 
12
- | Model | Field | Changes |
13
- |--------------|----------------|-----------------------------------------------------------------------------------|
14
- | (all) | `created` | Changed from DateField to DateTimeField |
15
- | JobLogEntry | `absolute_url` | No longer accepts `null` values, use `""` instead |
16
- | | `log_object` | No longer accepts `null` values, use `""` instead |
17
- | Prefix | `is_pool` | Replaced by new field `type`, valid choices are "Container", "Network" and "Pool" |
18
- | | `status` | Container status has been replaced by new field `type` |
19
- | ScheduledJob | `queue` | No longer accepts `null` values, use `""` instead |
20
- | Webhook | `ca_file_path` | No longer accepts `null` values, use `""` instead |
13
+ Most of the database field behavior changes in Nautobot 2.0 fall into the following general categories:
14
+
15
+ 1. The `created` field on models has changed from a date only ("2023-04-06") to being a date/time ("2023-04-06T19:57:45.320232Z")
16
+ 2. Various models that had a required `site` field and an optional `location` field now have a required `location` field.
17
+
18
+ ??? info "Full table of database field behavior changes"
19
+ {data-table installation/tables/v2-database-behavior-changes.yaml}
21
20
 
22
21
  ### Renamed Database Fields
23
22
 
24
- | Model | Renamed Field | New Name |
25
- |-------------------------|-----------------------------------------|------------------------------------------------|
26
- | CablePath | `circuittermination` | `circuit_terminations` |
27
- | | `consoleport` | `console_ports` |
28
- | | `consoleserverport` | `console_server_ports` |
29
- | | `interface` | `interfaces` |
30
- | | `powerfeed` | `power_feeds` |
31
- | | `poweroutlet` | `power_outlets` |
32
- | | `powerport` | `power_ports` |
33
- | Circuit | `termination_a` | `circuit_termination_a` |
34
- | | `termination_z` | `circuit_termination_z` |
35
- | | `terminations` | `circuit_terminations` |
36
- | | `type` | `circuit_type` |
37
- | Cluster | `group` | `cluster_group` |
38
- | | `type` | `cluster_type` |
39
- | ConfigContextSchema | `schema` | `config_context_schema` |
40
- | | `device_set` | `devices` |
41
- | | `virtualmachine_set` | `virtual_machines` |
42
- | ContentType | `computedfield_set` | `computed_fields` |
43
- | | `configcontext_set` | `config_contexts` |
44
- | | `configcontextschema_set` | `config_context_schemas` |
45
- | | `customlink_set` | `custom_links` |
46
- | | `dcim_device_related` | `devices` |
47
- | | `dynamicgroup_set` | `dynamic_groups` |
48
- | | `exporttemplate_set` | `export_templates` |
49
- | | `imageattachment_set` | `image_attachments` |
50
- | | `note_set` | `notes` |
51
- | | `virtualization_virtualmachine_related` | `virtual_machines` |
52
- | CustomFieldChoice | `field` | `custom_field` |
53
- | CustomField | `choices` | `custom_field_choices` |
54
- | | `slug` | `key` |
55
- | Device | `consoleports` | `console_ports` |
56
- | | `consoleserverports` | `console_server_ports` |
57
- | | `devicebays` | `device_bays` |
58
- | | `device_role` | `role` |
59
- | | `frontports` | `front_ports` |
60
- | | `inventoryitems` | `inventory_items` |
61
- | | `local_context_data` | `local_config_context_data` |
62
- | | `local_context_data_owner_content_type` | `local_config_context_data_owner_content_type` |
63
- | | `local_context_data_owner_object_id` | `local_config_context_data_owner_object_id` |
64
- | | `local_context_schema` | `local_config_context_schema` |
65
- | | `poweroutlets` | `power_outlets` |
66
- | | `powerports` | `power_ports` |
67
- | | `rearports` | `rear_ports` |
68
- | DeviceRedundancyGroup | `members` | `devices` |
69
- | DeviceType | `consoleporttemplates` | `console_port_templates` |
70
- | | `consoleserverporttemplates` | `console_server_port_templates` |
71
- | | `devicebaytemplates` | `device_bay_templates` |
72
- | | `frontporttemplates` | `front_port_templates` |
73
- | | `interfacetemplates` | `interface_templates` |
74
- | | `instances` | `devices` |
75
- | | `poweroutlettemplates` | `power_outlet_templates` |
76
- | | `powerporttemplates` | `power_port_templates` |
77
- | | `rearporttemplates` | `rear_port_templates` |
78
- | FrontPortTemplate | `rear_port` | `rear_port_template` |
79
- | InventoryItem | `child_items` | `children` |
80
- | | `level` | `tree_depth` |
81
- | Job | `job_hook` | `job_hooks` |
82
- | | `results` | `job_results` |
83
- | JobResult | `logs` | `job_log_entries` |
84
- | | `schedule` | `scheduled_job` |
85
- | Location | `powerpanels` | `power_panels` |
86
- | PowerOutletTemplate | `power_port` | `power_port_template` |
87
- | PowerPanel | `powerfeeds` | `power_feeds` |
88
- | PowerPort | `poweroutlets` | `power_outlets` |
89
- | PowerPortTemplate | `poweroutlet_templates` | `power_outlet_templates` |
90
- | Rack | `group` | `rack_group` |
91
- | | `powerfeed_set` | `power_feeds` |
92
- | | `reservations` | `rack_reservations` |
93
- | RackGroup | `level` | `tree_depth` |
94
- | | `powerpanel_set` | `power_panels` |
95
- | RearPort | `frontports` | `front_ports` |
96
- | RearPortTemplate | `frontport_templates` | `front_port_templates` |
97
- | Region | `level` | `tree_depth` |
98
- | Relationship | `associations` | `relationship_associations` |
99
- | Secret | `groups` | `secrets_groups` |
100
- | | `secretsgroupassociation_set` | `secrets_group_associations` |
101
- | RIR | `aggregates` | [`prefixes`](#aggregate-migrated-to-prefix) |
102
- | SecretsGroup | `device_set` | `devices` |
103
- | | `deviceredundancygroup_set` | `device_redundancy_groups` |
104
- | | `gitrepository_set` | `git_repositories` |
105
- | | `secretsgroupassociation_set` | `secrets_group_associations` |
106
- | SecretsGroupAssociation | `group` | `secrets_group` |
107
- | Service | `ipaddresses` | `ip_addresses` |
108
- | Status | `circuits_circuit_related` | `circuits` |
109
- | | `dcim_cable_related` | `cables` |
110
- | | `dcim_device_related` | `devices` |
111
- | | `dcim_deviceredundancygroup_related` | `device_redundancy_groups` |
112
- | | `dcim_interface_related` | `interfaces` |
113
- | | `dcim_location_related` | `locations` |
114
- | | `dcim_powerfeed_related` | `power_feeds` |
115
- | | `dcim_rack_related` | `racks` |
116
- | | `ipam_ipaddress_related` | `ip_addresses` |
117
- | | `ipam_prefix_related` | `prefixes` |
118
- | | `ipam_vlan_related` | `vlans` |
119
- | | `virtualization_virtualmachine_related` | `virtual_machines` |
120
- | | `virtualization_vminterface_related` | `vm_interfaces` |
121
- | Tenant | `group` | `tenant_group` |
122
- | | `rackreservations` | `rack_reservations` |
123
- | TenantGroup | `level` | `tree_depth` |
124
- | User | `changes` | `object_changes` |
125
- | | `note` | `notes` |
126
- | | `rackreservation_set` | `rack_reservations` |
127
- | VirtualMachine | `local_context_data` | `local_config_context_data` |
128
- | | `local_context_data_owner_content_type` | `local_config_context_data_owner_content_type` |
129
- | | `local_context_data_owner_object_id` | `local_config_context_data_owner_object_id` |
130
- | | `local_context_schema` | `local_config_context_schema` |
131
- | VLAN | `group` | `vlan_group` |
23
+ Most renamed database fields in Nautobot 2.0 fall into the following general categories:
24
+
25
+ 1. Renaming of foreign keys and reverse relations to more consistently and specifically match the related model name or plural name (for example, `Circuit.terminations` to `Circuit.circuit_terminations`, `Rack.group` to `Rack.rack_group`)
26
+ 2. Renaming of tree model fields for consistency and due to the change from `django-mptt` to `django-tree-queries` (for example, `InventoryItem.child_items` to `InventoryItem.children` and `InventoryItem.level` to `InventoryItem.tree_depth`)
27
+
28
+ ??? info "Full table of renamed database fields"
29
+ {data-table installation/tables/v2-database-renamed-fields.yaml}
132
30
 
133
31
  ### Removed Database Fields
134
32
 
135
- | Model | Removed Field |
136
- |--------------------|---------------|
137
- | CircuitTermination | `site` |
138
- | Cluster | `site` |
139
- | ConfigContext | `sites` |
140
- | | `regions` |
141
- | CustomField | `name` |
142
- | Device | `site` |
143
- | GitRepository | `_token` |
144
- | | `username` |
145
- | InventoryItem | `lft` |
146
- | | `rght` |
147
- | | `tree_id` |
148
- | Location | `site` |
149
- | Rack | `site` |
150
- | RackGroup | `lft` |
151
- | | `rght` |
152
- | | `tree_id` |
153
- | PowerFeed | `site` |
154
- | PowerPanel | `site` |
155
- | Prefix | `is_pool` |
156
- | | `site` |
157
- | Region | `lft` |
158
- | | `rght` |
159
- | | `tree_id` |
160
- | TenantGroup | `lft` |
161
- | | `rght` |
162
- | | `tree_id` |
163
- | VLAN | `site` |
164
- | VLANGroup | `site` |
33
+ Most removed database fields in Nautobot 2.0 fall into the following general categories:
34
+
35
+ 1. Removal of references to removed models such as `Site` and `Region`
36
+ 2. Removal of `slug` fields in preference to the use of autogenerated natural-key slugs.
37
+ 3. Removal of `django-mptt` internal fields (`lft`, `rght`, `tree_id`)
38
+
39
+ ??? info "Full table of removed database fields"
40
+ {data-table installation/tables/v2-database-removed-fields.yaml}
165
41
 
166
42
  ### Replaced Models
167
43
 
@@ -203,92 +79,58 @@ If a `Prefix` already exists with the same network and prefix length as a previo
203
79
  | `rir` | `rir` |
204
80
  | `tenant` | `tenant` |
205
81
 
82
+ #### Prefix Parenting Concrete Relationship
83
+
84
+ The `ipam.Prefix` model has been modified to have a self-referencing foreign key as the `parent` field. Parenting of prefixes is now automatically managed at the database level to greatly improve performance especially when calculating tree hierarchy and utilization.
85
+
86
+ As a result of this change, it is no longer necessary nor possible to disable tree hierarchy using `settings.DISABLE_PREFIX_LIST_HIERARCHY` as this setting has been removed. Additionally it is no longer possible to disable global uniqueness using `settings.ENFORCE_GLOBAL_UNIQUE` as this setting has been removed.
87
+
88
+ The following changes have been made to the `Prefix` model.
89
+
90
+ | Removed | Replaced With |
91
+ |------------------------|-----------------|
92
+ | `get_child_prefixes()` | `descendants()` |
93
+
94
+ #### IPAddressd Parenting Concrete Relationship
95
+
96
+ The `ipam.IPAddress` model has been modified to have a foreign key to `ipam.Prefix` as the `parent` field. Parenting of IP addresses is now automatically managed at the database level to greatly improve performance especially when calculating tree hierarchy and utilization.
97
+
98
+ | Removed | Replaced With |
99
+ |------------------------|-----------------|
100
+ | `get_child_prefixes()` | `descendants()` |
101
+
206
102
  ## GraphQL and REST API Changes
207
103
 
208
104
  ### API Behavior Changes
209
105
 
210
- | Model | Field | Changes |
211
- |-----------------------|----------------|----------------------------------------------------------------------------------------------------------|
212
- | (all) | `created` | Now is a date/time (`"2023-02-14T19:57:45.320232Z"`) rather than only a date |
213
- | Cable | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
214
- | Circuit | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
215
- | Device | `location` | Now `location` has changed to a required field on this model Serializer |
216
- | | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
217
- | DeviceRedundancyGroup | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
218
- | Interface | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
219
- | IPAddress | `role` | `/ipam/ip-addresses/` endpoint now uses role nested serializer for the role field, rather than a string. |
220
- | | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
221
- | Location | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
222
- | PowerFeed | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
223
- | PowerPanel | `location` | Now `location` has changed to a required field on this model Serializer |
224
- | Prefix | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
225
- | Rack | `location` | Now `location` has changed to a required field on this model Serializer |
226
- | | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
227
- | RackGroup | `location` | Now `location` has changed to a required field on this model Serializer |
228
- | | `rack_count` | Now only counts Racks directly belonging to this RackGroup, not those belonging to its descendants. |
229
- | Region | `site_count` | Now only counts Sites directly belonging to this Region, not those belonging to its descendants. |
230
- | Site | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
231
- | TenantGroup | `tenant_count` | Now only counts Tenants directly belonging to this TenantGroup, not those belonging to its descendants. |
232
- | VirtualMachine | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
233
- | VLAN | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
234
- | VMInterface | `status` | Now uses a nested Status serializer, rather than `{"value": "<slug>", "label": "<name>"}` |
106
+ Most of the API behavior changes in Nautobot 2.0 fall into the following general categories:
107
+
108
+ 1. The `created` field on most models has changed from a date only ("2023-04-06") to being a date/time ("2023-04-06T19:57:45.320232Z")
109
+ 2. The `status` fields on various models has changed from a pseudo-enum value (containing a "value" and a "label") to referencing the related Status object in full, similar to other foreign-key fields.
110
+ 3. Various models that had a required `site` field and an optional `location` field now have a required `location` field.
111
+
112
+ ??? info "Full table of API behavior changes"
113
+ {data-table installation/tables/v2-api-behavior-changes.yaml}
235
114
 
236
115
  ### Renamed Serializer Fields
237
116
 
238
- | Model | Renamed Field | New Name |
239
- |-------------------------|------------------------|-------------------------------|
240
- | Circuit | `termination_a` | `circuit_termination_a` |
241
- | | `termination_z` | `circuit_termination_z` |
242
- | | `type` | `circuit_type` |
243
- | ConfigContext | `schema` | `config_context_schema` |
244
- | Cluster | `group` | `cluster_group` |
245
- | | `type` | `cluster_type` |
246
- | CustomField | `slug` | `key` |
247
- | CustomFieldChoice | `field` | `custom_field` |
248
- | Device | `device_role` | `role` |
249
- | | `local_context_data` | `local_config_context_data` |
250
- | | `local_context_schema` | `local_config_context_schema` |
251
- | FrontPortTemplate | `rear_port` | `rear_port_template` |
252
- | Interface | `count_ipaddresses` | `ip_address_count` |
253
- | InventoryItem | `_depth` | `tree_depth` |
254
- | Location | `virtualmachine_count` | `virtual_machine_count` |
255
- | Manufacturer | `devicetype_count` | `device_type_count` |
256
- | | `inventoryitem_count` | `inventory_item_count` |
257
- | Platform | `virtualmachine_count` | `virtual_machine_count` |
258
- | PowerOutletTemplate | `power_port` | `power_port_template` |
259
- | PowerPanel | `powerfeed_count` | `power_feed_count` |
260
- | Rack | `group` | `rack_group` |
261
- | | `powerfeed_count` | `power_feed_count` |
262
- | JobResult | `schedule` | `scheduled_job` |
263
- | RackGroup | `_depth` | `tree_depth` |
264
- | Region | `_depth` | `tree_depth` |
265
- | SecretsGroupAssociation | `group` | `secrets_group` |
266
- | Service | `ipaddresses` | `ip_addresses` |
267
- | Tenant | `group` | `tenant_group` |
268
- | TenantGroup | `_depth` | `tree_depth` |
269
- | VirtualMachine | `local_context_data` | `local_config_context_data` |
270
- | | `local_context_schema` | `local_config_context_schema` |
271
- | VLAN | `group` | `vlan_group` |
117
+ Most renamed API fields in Nautobot 2.0 fall into the following general categories:
118
+
119
+ 1. Renaming of foreign keys and reverse relations to more consistently and specifically match the related model name or plural name (for example, `Circuit.type` to `Circuit.circuit_type`, `Interface.count_ipaddresses` to `Interface.ip_address_count`)
120
+ 2. Renaming of tree model fields for consistency and due to the change from `django-mptt` to `django-tree-queries` (for example, `InventoryItem._depth` to `InventoryItem.tree_depth`)
121
+
122
+ ??? info "Full table of renamed API fields"
123
+ {data-table installation/tables/v2-api-renamed-fields.yaml}
272
124
 
273
125
  ### Removed Serializer Fields
274
126
 
275
- | Model/Endpoint | Removed Field | Comments |
276
- |-----------------------------------|----------------------|-------------------------------------------------------|
277
- | `/api/status/` | `rq-workers-running` | Removed as RQ is no longer supported |
278
- | `/ipam/prefixes/` | `is_pool` | Functionality replaced by `type` field |
279
- | `/circuits/circuit-terminations/` | `site` | `Site` and `Region` models are replaced by `Location` |
280
- | `/virtualization/clusters/` | `site` | `Site` and `Region` models are replaced by `Location` |
281
- | `/extras/config-contexts/` | `regions` | `Site` and `Region` models are replaced by `Location` |
282
- | | `sites` | `Site` and `Region` models are replaced by `Location` |
283
- | `/dcim/devices/` | `site` | `Site` and `Region` models are replaced by `Location` |
284
- | `/dcim/locations/` | `site` | `Site` and `Region` models are replaced by `Location` |
285
- | `/dcim/power-feeds/` | `site` | `Site` and `Region` models are replaced by `Location` |
286
- | `/dcim/power-panels/` | `site` | `Site` and `Region` models are replaced by `Location` |
287
- | `/dcim/racks/` | `site` | `Site` and `Region` models are replaced by `Location` |
288
- | `/dcim/rack-groups/` | `site` | `Site` and `Region` models are replaced by `Location` |
289
- | `/ipam/prefixes/` | `site` | `Site` and `Region` models are replaced by `Location` |
290
- | `/ipam/vlans/` | `site` | `Site` and `Region` models are replaced by `Location` |
291
- | `/ipam/vlangroups/` | `site` | `Site` and `Region` models are replaced by `Location` |
127
+ Most removed database fields in Nautobot 2.0 fall into the following general categories:
128
+
129
+ 1. Removal of references to removed models such as `Site` and `Region`
130
+ 2. Removal of `slug` fields in preference to the use of autogenerated natural-key slugs.
131
+
132
+ ??? info "Full table of removed API fields"
133
+ {data-table installation/tables/v2-api-removed-fields.yaml}
292
134
 
293
135
  ### Removed 1.X Version Endpoints and Serializer Representations
294
136
 
@@ -306,444 +148,97 @@ These endpoints `/ipam/roles/`, `/dcim/rack-roles/` and `/dcim/device-roles/` ar
306
148
  | `/dcim/rack-roles/` | `/extras/roles/` |
307
149
  | `/ipam/roles/` | `/extras/roles/` |
308
150
 
151
+ ### API Query Parameters Changes
152
+
153
+ Nautobot 2.0 removes the `?brief` query parameter and adds support for the `?depth` query parameter. As a result, the ability to specify `brief_mode` in `DynamicModelChoiceField`, `DynamicModelMultipleChoiceField`, and `MultiMatchModelMultipleChoiceField` has also been removed. For every occurrence of the aforementioned fields where you have `brief_mode` set to `True/False` (e.g. `brief_mode=True`), please remove the statement, leaving other occurrences of the fields where you do not have `brief_mode` specified as they are.
154
+ Please see the [documentation on the `?depth` query parameter](../rest-api/overview.md/#depth-query-parameter) for more information.
155
+
309
156
  ## UI, GraphQL, and REST API Filter Changes
310
157
 
158
+ ### Removed Changelog URL from View Context
159
+
160
+ `changelog_url` is no longer provided in the `ObjectView` context. To get a model instance's changelog URL, you can retrieve it from the instance itself if it supports it: `model_instance.get_changelog_url()`.
161
+
311
162
  ### Renamed Filter Fields
312
163
 
313
- | Model | Renamed Filter Field | New Name | UI and Rest API endpoints Available in v2.X |
314
- |-------------------------|---------------------------|----------------------------------|---------------------------------------------------------------------------|
315
- | Cable | `tag` | `tags` | `/dcim/cables/?tags=<uuid/slug>` |
316
- | Circuit | `tag` | `tags` | `/circuits/circuits/?tags=<uuid/slug>` |
317
- | | `type` | `circuit_type` | `/circuits/circuits/?circuit_type=<uuid/slug>` |
318
- | Cluster | `tag` | `tags` | `/virtualization/clusters/?tags=<uuid/slug>` |
319
- | ConsolePort | `cabled` | `has_cable` | `/dcim/console-ports/?has_cable=True/False` |
320
- | ConsoleServerPort | `cabled` | `has_cable` | `/dcim/console-server-ports/?has_cable=True/False` |
321
- | CustomFieldChoice | `field` | `custom_field` | `/extras/custom-field-choices/?custom_field=<uuid/key>` |
322
- | Device | `cluster_id` | `cluster` | `/dcim/devices/?cluster=<uuid/slug>` |
323
- | | `device_type_id` | `device_type` | `/dcim/devices/?device_type=<uuid/slug>` |
324
- | | `local_context_data` | `local_config_context_data` | `/dcim/devices/?local_config_context_data=True/False` |
325
- | | `local_context_schema_id` | `local_config_context_schema_id` | `/dcim/devices/?local_config_context_schema_id=<uuid>` |
326
- | | `local_context_schema` | `local_config_context_schema` | `/dcim/devices/?local_config_context_schema=<slug>` |
327
- | | `rack_group_id` | `rack_group` | `/dcim/devices/?rack_group=<uuid/slug>` |
328
- | | `rack_id` | `rack` | `/dcim/devices/?rack=<uuid/slug>` |
329
- | | `tag` | `tags` | `/dcim/devices/?tags=<uuid/slug>` |
330
- | | `virtual_chassis_id` | `virtual_chassis` | `/dcim/devices/?virtual_chassis=<uuid/slug>` |
331
- | DeviceBay | `tag` | `tags` | `/dcim/device-bays/?tags=<uuid/slug>` |
332
- | DeviceRedundancyGroup | `tag` | `tags` | `/dcim/device-redundancy-groups/?tag=<uuid/slug>` |
333
- | DeviceType | `has_instances` | `has_devices` | `/dcim/device-types/?has_devices=True/False` |
334
- | | `instances` | `devices` | `/dcim/device-types/?devices=<uuid>` |
335
- | | `tag` | `tags` | `/dcim/device-types/?tags=<uuid/slug>` |
336
- | FrontPort | `cabled` | `has_cable` | `/dcim/front-ports/?has_cable=True/False` |
337
- | | `tag` | `tags` | `/dcim/front-ports/?tags=<uuid/slug>` |
338
- | GitRepository | `tag` | `tags` | `/extras/git-repositories/?tags=<uuid/slug>` |
339
- | Interface | `cabled` | `has_cable` | `/dcim/interfaces/?has_cable=True/False` |
340
- | InventoryItem | `child_items` | `children` | `/dcim/inventory-items/?children=<uuid/name>` |
341
- | | `has_child_items` | `has_children` | `/dcim/inventory-items/?has_children=True/False` |
342
- | | `tag` | `tags` | `/dcim/inventory-items/?tags=<uuid/slug>` |
343
- | IPAddress | `tag` | `tags` | `/ipam/ip-addresses/?tags=<uuid/slug>` |
344
- | Job | `tag` | `tags` | `/extras/jobs/?tags=<uuid/slug>` |
345
- | Location | `tag` | `tags` | `/dcim/locations/?tags=uuid/slug>` |
346
- | ObjectPermission | `group` | `groups` | `/users/permissions/?groups=<slug>` |
347
- | | `group_id` | `groups_id` | `/users/permissions/?groups_id=<id>` |
348
- | | `user` | `users` | `/users/permissions/?users=<uuid/username>` |
349
- | PowerFeed | `cabled` | `has_cable` | `/dcim/power-feeds/?has_cable=True/False` |
350
- | | `tag` | `tags` | `/dcim/power-feeds/?tags=<uuid/slug>` |
351
- | PowerOutlet | `cabled` | `has_cable` | `/dcim/power-outlets/?has_cable=True/False` |
352
- | PowerPanel | `tag` | `tags` | `/dcim/power-panels/?tags=<uuid/slug>` |
353
- | PowerPort | `cabled` | `has_cable` | `/dcim/power-ports/?has_cable=True/False` |
354
- | Prefix | `is_pool` | `type` | `/ipam/prefixes/?type=<container/network/pool>` |
355
- | | `tag` | `tags` | `/ipam/prefixes/?tags=<uuid/slug>` |
356
- | Provider | `tag` | `tags` | `/circuits/provider/?tags=<uuid/slug>` |
357
- | ProviderNetwork | `tag` | `tags` | `/circuits/provider-networks/?tags=<uuid/slug>` |
358
- | Rack | `group` | `rack_group` | `/dcim/racks/?rack_group=<uuid/slug>` |
359
- | | `has_reservations` | `has_rack_reservations` | `/dcim/racks/?has_rack_reservations=True/False` |
360
- | | `reservations` | `rack_reservations` | `/dcim/racks/?rack_reservations=<uuid>` |
361
- | | `tag` | `tags` | `/dcim/racks/?tags=<uuid/slug>` |
362
- | RackReservation | `group` | `rack_group` | `/dcim/rack-reservations/?rack_group=<uuid/slug>` |
363
- | | `tag` | `tags` | `/dcim/rack-reservations/?tags=<uuid/slug>` |
364
- | RearPort | `cabled` | `has_cable` | `/dcim/rear-ports/?has_cable=True/False` |
365
- | | `tag` | `tags` | `/dcim/rear-ports/?tags=<uuid/slug>` |
366
- | RouteTarget | `tag` | `tags` | `/ipam/route-targets/?tags=<uuid/slug>` |
367
- | SecretsGroupAssociation | `group` | `secrets_group` | `/extras/secrets-groups-associations/?secrets_group=<uuid/slug>` |
368
- | Service | `tag` | `tags` | `/ipam/services/?tags=<uuid/slug>` |
369
- | Site | `tag` | `tags` | `/dcim/sites/?tags=<uuid/slug>` |
370
- | Tenant | `tag` | `tags` | `/tenancy/tenants/?tags=<uuid/slug>` |
371
- | User | `changes` | `object_changes` | `/users/users/?object_changes=<id>` |
372
- | | `has_changes` | `has_object_changes` | `/users/users/?has_object_changes=True/False` |
373
- | | `group` | `groups` | `/users/users/?groups=<slug>` |
374
- | | `group_id` | `groups_id` | `/users/users/?groups_id=<id>` |
375
- | VirtualMachine | `local_context_data` | `local_config_context_data` | `/virtualization/virtual-machines/?local_config_context_data=True/False` |
376
- | | `local_context_schema_id` | `local_config_context_schema_id` | `/virtualization/virtual-machines/?local_config_context_schema_id=<uuid>` |
377
- | | `local_context_schema` | `local_config_context_schema` | `/virtualization/virtual-machines/?local_config_context_schema=<slug>` |
378
- | | `tag` | `tags` | `/virtualization/virtual-machines/?tags=<uuid/slug>` |
379
- | VLAN | `tag` | `tags` | `/ipam/vlans/?tags=<uuid/slug>` |
380
- | VMInterface | `tag` | `tags` | `/virtualization/interfaces/?tags=<uuid/slug>` |
381
- | VRF | `tag` | `tags` | `/ipam/vrfs/?tags=<uuid/slug>` |
164
+ Most renamed filter fields in Nautobot 2.0 fall into the following general categories:
165
+
166
+ 1. The `tag` filter is renamed to `tags` on all models supporting Tags.
167
+ 2. Renames to match renamed model/serializer fields as described earlier in this document.
168
+ 3. Related membership filters are renamed to `has_<related>` throughout, for example `ConsolePort.cabled` is renamed to `ConsolePort.has_cable`.
169
+ 4. Most `<related>_id` filters have been merged into the corresponding `<related>` filter (see ["Enhanced Filter Fields"](#enhanced-filter-fields) below).
170
+
171
+ ??? info "Full table of renamed filter fields"
172
+ {data-table installation/tables/v2-filters-renamed-fields.yaml}
382
173
 
383
174
  ### Enhanced Filter Fields
384
175
 
385
- Below is a table documenting [enhanced filter field changes](../release-notes/version-2.0.md#enhanced-filter-fields-2804) in v2.x.
386
-
387
- | Model | Enhanced Filter Field | Changes | UI and Rest API endpoints Available in v2.X |
388
- |-------------------|------------------------|------------------------------------------------------------|-----------------------------------------------------------|
389
- | (all) | `created[__(gte/lte)]` | Now can filter on multiple values; now supports date-times | `?created__gte=2023-02-14%2012:00:00` |
390
- | Circuit | `circuit_type` | Enhanced to support primary key UUIDs in addition to slugs | `/circuits/circuits/?circuit_type=<uuid/slug>` |
391
- | | `provider` | Enhanced to support primary key UUIDs in addition to slugs | `/circuits/circuits/?provider=<uuid/slug>` |
392
- | | `site` | Enhanced to support primary key UUIDs in addition to slugs | `/circuits/circuits/?site=<uuid/slug>` |
393
- | ConsolePort | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/console-ports/?device=<uuid/name>` |
394
- | ConsoleServerPort | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/console-server-ports/?device=<uuid/name>` |
395
- | Device | `cluster_id` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?cluster=<uuid/slug>` |
396
- | | `device_type_id` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?device_type=<uuid/slug>` |
397
- | | `manufacturer` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?manufacturer=<uuid/slug>` |
398
- | | `model` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?model=<uuid/slug>` |
399
- | | `platform` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?platform=<uuid/slug>` |
400
- | | `role` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?role=<uuid/slug>` |
401
- | | `rack_id` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?rack=<uuid/slug>` |
402
- | | `rack_group_id` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?rack_group=<uuid/slug>` |
403
- | | `serial` | Enhanced to permit filtering on multiple values | `/dcim/devices/?serial=<value>&serial=<value>...` |
404
- | | `secrets_group` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?secrets_group=<uuid/slug>` |
405
- | | `site` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?site=<uuid/slug>` |
406
- | | `virtual_chassis_id` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/devices/?virtual_chassis=<uuid/slug>` |
407
- | DeviceBay | `cable` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/regions/?parent=<uuid/slug>` |
408
- | | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/device-bays/?device=<uuid/name>` |
409
- | DeviceType | `manufacturer` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/device-types/?manufacturer=<uuid/slug>` |
410
- | FrontPort | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/front-ports/?device=<uuid/name>` |
411
- | Interface | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/interfaces/?device=<uuid/name>` |
412
- | InventoryItem | `device` | Enhanced to support primary key UUIDs in addition to name | `/dcim/inventory-items/?device=<uuid/name>` |
413
- | | `manufacturer` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/inventory-items/?manufacturer=<uuid/slug>` |
414
- | | `serial` | Enhanced to permit filtering on multiple values | `/dcim/inventory-items/?serial=<value>&serial=<value>...` |
415
- | | `site` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/inventory-items/?site=<uuid/slug>` |
416
- | Platform | `manufacturer` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/platforms/?manufacturer=<uuid/slug>` |
417
- | PowerFeed | `site` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/power-feeds/?site=<uuid/slug>` |
418
- | PowerOutlet | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/power-outlets/?device=<uuid/name>` |
419
- | PowerPort | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/power-ports/?device=<uuid/name>` |
420
- | Provider | `site` | Enhanced to support primary key UUIDs in addition to slugs | `/circuits/providers/?site=<uuid/slug>` |
421
- | ProviderNetwork | `provider` | Enhanced to support primary key UUIDs in addition to slugs | `/circuits/provider-networks/?provider=<uuid/slug>` |
422
- | Rack | `role` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/racks/?role=<uuid/slug>` |
423
- | | `serial` | Enhanced to permit filtering on multiple values | `/dcim/racks/?serial=<value>&serial=<value>...` |
424
- | RackGroup | `parent` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/rack-groups/?parent=<uuid/slug>` |
425
- | RackReservation | `user` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/rack-reservations/?user=<uuid/slug>` |
426
- | RearPort | `device` | Enhanced to support primary key UUIDs in addition to names | `/dcim/rear-ports/?device=<uuid/name>` |
427
- | Region | `parent` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/regions/?parent=<uuid/slug>` |
428
- | Tenant | `tenant_group` | Enhanced to support primary key UUIDs in addition to slugs | `/tenancy/tenants/?tenant_group=<uuid/slug>` |
429
- | VirtualChassis | `master` | Enhanced to support primary key UUIDs in addition to name | `/dcim/virtual-chassis/?master=<uuid/name>` |
430
- | | `site` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/virtual-chassis/?site=<uuid/slug>` |
431
- | | `tenant` | Enhanced to support primary key UUIDs in addition to slugs | `/dcim/virtual-chassis/?tenant=<uuid/slug>` |
432
- | VLAN | `available_on_device` | Enhanced to permit filtering on multiple values | `/ipam/vlans/?available_on_device=<uuid>&...` |
433
- | | `vlan_group` | Enhanced to support primary key UUIDs in addition to slugs | `/ipam/vlans/?vlan_group=<uuid/slug>` |
176
+ Below is a table documenting [enhanced filter field changes](../release-notes/version-2.0.md#enhanced-filter-fields-2804) in Nautobot 2.0. These enhancements mostly fall into the following general categories:
177
+
178
+ 1. Many filters are enhanced to permit filtering by UUID _or_ by name.
179
+ 2. Filters that previously only supported a single filter value can now filter on multiple values.
180
+
181
+ ??? info "Full table of enhanced filter fields"
182
+ {data-table installation/tables/v2-filters-enhanced-fields.yaml}
434
183
 
435
184
  ### Corrected Filter Fields
436
185
 
437
- Below is a table documenting [corrected filter field changes](../release-notes/version-2.0.md#corrected-filter-fields-2804) in v2.x.
186
+ Below is a table documenting [corrected filter field changes](../release-notes/version-2.0.md#corrected-filter-fields-2804) in Nautobot 2.0. These corrections mostly involve filters that previously permitted filtering on related membership only (`/api/dcim/devices/?console_ports=True`) and have now been corrected into filters for related membership (`/api/dcim/devices/?has_console_ports=True`) as well as by actual related objects (`/api/dcim/devices/?console_ports=<UUID>`).
438
187
 
439
- | Model | Changed Filter Field | Before | After |
440
- |-------------------------|------------------------|---------------------------------------------------------|-----------------------------------------------------------------------------------------|
441
- | CustomFieldChoice | `custom_field` | `/extras/custom-field-choices/?custom_field=<uuid/name>`| `/extras/custom-field-choices/?custom_field=<uuid/key>` |
442
- | Device | `console_ports` | `/dcim/devices/?console_ports=True` | `/dcim/devices/?console_ports=<uuid>` or `?has_console_ports=<True/False>` |
443
- | | `console_server_ports` | `/dcim/devices/?console_server_ports=True` | `/dcim/devices/?console_server_ports=<uuid>` or `?has_console_server_ports=<True/False>`|
444
- | | `device_bays` | `/dcim/devices/?device_bays=True` | `/dcim/devices/?device_bays=<uuid>` or `?has_device_bays=<True/False>` |
445
- | | `front_ports` | `/dcim/devices/?front_ports=True` | `/dcim/devices/?front_ports=<uuid>` or `?has_front_ports=<True/False>` |
446
- | | `interfaces` | `/dcim/devices/?interfaces=True` | `/dcim/devices/?interfaces=<uuid>` or `?has_interfaces=<True/False>` |
447
- | | `power_ports` | `/dcim/devices/?power_ports=True` | `/dcim/devices/?power_ports=<uuid>` or `?has_power_ports=<True/False>` |
448
- | | `power_outlets` | `/dcim/devices/?power_outlets=True` | `/dcim/devices/?power_outlets=<uuid>` or `?has_power_outlets=<True/False>` |
449
- | | `rear_ports` | `/dcim/devices/?rear_ports=True` | `/dcim/devices/?rear_ports=<uuid>` or `?has_rear_ports=<True/False>` |
188
+ ??? info "Full table of corrected filter fields"
189
+ {data-table installation/tables/v2-filters-corrected-fields.yaml}
450
190
 
451
191
  ### Removed Filter Fields
452
192
 
453
193
  Below is a table documenting [removed filter field changes](../release-notes/version-2.0.md#removed-filter-fields-2804) in v2.x.
454
- Unless stated otherwise, all of the `*_id=<uuid>` filters have been replaced by generic filters that support both uuid and slug.
455
- For example `/circuits/circuits/?provider_id=<uuid>` has been replaced by `/circuits/circuits/?provider=<uuid>`.
456
-
457
- In addition, `region_id`/`region` and `site_id`/`site` are all being removed because `Region` and `Site` Models are being collapsed into `Location` Model.
458
- Their filters are also being replaced by `?location=<uuid/slug>`. For example `/dcim/devices/?site=ams-01` is replaced by `/dcim/devices/?location=ams-01`.
459
-
460
- | Model | Removed Filter Field | UI and API endpoints that are no longer supported in v2.X |
461
- |-------------------------|-----------------------|-----------------------------------------------------------------------------------------------|
462
- | Aggregate | `tenant_group_id` | |
463
- | Circuit | `provider_id` | |
464
- | | `provider_network_id` | |
465
- | | `region` | |
466
- | | `region_id` | |
467
- | | `site` | |
468
- | | `site_id` | |
469
- | | `tenant_group_id` | |
470
- | | `type_id` | instead of `/circuits/circuits/?type_id=<uuid>`, use `circuit_type=<uuid>` |
471
- | CircuitTermination | `circuit_id` | |
472
- | | `provider_network_id` | |
473
- | | `region_id` | |
474
- | | `region` | |
475
- | | `site` | |
476
- | | `site_id` | |
477
- | Cluster | `region` | |
478
- | | `region_id` | |
479
- | | `site` | |
480
- | | `site_id` | |
481
- | | `tenant_group_id` | |
482
- | ConfigContext | `region` | |
483
- | | `region_id` | |
484
- | | `role_id` | |
485
- | | `site` | |
486
- | | `site_id` | |
487
- | ConsolePort | `device_id` | |
488
- | | `region` | |
489
- | | `region_id` | |
490
- | | `site` | |
491
- | | `site_id` | |
492
- | ConsoleServerPort | `device_id` | |
493
- | | `region` | |
494
- | | `region_id` | |
495
- | | `site` | |
496
- | | `site_id` | |
497
- | CustomFieldChoice | `field_id` | instead of `/extras/custom-field-choices/?field_id=<uuid>`, use `custom_field=<uuid>` |
498
- | Device | `manufacturer_id` | |
499
- | | `model` | instead of `/dcim/devices/?model=<uuid>`, use `device_type=<uuid>` |
500
- | | `pass_through_ports` | instead of `/dcim/devices/?pass_through_ports=<bool>`, use `has_front_ports`/`has_rear_ports` |
501
- | | `platform_id` | |
502
- | | `region` | |
503
- | | `region_id` | |
504
- | | `role_id` | |
505
- | | `secrets_group_id` | |
506
- | | `site` | |
507
- | | `site_id` | |
508
- | | `tenant_group_id` | |
509
- | DeviceBay | `device_id` | |
510
- | | `region` | |
511
- | | `region_id` | |
512
- | | `site` | |
513
- | | `site_id` | |
514
- | DeviceType | `manufacturer_id` | |
515
- | FrontPort | `device_id` | |
516
- | | `region` | |
517
- | | `region_id` | |
518
- | | `site` | |
519
- | | `site_id` | |
520
- | Interface | `bridge_id` | |
521
- | | `device_id` | |
522
- | | `lag_id` | |
523
- | | `parent_interface_id` | |
524
- | | `region` | |
525
- | | `region_id` | |
526
- | | `site` | |
527
- | | `site_id` | |
528
- | InventoryItem | `device_id` | |
529
- | | `manufacturer_id` | |
530
- | | `parent_id` | |
531
- | | `region` | |
532
- | | `region_id` | |
533
- | | `site` | |
534
- | | `site_id` | |
535
- | IPAddress | `tenant_group_id` | |
536
- | Location | `tenant_group_id` | |
537
- | | `region` | |
538
- | | `region_id` | |
539
- | | `site` | |
540
- | | `site_id` | |
541
- | Provider | `region` | |
542
- | ObjectPermission | `user_id` | instead of `/users/permissions/?user_id=<uuid>`, use `users=<uuid>` |
543
- | | `region_id` | |
544
- | | `site` | |
545
- | | `site_id` | |
546
- | ProviderNetwork | `provider_id` | |
547
- | Rack | `group_id` | |
548
- | | `region` | |
549
- | | `region_id` | |
550
- | | `role_id` | |
551
- | | `site` | |
552
- | | `site_id` | |
553
- | | `tenant_group_id` | |
554
- | RackGroup | `parent_id` | |
555
- | | `region` | |
556
- | | `region_id` | |
557
- | | `site` | |
558
- | | `site_id` | |
559
- | RackReservation | `group_id` | |
560
- | | `rack_id` | |
561
- | | `site` | |
562
- | | `site_id` | |
563
- | | `tenant_group_id` | |
564
- | | `user_id` | |
565
- | RearPort | `device_id` | |
566
- | | `region` | |
567
- | | `region_id` | |
568
- | | `site` | |
569
- | | `site_id` | |
570
- | Region | `parent_id` | |
571
- | RouteTarget | `tenant_group_id` | |
572
- | Platform | `manufacturer_id` | |
573
- | PowerOutlet | `device_id` | |
574
- | | `region` | |
575
- | | `region_id` | |
576
- | | `site` | |
577
- | | `site_id` | |
578
- | PowerFeed | `power_panel_id` | |
579
- | | `rack_id` | |
580
- | | `region` | |
581
- | | `region_id` | |
582
- | | `site` | |
583
- | | `site_id` | |
584
- | PowerPanel | `rack_group_id` | |
585
- | | `region` | |
586
- | | `region_id` | |
587
- | | `site` | |
588
- | | `site_id` | |
589
- | PowerPort | `device_id` | |
590
- | | `region` | |
591
- | | `region_id` | |
592
- | | `site` | |
593
- | | `site_id` | |
594
- | Prefix | `region` | |
595
- | | `region_id` | |
596
- | | `site` | |
597
- | | `site_id` | |
598
- | | `tenant_group_id` | |
599
- | SecretsGroupAssociation | `group_id` | instead of `/extras/secrets-groups-associations/?group_id=<uuid>`, use `secrets_group=<uuid>` |
600
- | Site | `region` | |
601
- | | `region_id` | |
602
- | | `tenant_group_id` | |
603
- | Tenant | `aggregates` | |
604
- | | `group_id` | |
605
- | | `has_aggregates` | |
606
- | | `has_sites` | |
607
- | | `sites` | |
608
- | TenantGroup | `parent_id` | |
609
- | VirtualChassis | `master_id` | |
610
- | | `region` | |
611
- | | `region_id` | |
612
- | | `site` | |
613
- | | `site_id` | |
614
- | | `tenant_id` | |
615
- | VirtualMachine | `tenant_group_id` | |
616
- | VLANGroup | `region` | |
617
- | | `region_id` | |
618
- | | `site` | |
619
- | | `site_id` | |
620
- | VLAN | `group_id` | |
621
- | | `group` | instead of `/ipam/vlans/?group=<slug>`, use `vlan_group=<slug>` |
622
- | | `region` | |
623
- | | `region_id` | |
624
- | | `site` | |
625
- | | `site_id` | |
626
- | | `tenant_group_id` | |
627
- | VMInterface | `bridge_id` | |
628
- | | `parent_interface_id` | |
629
- | VRF | `tenant_group_id` | |
194
+ Most removed database fields in Nautobot 2.0 fall into the following general categories:
195
+
196
+ 1. Removal of `*_id=<uuid>` filters as they have have been merged into filters that support both uuid and name/slug (for example, instead of `/api/circuits/circuits/?provider_id=<UUID>`, use `/api/circuits/circuits/?provider=<uuid>`).
197
+ 2. Removal of filtering on removed models such as `Region` and `Site`. (Use `location` filters instead.)
198
+ 3. Removal of `slug` filters from models that no longer have a `slug` field.
199
+
200
+ ??? info "Full table of removed filter fields"
201
+ {data-table installation/tables/v2-filters-removed-fields.yaml}
630
202
 
631
203
  ## Python Code Location Changes
632
204
 
633
- The below is mostly relevant only to authors of Jobs and Nautobot Apps. End users should not be impacted by the changes in this section.
634
-
635
- | Old Module | Class/Function(s) | New Module |
636
- |--------------------------------------|-------------------------------------------------------------|----------------------------------------|
637
- | `nautobot.core.api.utils` | `TreeModelSerializerMixin` | `nautobot.core.api.serializers` |
638
- | `nautobot.core.fields` | `*` | `nautobot.core.models.fields` |
639
- | `nautobot.core.forms` | `SearchForm` | `nautobot.core.forms.search` |
640
- | `nautobot.core.utilities` | `*` | `nautobot.core.views.utils` |
641
- | `nautobot.dcim.fields` | `MACAddressCharField` | `nautobot.core.models.fields` |
642
- | `nautobot.dcim.forms` | `MACAddressField` | `nautobot.core.forms` |
643
- | `nautobot.utilities.api` | `*` | `nautobot.core.api.utils` |
644
- | `nautobot.utilities.apps` | `*` | `nautobot.core.apps` |
645
- | `nautobot.utilities.checks` | `*` | `nautobot.core.checks` |
646
- | `nautobot.utilities.choices` | `*` | `nautobot.core.choices` |
647
- | `nautobot.utilities.config` | `*` | `nautobot.core.utils.config` |
648
- | `nautobot.utilities.constants` | `*` | `nautobot.core.constants` |
649
- | `nautobot.utilities.deprecation` | `*` | `nautobot.core.utils.deprecation` |
650
- | `nautobot.utilities.error_handlers` | `*` | `nautobot.core.views.utils` |
651
- | `nautobot.utilities.exceptions` | `*` | `nautobot.core.exceptions` |
652
- | `nautobot.utilities.factory` | `*` | `nautobot.core.factory` |
653
- | `nautobot.utilities.fields` | `*` | `nautobot.core.models.fields` |
654
- | `nautobot.utilities.filters` | `*` | `nautobot.core.filters` |
655
- | `nautobot.utilities.forms` | `*` | `nautobot.core.forms` |
656
- | `nautobot.utilities.git` | `*` | `nautobot.core.utils.git` |
657
- | `nautobot.utilities.logging` | `*` | `nautobot.core.utils.logging` |
658
- | `nautobot.utilities.management` | `*` | `nautobot.core.management` |
659
- | `nautobot.utilities.ordering` | `*` | `nautobot.core.utils.ordering` |
660
- | `nautobot.utilities.paginator` | `*` | `nautobot.core.views.paginator` |
661
- | `nautobot.utilities.permissions` | `*` | `nautobot.core.utils.permissions` |
662
- | `nautobot.utilities.query_functions` | `*` | `nautobot.core.models.query_functions` |
663
- | `nautobot.utilities.querysets` | `*` | `nautobot.core.models.querysets` |
664
- | `nautobot.utilities.tables` | `*` | `nautobot.core.tables` |
665
- | `nautobot.utilities.tasks` | `*` | `nautobot.core.tasks` |
666
- | `nautobot.utilities.templatetags` | `*` | `nautobot.core.templatetags` |
667
- | `nautobot.utilities.testing` | `*` | `nautobot.core.testing` |
668
- | `nautobot.utilities.tree_queries` | `*` | `nautobot.core.models.tree_queries` |
669
- | `nautobot.utilities.utils` | `array_to_string` | `nautobot.core.models.utils` |
670
- | | `convert_querydict_to_factory_formset_acceptable_querydict` | `nautobot.core.utils.requests` |
671
- | | `copy_safe_request` | `nautobot.core.utils.requests` |
672
- | | `count_related` | `nautobot.core.models.querysets` |
673
- | | `csv_format` | `nautobot.core.views.utils` |
674
- | | `deepmerge` | `nautobot.core.utils.data` |
675
- | | `dict_to_filter_params` | `nautobot.core.api.utils` |
676
- | | `dynamic_import` | `nautobot.core.api.utils` |
677
- | | `ensure_content_type_and_field_name_inquery_params` | `nautobot.core.utils.requests` |
678
- | | `flatten_dict` | `nautobot.core.utils.data` |
679
- | | `flatten_iterable` | `nautobot.core.utils.data` |
680
- | | `foreground_color` | `nautobot.core.utils.color` |
681
- | | `get_all_lookup_expr_for_field` | `nautobot.core.utils.filtering` |
682
- | | `get_api_version_serializer` | `nautobot.core.api.utils` |
683
- | | `get_changes_for_model` | `nautobot.core.utils.lookup` |
684
- | | `get_filterset_field` | `nautobot.core.utils.filtering` |
685
- | | `get_filterset_for_model` | `nautobot.core.utils.lookup` |
686
- | | `get_filterable_params_from_filter_params` | `nautobot.core.utils.requests` |
687
- | | `get_form_for_model` | `nautobot.core.utils.lookup` |
688
- | | `get_model_from_name` | `nautobot.core.utils.lookup` |
689
- | | `get_related_class_for_model` | `nautobot.core.utils.lookup` |
690
- | | `get_route_for_model` | `nautobot.core.utils.lookup` |
691
- | | `get_table_for_model` | `nautobot.core.utils.lookup` |
692
- | | `hex_to_rgb` | `nautobot.core.utils.color` |
693
- | | `is_taggable` | `nautobot.core.models.utils` |
694
- | | `is_uuid` | `nautobot.core.utils.data` |
695
- | | `lighten_color` | `nautobot.core.utils.color` |
696
- | | `normalize_querydict` | `nautobot.core.utils.requests` |
697
- | | `prepare_cloned_fields` | `nautobot.core.views.utils` |
698
- | | `pretty_print_query` | `nautobot.core.models.utils` |
699
- | | `render_jinja2` | `nautobot.core.utils.data` |
700
- | | `rgb_to_hex` | `nautobot.core.utils.color` |
701
- | | `SerializerForAPIVersions` | `nautobot.core.api.utils` |
702
- | | `serialize_object` | `nautobot.core.models.utils` |
703
- | | `serialize_object_v2` | `nautobot.core.models.utils` |
704
- | | `shallow_compare_dict` | `nautobot.core.utils.data` |
705
- | | `slugify_dots_to_dashes` | `nautobot.core.models.fields` |
706
- | | `slugify_dashes_to_underscores` | `nautobot.core.models.fields` |
707
- | | `to_meters` | `nautobot.core.utils.data` |
708
- | | `UtilizationData` | `nautobot.core.utils.data` |
709
- | | `versioned_serializer_selector` | `nautobot.core.api.utils` |
710
- | `nautobot.utilities.validators` | `*` | `nautobot.core.models.validators` |
711
- | `nautobot.utilities.views` | `*` | `nautobot.core.views.mixins` |
205
+ The below is mostly relevant only to authors of Jobs and Nautobot Apps. End users should not be impacted by the changes in this section. Most changes in code location arise from the merging of the `nautobot.utilities` module into the `nautobot.core` module.
206
+
207
+ ??? info "Full table of code location changes"
208
+ {data-table installation/tables/v2-code-location-changes.yaml}
209
+
210
+ ## Removed Python Code
211
+
212
+ - Because of the replacement of the `?brief` REST API query parameter with `?depth` and the removal of all `Nested*Serializers`, some of the classes and mixins are removed because they are no longer needed.
213
+ - In the redesigned UI of Nautobot 2.0, menu items may no longer contain buttons, and so the `NavMenuButton` class and its subclasses have been removed as they are no longer needed/supported.
214
+ - With the reimplementation of CSV import and export, `CSVForm` classes are generally no longer needed, and so a number of mixins have been removed.
215
+
216
+ ??? info "Full table of code removals"
217
+ {data-table installation/tables/v2-code-removals.yaml}
712
218
 
713
219
  ## Git Data Source Changes
714
220
 
715
221
  The Configuration Contexts Metadata key `schema` has been replaced with `config_context_schema`. This means that any `schema` references in your git repository's data must be updated to reflect this change.
716
222
 
223
+ `GitRepository` sync operations are now Jobs. As a result, when creating a new `GitRepository` it **is not automatically synchronized**. A `GitRepository.sync()` method has been implemented that will execute the sync job on a worker and return the `JobResult` for the operation. This method takes `dry_run` and `user` arguments. The `dry_run` argument defaults to `False`; if set to `True` will cause the sync to dry-run. The `user` argument is required if a sync is performed.
224
+
225
+ Additionally, the `GitRepository.save()` method no longer takes a `trigger_resync=<True|False>` argument as it is no longer required. The act of creating a new `GitRepository` no longer has side effects.
226
+
227
+ Below is a table documenting changes in names for Git-related Jobs. There should NOT be a need to ever manually execute the jobs due to the addition of `GitRepository.sync()`, but this is being provided for clarity.
228
+
229
+ | Old Job Location | New Job Location |
230
+ |------------------------------------------------------------------------|------------------------------------------|
231
+ | `nautobot.extras.datasources.git.pull_git_repository_and_refresh_data` | `nautobot.core.jobs.GitRepositorySync` |
232
+ | `nautobot.extras.datasources.git.git_repository_diff_origin_and_local` | `nautobot.core.jobs.GitRepositoryDryRun` |
233
+
717
234
  ## Logging Changes
718
235
 
719
- Where applicable, `logging.getLogger("module_name")` is replaced with `logging.getLogger(__name__)` or `logging.getLogger(__name__ + ".MyFeature")`.
236
+ Where applicable, `logging.getLogger("some_arbitrary_name")` is replaced with `logging.getLogger(__name__)` or `logging.getLogger(__name__ + ".SpecificFeature")`.
720
237
 
721
238
  Below is a table documenting changes in logger names that could potentially affect existing deployments with expectations around specific logger names used for specific purposes.
722
239
 
723
- | Old Logger Name | New Logger Name |
724
- |------------------------------------------|-------------------------------------------------------|
725
- | `nautobot.authentication` | `nautobot.core.authentication` |
726
- | `nautobot.datasources.git` | `nautobot.extras.datasources.git` |
727
- | `nautobot.datasources.utils` | `nautobot.extras.datasources.utils` |
728
- | `nautobot.dcim.cable` | `nautobot.dcim.signals.cable` |
729
- | `nautobot.graphql.generators` | `nautobot.core.graphql.generators` |
730
- | `nautobot.graphql.schema` | `nautobot.core.graphql.schema` |
731
- | `nautobot.jobs` | `nautobot.extras.jobs` |
732
- | `nautobot.jobs.*` | `nautobot.extras.jobs.*` |
733
- | `nautobot.releases` | `nautobot.core.releases` |
734
- | `nautobot.releases` | `nautobot.utilities.tasks` |
735
- | `nautobot.plugins` | `nautobot.extras.templatetags.plugins` |
736
- | `nautobot.plugins` | `nautobot.extras.plugins.utils` |
737
- | `nautobot.views.ObjectEditView` | `nautobot.core.views.generic.ObjectEditView` |
738
- | `nautobot.views.ObjectDeleteView` | `nautobot.core.views.generic.ObjectDeleteView` |
739
- | `nautobot.views.BulkCreateView` | `nautobot.core.views.generic.BulkCreateView` |
740
- | `nautobot.views.ObjectImportView` | `nautobot.core.views.generic.ObjectImportView` |
741
- | `nautobot.views.BulkImportView` | `nautobot.core.views.generic.BulkImportView` |
742
- | `nautobot.views.BulkEditView` | `nautobot.core.views.generic.BulkEditView` |
743
- | `nautobot.views.BulkRenameView` | `nautobot.core.views.generic.BulkRenameView` |
744
- | `nautobot.views.BulkDeleteView` | `nautobot.core.views.generic.BulkDeleteView` |
745
- | `nautobot.views.ComponentCreateView` | `nautobot.core.views.generic.ComponentCreateView` |
746
- | `nautobot.views.BulkComponentCreateView` | `nautobot.core.views.generic.BulkComponentCreateView` |
240
+ ??? info "Full table of logger name changes"
241
+ {data-table installation/tables/v2-logging-renamed-loggers.yaml}
747
242
 
748
243
  ## Job Database Model Changes
749
244
 
@@ -762,7 +257,66 @@ The Job `name` field has been changed to a unique field and the `name` + `groupi
762
257
 
763
258
  These jobs would be named `Sample job` and `Sample job (2)`
764
259
 
765
- The Job `slug` has been updated to be derived from the `name` field instead of a combination of `job_source`, `git_repository`, and `job_class`.
260
+ The Job `slug`, `source` and `git_repository` fields have been removed. The Job `module_name` field will automatically be updated, for Jobs derived from a Git repository, from `<submodule_name>` to `<git_repository_slug>.jobs.<submodule_name>`. This also changes the secondary uniqueness constraint for Jobs to simply `[module_name, job_class_name]`.
261
+
262
+ The Job `class_path` attribute has been simplified correspondingly, to simply `<module>.<ClassName>` instead of the former `<source>/<module>/<ClassName>`. For example, the Nautobot Golden Config backup job's `class_path` will change from `plugins/nautobot_golden_config.jobs/BackupJob` to `nautobot_golden_config.jobs.BackupJob`.
263
+
264
+ The Job `commit_default` field has been renamed to `dryrun_default` and the default value has been changed from `True` to `False`. This change is a result of the fundamental job changes mentioned in the [Job Changes](#job-changes) section below.
265
+
266
+ ## JobResult Database Model Changes
267
+
268
+ The `JobResult` objects for which results from Job executions are stored are now automatically managed. Therefore job authors must never manipulate or `save()` these objects as they are now used internally for all state transitions and saving the objects yourself could interfere with and cause Job execution to fail or cause data loss.
269
+
270
+ Therefore all code that is calling `JobResult.set_status()` (which has been removed) or `JobResult.save()` must be removed.
271
+
272
+ ## Job Changes
273
+
274
+ ### Fundamental Changes
275
+
276
+ The `BaseJob` class is now a subclass of Celery's `Task` class. Some fundamental changes to the job's methods and signatures were required to support this change:
277
+
278
+ - The `test_*` and `post_run` methods for backwards compatibility to NetBox scripts and reports were removed. Celery implements `before_start`, `on_success`, `on_retry`, `on_failure`, and `after_return` methods that can be used by job authors to perform similar functions.
279
+
280
+ !!! important
281
+ Be sure to call the `super()` method when overloading any of the job's `before_start`, `on_success`, `on_retry`, `on_failure`, or `after_return` methods
282
+
283
+ - The run method signature is now customizable by the job author. This means that the `data` and `commit` arguments are no longer passed to the job by default and the job's run method signature should match the the job's input variables.
766
284
 
767
285
  !!! example
768
- The Nautobot Golden Config backup job's slug will change from `plugins-nautobot_golden_config-jobs-backupjob` to `backup-configurations`.
286
+ ```py
287
+ class ExampleJob(Job):
288
+ var1 = StringVar()
289
+ var2 = IntegerVar(required=True)
290
+ var3 = BooleanVar()
291
+ var4 = ObjectVar(model=Role)
292
+
293
+ def run(self, var1, var2, var3, var4):
294
+ ...
295
+ ```
296
+
297
+ ### Database Transactions
298
+
299
+ Nautobot no longer wraps the job `run` method in an atomic database transaction. As a result, jobs that need to roll back database changes will have to decorate the run method with `@transaction.atomic` or use the `with transaction.atomic()` context manager in the job code.
300
+
301
+ With the removal of the atomic transaction, the `commit` flag has been removed. The ability to bypass job approval on dryrun can be achieved by using an optional `dryrun` argument. Job authors who wish to allow users to bypass approval when the `dryrun` flag is set should set a `dryrun` attribute with a value of `DryRunVar()` on their job class. `DryRunVar` can be imported from `nautobot.extras.jobs`.
302
+
303
+ !!! example
304
+ ```py
305
+ from nautobot.extras.jobs import DryRunVar, Job
306
+
307
+ class ExampleJob(Job):
308
+ dryrun = DryRunVar()
309
+
310
+ def run(self, dryrun):
311
+ ...
312
+ ```
313
+
314
+ A new `supports_dryrun` field has been added to the `Job` model and `Job` class that returns true if the `Job` class implements the `dryrun = DryRunVar()` attribute. This is used to determine if jobs that require approval can be dry run without prior approval.
315
+
316
+ The `commit_default` job field has been renamed to `dryrun_default` and the default value has been changed from `True` to `False`.
317
+
318
+ !!! important
319
+ The `read_only` job field no longer changes the behavior of Nautobot core and is left to the job author to decide whether their job is read only.
320
+
321
+ !!! important
322
+ Nautobot no longer enforces any job behavior when dryrun is set. It is now the job author's responsibility to define and enforce the execution of a "dry run".