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
@@ -0,0 +1,4199 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+
10
+
11
+ <link rel="canonical" href="https://docs.nautobot.com/projects/core/en/stable/development/react-ui.html">
12
+
13
+
14
+
15
+ <link rel="icon" href="../assets/favicon.ico">
16
+ <meta name="generator" content="mkdocs-1.4.2, mkdocs-material-9.1.6">
17
+
18
+
19
+
20
+ <title>Building the React UI - Nautobot Documentation</title>
21
+
22
+
23
+
24
+ <link rel="stylesheet" href="../assets/stylesheets/main.ded33207.min.css">
25
+
26
+
27
+ <link rel="stylesheet" href="../assets/stylesheets/palette.a0c5b2b5.min.css">
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
38
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
39
+ <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
40
+
41
+
42
+
43
+ <link rel="stylesheet" href="../assets/_mkdocstrings.css">
44
+
45
+ <link rel="stylesheet" href="../assets/extra.css">
46
+
47
+ <script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
48
+
49
+
50
+
51
+
52
+
53
+
54
+ </head>
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="">
65
+
66
+
67
+
68
+ <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
69
+
70
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
71
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
72
+ <label class="md-overlay" for="__drawer"></label>
73
+ <div data-md-component="skip">
74
+
75
+
76
+ <a href="#building-the-react-ui" class="md-skip">
77
+ Skip to content
78
+ </a>
79
+
80
+ </div>
81
+ <div data-md-component="announce">
82
+
83
+ </div>
84
+
85
+
86
+
87
+
88
+
89
+
90
+ <header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
91
+ <nav class="md-header__inner md-grid" aria-label="Header">
92
+ <a href="../index.html" title="Nautobot Documentation" class="md-header__button md-logo" aria-label="Nautobot Documentation" data-md-component="logo">
93
+
94
+ <img src="../assets/nautobot_logo.svg" alt="logo">
95
+
96
+ </a>
97
+ <label class="md-header__button md-icon" for="__drawer">
98
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
99
+ </label>
100
+ <div class="md-header__title" data-md-component="header-title">
101
+ <div class="md-header__ellipsis">
102
+ <div class="md-header__topic">
103
+ <span class="md-ellipsis">
104
+ Nautobot Documentation
105
+ </span>
106
+ </div>
107
+ <div class="md-header__topic" data-md-component="header-topic">
108
+ <span class="md-ellipsis">
109
+
110
+ Building the React UI
111
+
112
+ </span>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <form class="md-header__option" data-md-component="palette">
118
+
119
+
120
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
121
+
122
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
123
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
124
+ </label>
125
+
126
+
127
+
128
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
129
+
130
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
131
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
132
+ </label>
133
+
134
+
135
+ </form>
136
+
137
+
138
+
139
+ <label class="md-header__button md-icon" for="__search">
140
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
141
+ </label>
142
+ <div class="md-search" data-md-component="search" role="dialog">
143
+ <label class="md-search__overlay" for="__search"></label>
144
+ <div class="md-search__inner" role="search">
145
+ <form class="md-search__form" name="search">
146
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
147
+ <label class="md-search__icon md-icon" for="__search">
148
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
149
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
150
+ </label>
151
+ <nav class="md-search__options" aria-label="Search">
152
+
153
+ <a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
154
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7 0-.24-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91 1.61 0 2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08Z"/></svg>
155
+ </a>
156
+
157
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
158
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
159
+ </button>
160
+ </nav>
161
+
162
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
163
+
164
+ </form>
165
+ <div class="md-search__output">
166
+ <div class="md-search__scrollwrap" data-md-scrollfix>
167
+ <div class="md-search-result" data-md-component="search-result">
168
+ <div class="md-search-result__meta">
169
+ Initializing search
170
+ </div>
171
+ <ol class="md-search-result__list" role="presentation"></ol>
172
+ </div>
173
+ </div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+
178
+
179
+ <div class="md-header__source">
180
+ <a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
181
+ <div class="md-source__icon md-icon">
182
+
183
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
184
+ </div>
185
+ <div class="md-source__repository">
186
+ GitHub
187
+ </div>
188
+ </a>
189
+ </div>
190
+
191
+ </nav>
192
+
193
+
194
+
195
+ <nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
196
+ <div class="md-grid">
197
+ <ul class="md-tabs__list">
198
+
199
+
200
+
201
+
202
+
203
+
204
+ <li class="md-tabs__item">
205
+ <a href="../index.html" class="md-tabs__link">
206
+ Overview
207
+ </a>
208
+ </li>
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+ <li class="md-tabs__item">
225
+ <a href="../installation/index.html" class="md-tabs__link">
226
+ Documentation
227
+ </a>
228
+ </li>
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+ <li class="md-tabs__item">
243
+ <a href="../plugins/development.html" class="md-tabs__link">
244
+ App Developer Guide
245
+ </a>
246
+ </li>
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+ <li class="md-tabs__item">
259
+ <a href="index.html" class="md-tabs__link">
260
+ Core Developer Guide
261
+ </a>
262
+ </li>
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ <li class="md-tabs__item">
275
+ <a href="../release-notes/index.html" class="md-tabs__link">
276
+ Release Notes
277
+ </a>
278
+ </li>
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+ <li class="md-tabs__item">
291
+ <a href="../apps/index.html" class="md-tabs__link">
292
+ Nautobot Apps
293
+ </a>
294
+ </li>
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+ <li class="md-tabs__item">
304
+ <a href="https://docs.nautobot.com/" class="md-tabs__link">
305
+ Nautobot Docs Home ↗︎
306
+ </a>
307
+ </li>
308
+
309
+
310
+ </ul>
311
+ </div>
312
+ </nav>
313
+
314
+
315
+ </header>
316
+
317
+ <div class="md-container" data-md-component="container">
318
+
319
+
320
+
321
+
322
+ <main class="md-main" data-md-component="main">
323
+ <div class="md-main__inner md-grid">
324
+
325
+
326
+
327
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
328
+ <div class="md-sidebar__scrollwrap">
329
+ <div class="md-sidebar__inner">
330
+
331
+
332
+
333
+
334
+
335
+ <nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
336
+ <label class="md-nav__title" for="__drawer">
337
+ <a href="../index.html" title="Nautobot Documentation" class="md-nav__button md-logo" aria-label="Nautobot Documentation" data-md-component="logo">
338
+
339
+ <img src="../assets/nautobot_logo.svg" alt="logo">
340
+
341
+ </a>
342
+ Nautobot Documentation
343
+ </label>
344
+
345
+ <div class="md-nav__source">
346
+ <a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
347
+ <div class="md-source__icon md-icon">
348
+
349
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg>
350
+ </div>
351
+ <div class="md-source__repository">
352
+ GitHub
353
+ </div>
354
+ </a>
355
+ </div>
356
+
357
+ <ul class="md-nav__list" data-md-scrollfix>
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+ <li class="md-nav__item">
367
+ <a href="../index.html" class="md-nav__link">
368
+ Overview
369
+ </a>
370
+ </li>
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+ <li class="md-nav__item md-nav__item--nested">
383
+
384
+
385
+
386
+
387
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
388
+
389
+
390
+
391
+ <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
392
+ Documentation
393
+ <span class="md-nav__icon md-icon"></span>
394
+ </label>
395
+
396
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
397
+ <label class="md-nav__title" for="__nav_2">
398
+ <span class="md-nav__icon md-icon"></span>
399
+ Documentation
400
+ </label>
401
+ <ul class="md-nav__list" data-md-scrollfix>
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+ <li class="md-nav__item md-nav__item--nested">
410
+
411
+
412
+
413
+
414
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_1" >
415
+
416
+
417
+
418
+ <label class="md-nav__link" for="__nav_2_1" id="__nav_2_1_label" tabindex="0">
419
+ Installation
420
+ <span class="md-nav__icon md-icon"></span>
421
+ </label>
422
+
423
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_1_label" aria-expanded="false">
424
+ <label class="md-nav__title" for="__nav_2_1">
425
+ <span class="md-nav__icon md-icon"></span>
426
+ Installation
427
+ </label>
428
+ <ul class="md-nav__list" data-md-scrollfix>
429
+
430
+
431
+
432
+
433
+
434
+
435
+ <li class="md-nav__item">
436
+ <a href="../installation/index.html" class="md-nav__link">
437
+ Installing Prerequisites
438
+ </a>
439
+ </li>
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+ <li class="md-nav__item">
450
+ <a href="../installation/nautobot.html" class="md-nav__link">
451
+ Installing Nautobot
452
+ </a>
453
+ </li>
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+ <li class="md-nav__item">
464
+ <a href="../installation/services.html" class="md-nav__link">
465
+ Deploying Nautobot Services
466
+ </a>
467
+ </li>
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+ <li class="md-nav__item">
478
+ <a href="../installation/http-server.html" class="md-nav__link">
479
+ Configuring an HTTP Server
480
+ </a>
481
+ </li>
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+
491
+ <li class="md-nav__item">
492
+ <a href="../installation/external-authentication.html" class="md-nav__link">
493
+ External Authentication (Optional)
494
+ </a>
495
+ </li>
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+ <li class="md-nav__item">
506
+ <a href="../docker/index.html" class="md-nav__link">
507
+ Nautobot Docker Images
508
+ </a>
509
+ </li>
510
+
511
+
512
+
513
+
514
+ </ul>
515
+ </nav>
516
+ </li>
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+ <li class="md-nav__item md-nav__item--nested">
528
+
529
+
530
+
531
+
532
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_2" >
533
+
534
+
535
+
536
+ <label class="md-nav__link" for="__nav_2_2" id="__nav_2_2_label" tabindex="0">
537
+ Migration
538
+ <span class="md-nav__icon md-icon"></span>
539
+ </label>
540
+
541
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
542
+ <label class="md-nav__title" for="__nav_2_2">
543
+ <span class="md-nav__icon md-icon"></span>
544
+ Migration
545
+ </label>
546
+ <ul class="md-nav__list" data-md-scrollfix>
547
+
548
+
549
+
550
+
551
+
552
+
553
+ <li class="md-nav__item">
554
+ <a href="../installation/migrating-from-netbox.html" class="md-nav__link">
555
+ Migrating from NetBox
556
+ </a>
557
+ </li>
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+ <li class="md-nav__item">
568
+ <a href="../installation/migrating-from-postgresql.html" class="md-nav__link">
569
+ Migrating from PostgreSQL to MySQL
570
+ </a>
571
+ </li>
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+
580
+
581
+ <li class="md-nav__item">
582
+ <a href="../installation/upgrading.html" class="md-nav__link">
583
+ Upgrading Nautobot
584
+ </a>
585
+ </li>
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+ <li class="md-nav__item">
596
+ <a href="../installation/upgrading-from-nautobot-v1.html" class="md-nav__link">
597
+ Upgrading Nautobot from v1.X to v2.0
598
+ </a>
599
+ </li>
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+ <li class="md-nav__item">
610
+ <a href="../installation/region-and-site-data-migration-guide.html" class="md-nav__link">
611
+ Migrating from Region and Site to Location
612
+ </a>
613
+ </li>
614
+
615
+
616
+
617
+
618
+ </ul>
619
+ </nav>
620
+ </li>
621
+
622
+
623
+
624
+
625
+
626
+
627
+
628
+
629
+
630
+
631
+ <li class="md-nav__item md-nav__item--nested">
632
+
633
+
634
+
635
+
636
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_3" >
637
+
638
+
639
+
640
+ <label class="md-nav__link" for="__nav_2_3" id="__nav_2_3_label" tabindex="0">
641
+ Configuration
642
+ <span class="md-nav__icon md-icon"></span>
643
+ </label>
644
+
645
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
646
+ <label class="md-nav__title" for="__nav_2_3">
647
+ <span class="md-nav__icon md-icon"></span>
648
+ Configuration
649
+ </label>
650
+ <ul class="md-nav__list" data-md-scrollfix>
651
+
652
+
653
+
654
+
655
+
656
+
657
+ <li class="md-nav__item">
658
+ <a href="../configuration/index.html" class="md-nav__link">
659
+ Configuring Nautobot
660
+ </a>
661
+ </li>
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+ <li class="md-nav__item">
672
+ <a href="../configuration/required-settings.html" class="md-nav__link">
673
+ Required Settings
674
+ </a>
675
+ </li>
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+ <li class="md-nav__item">
686
+ <a href="../configuration/optional-settings.html" class="md-nav__link">
687
+ Optional Settings
688
+ </a>
689
+ </li>
690
+
691
+
692
+
693
+
694
+ </ul>
695
+ </nav>
696
+ </li>
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+
707
+ <li class="md-nav__item md-nav__item--nested">
708
+
709
+
710
+
711
+
712
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4" >
713
+
714
+
715
+
716
+ <label class="md-nav__link" for="__nav_2_4" id="__nav_2_4_label" tabindex="0">
717
+ External Authentication
718
+ <span class="md-nav__icon md-icon"></span>
719
+ </label>
720
+
721
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
722
+ <label class="md-nav__title" for="__nav_2_4">
723
+ <span class="md-nav__icon md-icon"></span>
724
+ External Authentication
725
+ </label>
726
+ <ul class="md-nav__list" data-md-scrollfix>
727
+
728
+
729
+
730
+
731
+
732
+
733
+ <li class="md-nav__item">
734
+ <a href="../configuration/authentication/ldap.html" class="md-nav__link">
735
+ LDAP
736
+ </a>
737
+ </li>
738
+
739
+
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+ <li class="md-nav__item">
748
+ <a href="../configuration/authentication/sso.html" class="md-nav__link">
749
+ SSO
750
+ </a>
751
+ </li>
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+ <li class="md-nav__item">
762
+ <a href="../configuration/authentication/remote.html" class="md-nav__link">
763
+ Remote Header
764
+ </a>
765
+ </li>
766
+
767
+
768
+
769
+
770
+ </ul>
771
+ </nav>
772
+ </li>
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+ <li class="md-nav__item md-nav__item--nested">
784
+
785
+
786
+
787
+
788
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5" >
789
+
790
+
791
+
792
+ <label class="md-nav__link" for="__nav_2_5" id="__nav_2_5_label" tabindex="0">
793
+ Administration
794
+ <span class="md-nav__icon md-icon"></span>
795
+ </label>
796
+
797
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
798
+ <label class="md-nav__title" for="__nav_2_5">
799
+ <span class="md-nav__icon md-icon"></span>
800
+ Administration
801
+ </label>
802
+ <ul class="md-nav__list" data-md-scrollfix>
803
+
804
+
805
+
806
+
807
+
808
+
809
+ <li class="md-nav__item">
810
+ <a href="../administration/nautobot-server.html" class="md-nav__link">
811
+ Nautobot Server
812
+ </a>
813
+ </li>
814
+
815
+
816
+
817
+
818
+
819
+
820
+
821
+
822
+
823
+ <li class="md-nav__item">
824
+ <a href="../administration/nautobot-shell.html" class="md-nav__link">
825
+ Nautobot Shell
826
+ </a>
827
+ </li>
828
+
829
+
830
+
831
+
832
+
833
+
834
+
835
+
836
+
837
+ <li class="md-nav__item">
838
+ <a href="../administration/permissions.html" class="md-nav__link">
839
+ Permissions
840
+ </a>
841
+ </li>
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+
851
+ <li class="md-nav__item">
852
+ <a href="../administration/replicating-nautobot.html" class="md-nav__link">
853
+ Replicating Nautobot
854
+ </a>
855
+ </li>
856
+
857
+
858
+
859
+
860
+
861
+
862
+
863
+
864
+
865
+ <li class="md-nav__item">
866
+ <a href="../administration/celery-queues.html" class="md-nav__link">
867
+ Task Queues
868
+ </a>
869
+ </li>
870
+
871
+
872
+
873
+
874
+ </ul>
875
+ </nav>
876
+ </li>
877
+
878
+
879
+
880
+
881
+
882
+
883
+
884
+
885
+
886
+
887
+ <li class="md-nav__item md-nav__item--nested">
888
+
889
+
890
+
891
+
892
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6" >
893
+
894
+
895
+
896
+ <label class="md-nav__link" for="__nav_2_6" id="__nav_2_6_label" tabindex="0">
897
+ User Guides
898
+ <span class="md-nav__icon md-icon"></span>
899
+ </label>
900
+
901
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
902
+ <label class="md-nav__title" for="__nav_2_6">
903
+ <span class="md-nav__icon md-icon"></span>
904
+ User Guides
905
+ </label>
906
+ <ul class="md-nav__list" data-md-scrollfix>
907
+
908
+
909
+
910
+
911
+
912
+
913
+ <li class="md-nav__item">
914
+ <a href="../user-guides/getting-started/creating-devices.html" class="md-nav__link">
915
+ Creating Devices
916
+ </a>
917
+ </li>
918
+
919
+
920
+
921
+
922
+
923
+
924
+
925
+
926
+
927
+ <li class="md-nav__item">
928
+ <a href="../user-guides/custom-fields.html" class="md-nav__link">
929
+ Custom Fields
930
+ </a>
931
+ </li>
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+
940
+
941
+ <li class="md-nav__item">
942
+ <a href="../user-guides/getting-started/index.html" class="md-nav__link">
943
+ Getting Started In the Web UI
944
+ </a>
945
+ </li>
946
+
947
+
948
+
949
+
950
+
951
+
952
+
953
+
954
+
955
+ <li class="md-nav__item">
956
+ <a href="../user-guides/git-data-source.html" class="md-nav__link">
957
+ Git as a Data Source
958
+ </a>
959
+ </li>
960
+
961
+
962
+
963
+
964
+
965
+
966
+
967
+
968
+
969
+ <li class="md-nav__item">
970
+ <a href="../user-guides/graphql.html" class="md-nav__link">
971
+ GraphQL
972
+ </a>
973
+ </li>
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+ <li class="md-nav__item">
984
+ <a href="../user-guides/getting-started/interfaces.html" class="md-nav__link">
985
+ Interfaces
986
+ </a>
987
+ </li>
988
+
989
+
990
+
991
+
992
+
993
+
994
+
995
+
996
+
997
+ <li class="md-nav__item">
998
+ <a href="../user-guides/getting-started/ipam.html" class="md-nav__link">
999
+ IP Address Management
1000
+ </a>
1001
+ </li>
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+ <li class="md-nav__item">
1012
+ <a href="../user-guides/getting-started/platforms.html" class="md-nav__link">
1013
+ Platforms
1014
+ </a>
1015
+ </li>
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+ <li class="md-nav__item">
1026
+ <a href="../user-guides/getting-started/regions.html" class="md-nav__link">
1027
+ Regions
1028
+ </a>
1029
+ </li>
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+ <li class="md-nav__item">
1040
+ <a href="../user-guides/getting-started/tenants.html" class="md-nav__link">
1041
+ Tenants
1042
+ </a>
1043
+ </li>
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+
1053
+ <li class="md-nav__item">
1054
+ <a href="../user-guides/getting-started/search-bar.html" class="md-nav__link">
1055
+ The Search Bar
1056
+ </a>
1057
+ </li>
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+ <li class="md-nav__item">
1068
+ <a href="../user-guides/git-data-source.html" class="md-nav__link">
1069
+ Git as a Data Source
1070
+ </a>
1071
+ </li>
1072
+
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+ <li class="md-nav__item">
1082
+ <a href="../user-guides/graphql.html" class="md-nav__link">
1083
+ GraphQL
1084
+ </a>
1085
+ </li>
1086
+
1087
+
1088
+
1089
+
1090
+
1091
+
1092
+
1093
+
1094
+
1095
+ <li class="md-nav__item">
1096
+ <a href="../user-guides/relationships.html" class="md-nav__link">
1097
+ Relationships
1098
+ </a>
1099
+ </li>
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+ <li class="md-nav__item">
1110
+ <a href="../user-guides/s3-django-storage.html" class="md-nav__link">
1111
+ Django Storages with S3
1112
+ </a>
1113
+ </li>
1114
+
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+
1121
+
1122
+
1123
+ <li class="md-nav__item">
1124
+ <a href="../user-guides/getting-started/vlans-and-vlan-groups.html" class="md-nav__link">
1125
+ VLANS and VLAN Groups
1126
+ </a>
1127
+ </li>
1128
+
1129
+
1130
+
1131
+
1132
+ </ul>
1133
+ </nav>
1134
+ </li>
1135
+
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+ <li class="md-nav__item md-nav__item--nested">
1146
+
1147
+
1148
+
1149
+
1150
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_7" >
1151
+
1152
+
1153
+
1154
+ <label class="md-nav__link" for="__nav_2_7" id="__nav_2_7_label" tabindex="0">
1155
+ Core Functionality
1156
+ <span class="md-nav__icon md-icon"></span>
1157
+ </label>
1158
+
1159
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
1160
+ <label class="md-nav__title" for="__nav_2_7">
1161
+ <span class="md-nav__icon md-icon"></span>
1162
+ Core Functionality
1163
+ </label>
1164
+ <ul class="md-nav__list" data-md-scrollfix>
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+ <li class="md-nav__item">
1172
+ <a href="../core-functionality/circuits.html" class="md-nav__link">
1173
+ Circuits
1174
+ </a>
1175
+ </li>
1176
+
1177
+
1178
+
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+ <li class="md-nav__item">
1186
+ <a href="../core-functionality/devices.html" class="md-nav__link">
1187
+ Devices and Cabling
1188
+ </a>
1189
+ </li>
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+ <li class="md-nav__item">
1200
+ <a href="../core-functionality/device-types.html" class="md-nav__link">
1201
+ Device Types
1202
+ </a>
1203
+ </li>
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+ <li class="md-nav__item">
1214
+ <a href="../core-functionality/ipam.html" class="md-nav__link">
1215
+ IP Address Management
1216
+ </a>
1217
+ </li>
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+ <li class="md-nav__item">
1228
+ <a href="../core-functionality/power.html" class="md-nav__link">
1229
+ Power Tracking
1230
+ </a>
1231
+ </li>
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+ <li class="md-nav__item">
1242
+ <a href="../core-functionality/secrets.html" class="md-nav__link">
1243
+ Secrets
1244
+ </a>
1245
+ </li>
1246
+
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+ <li class="md-nav__item">
1256
+ <a href="../core-functionality/services.html" class="md-nav__link">
1257
+ Service Mapping
1258
+ </a>
1259
+ </li>
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+ <li class="md-nav__item">
1270
+ <a href="../core-functionality/sites-and-racks.html" class="md-nav__link">
1271
+ Sites, Locations, and Racks
1272
+ </a>
1273
+ </li>
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+ <li class="md-nav__item">
1284
+ <a href="../core-functionality/tenancy.html" class="md-nav__link">
1285
+ Tenancy
1286
+ </a>
1287
+ </li>
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+ <li class="md-nav__item">
1298
+ <a href="../core-functionality/virtualization.html" class="md-nav__link">
1299
+ Virtualization
1300
+ </a>
1301
+ </li>
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+ <li class="md-nav__item">
1312
+ <a href="../core-functionality/vlans.html" class="md-nav__link">
1313
+ VLAN Management
1314
+ </a>
1315
+ </li>
1316
+
1317
+
1318
+
1319
+
1320
+ </ul>
1321
+ </nav>
1322
+ </li>
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+ <li class="md-nav__item md-nav__item--nested">
1334
+
1335
+
1336
+
1337
+
1338
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8" >
1339
+
1340
+
1341
+
1342
+ <label class="md-nav__link" for="__nav_2_8" id="__nav_2_8_label" tabindex="0">
1343
+ Model Details
1344
+ <span class="md-nav__icon md-icon"></span>
1345
+ </label>
1346
+
1347
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
1348
+ <label class="md-nav__title" for="__nav_2_8">
1349
+ <span class="md-nav__icon md-icon"></span>
1350
+ Model Details
1351
+ </label>
1352
+ <ul class="md-nav__list" data-md-scrollfix>
1353
+
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+ <li class="md-nav__item md-nav__item--nested">
1361
+
1362
+
1363
+
1364
+
1365
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_1" >
1366
+
1367
+
1368
+
1369
+ <label class="md-nav__link" for="__nav_2_8_1" id="__nav_2_8_1_label" tabindex="0">
1370
+ Circuits
1371
+ <span class="md-nav__icon md-icon"></span>
1372
+ </label>
1373
+
1374
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_1_label" aria-expanded="false">
1375
+ <label class="md-nav__title" for="__nav_2_8_1">
1376
+ <span class="md-nav__icon md-icon"></span>
1377
+ Circuits
1378
+ </label>
1379
+ <ul class="md-nav__list" data-md-scrollfix>
1380
+
1381
+
1382
+
1383
+
1384
+
1385
+
1386
+ <li class="md-nav__item">
1387
+ <a href="../models/circuits/circuit.html" class="md-nav__link">
1388
+ Circuit
1389
+ </a>
1390
+ </li>
1391
+
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+
1400
+ <li class="md-nav__item">
1401
+ <a href="../models/circuits/circuittermination.html" class="md-nav__link">
1402
+ Circuit Termination
1403
+ </a>
1404
+ </li>
1405
+
1406
+
1407
+
1408
+
1409
+
1410
+
1411
+
1412
+
1413
+
1414
+ <li class="md-nav__item">
1415
+ <a href="../models/circuits/circuittype.html" class="md-nav__link">
1416
+ Circuit Type
1417
+ </a>
1418
+ </li>
1419
+
1420
+
1421
+
1422
+
1423
+
1424
+
1425
+
1426
+
1427
+
1428
+ <li class="md-nav__item">
1429
+ <a href="../models/circuits/provider.html" class="md-nav__link">
1430
+ Circuit Provider
1431
+ </a>
1432
+ </li>
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+ <li class="md-nav__item">
1443
+ <a href="../models/circuits/providernetwork.html" class="md-nav__link">
1444
+ Circuit Provider Network
1445
+ </a>
1446
+ </li>
1447
+
1448
+
1449
+
1450
+
1451
+ </ul>
1452
+ </nav>
1453
+ </li>
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+ <li class="md-nav__item md-nav__item--nested">
1465
+
1466
+
1467
+
1468
+
1469
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_2" >
1470
+
1471
+
1472
+
1473
+ <label class="md-nav__link" for="__nav_2_8_2" id="__nav_2_8_2_label" tabindex="0">
1474
+ DCIM
1475
+ <span class="md-nav__icon md-icon"></span>
1476
+ </label>
1477
+
1478
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_2_label" aria-expanded="false">
1479
+ <label class="md-nav__title" for="__nav_2_8_2">
1480
+ <span class="md-nav__icon md-icon"></span>
1481
+ DCIM
1482
+ </label>
1483
+ <ul class="md-nav__list" data-md-scrollfix>
1484
+
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+ <li class="md-nav__item">
1491
+ <a href="../models/dcim/cable.html" class="md-nav__link">
1492
+ Cable
1493
+ </a>
1494
+ </li>
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+
1502
+
1503
+
1504
+ <li class="md-nav__item">
1505
+ <a href="../models/dcim/consoleport.html" class="md-nav__link">
1506
+ Console Port
1507
+ </a>
1508
+ </li>
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+
1516
+
1517
+
1518
+ <li class="md-nav__item">
1519
+ <a href="../models/dcim/consoleporttemplate.html" class="md-nav__link">
1520
+ Console Port Template
1521
+ </a>
1522
+ </li>
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+
1529
+
1530
+
1531
+
1532
+ <li class="md-nav__item">
1533
+ <a href="../models/dcim/consoleserverport.html" class="md-nav__link">
1534
+ Console Server Port
1535
+ </a>
1536
+ </li>
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+
1544
+
1545
+
1546
+ <li class="md-nav__item">
1547
+ <a href="../models/dcim/consoleserverporttemplate.html" class="md-nav__link">
1548
+ Console Server Port Template
1549
+ </a>
1550
+ </li>
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+ <li class="md-nav__item">
1561
+ <a href="../models/dcim/device.html" class="md-nav__link">
1562
+ Device
1563
+ </a>
1564
+ </li>
1565
+
1566
+
1567
+
1568
+
1569
+
1570
+
1571
+
1572
+
1573
+
1574
+ <li class="md-nav__item">
1575
+ <a href="../models/dcim/devicebay.html" class="md-nav__link">
1576
+ Device Bay
1577
+ </a>
1578
+ </li>
1579
+
1580
+
1581
+
1582
+
1583
+
1584
+
1585
+
1586
+
1587
+
1588
+ <li class="md-nav__item">
1589
+ <a href="../models/dcim/devicebaytemplate.html" class="md-nav__link">
1590
+ Device Bay Template
1591
+ </a>
1592
+ </li>
1593
+
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+ <li class="md-nav__item">
1603
+ <a href="../models/dcim/deviceredundancygroup.html" class="md-nav__link">
1604
+ Device Redundancy Group
1605
+ </a>
1606
+ </li>
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+ <li class="md-nav__item">
1617
+ <a href="../models/dcim/devicetype.html" class="md-nav__link">
1618
+ Device Type
1619
+ </a>
1620
+ </li>
1621
+
1622
+
1623
+
1624
+
1625
+
1626
+
1627
+
1628
+
1629
+
1630
+ <li class="md-nav__item">
1631
+ <a href="../models/dcim/frontport.html" class="md-nav__link">
1632
+ Front Port
1633
+ </a>
1634
+ </li>
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+ <li class="md-nav__item">
1645
+ <a href="../models/dcim/frontporttemplate.html" class="md-nav__link">
1646
+ Front Port Template
1647
+ </a>
1648
+ </li>
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+ <li class="md-nav__item">
1659
+ <a href="../models/dcim/interface.html" class="md-nav__link">
1660
+ Interface
1661
+ </a>
1662
+ </li>
1663
+
1664
+
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+ <li class="md-nav__item">
1673
+ <a href="../models/dcim/interfacetemplate.html" class="md-nav__link">
1674
+ Interface Template
1675
+ </a>
1676
+ </li>
1677
+
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+ <li class="md-nav__item">
1687
+ <a href="../models/dcim/inventoryitem.html" class="md-nav__link">
1688
+ Inventory Item
1689
+ </a>
1690
+ </li>
1691
+
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+ <li class="md-nav__item">
1701
+ <a href="../models/dcim/location.html" class="md-nav__link">
1702
+ Location
1703
+ </a>
1704
+ </li>
1705
+
1706
+
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+ <li class="md-nav__item">
1715
+ <a href="../models/dcim/locationtype.html" class="md-nav__link">
1716
+ Location Type
1717
+ </a>
1718
+ </li>
1719
+
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+ <li class="md-nav__item">
1729
+ <a href="../models/dcim/manufacturer.html" class="md-nav__link">
1730
+ Manufacturer
1731
+ </a>
1732
+ </li>
1733
+
1734
+
1735
+
1736
+
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+ <li class="md-nav__item">
1743
+ <a href="../models/dcim/platform.html" class="md-nav__link">
1744
+ Platform
1745
+ </a>
1746
+ </li>
1747
+
1748
+
1749
+
1750
+
1751
+
1752
+
1753
+
1754
+
1755
+
1756
+ <li class="md-nav__item">
1757
+ <a href="../models/dcim/powerfeed.html" class="md-nav__link">
1758
+ Power Feed
1759
+ </a>
1760
+ </li>
1761
+
1762
+
1763
+
1764
+
1765
+
1766
+
1767
+
1768
+
1769
+
1770
+ <li class="md-nav__item">
1771
+ <a href="../models/dcim/poweroutlet.html" class="md-nav__link">
1772
+ Power Outlet
1773
+ </a>
1774
+ </li>
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+ <li class="md-nav__item">
1785
+ <a href="../models/dcim/poweroutlettemplate.html" class="md-nav__link">
1786
+ Power Outlet Template
1787
+ </a>
1788
+ </li>
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+ <li class="md-nav__item">
1799
+ <a href="../models/dcim/powerpanel.html" class="md-nav__link">
1800
+ Power Panel
1801
+ </a>
1802
+ </li>
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+ <li class="md-nav__item">
1813
+ <a href="../models/dcim/powerport.html" class="md-nav__link">
1814
+ Power Port
1815
+ </a>
1816
+ </li>
1817
+
1818
+
1819
+
1820
+
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+ <li class="md-nav__item">
1827
+ <a href="../models/dcim/powerporttemplate.html" class="md-nav__link">
1828
+ Power Port Template
1829
+ </a>
1830
+ </li>
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+
1840
+ <li class="md-nav__item">
1841
+ <a href="../models/dcim/rack.html" class="md-nav__link">
1842
+ Rack
1843
+ </a>
1844
+ </li>
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+ <li class="md-nav__item">
1855
+ <a href="../models/dcim/rackgroup.html" class="md-nav__link">
1856
+ Rack Group
1857
+ </a>
1858
+ </li>
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
1868
+ <li class="md-nav__item">
1869
+ <a href="../models/dcim/rackreservation.html" class="md-nav__link">
1870
+ Rack Reservation
1871
+ </a>
1872
+ </li>
1873
+
1874
+
1875
+
1876
+
1877
+
1878
+
1879
+
1880
+
1881
+
1882
+ <li class="md-nav__item">
1883
+ <a href="../models/dcim/rearport.html" class="md-nav__link">
1884
+ Rear Port
1885
+ </a>
1886
+ </li>
1887
+
1888
+
1889
+
1890
+
1891
+
1892
+
1893
+
1894
+
1895
+
1896
+ <li class="md-nav__item">
1897
+ <a href="../models/dcim/rearporttemplate.html" class="md-nav__link">
1898
+ Rear Port Template
1899
+ </a>
1900
+ </li>
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+
1908
+
1909
+
1910
+ <li class="md-nav__item">
1911
+ <a href="../models/dcim/virtualchassis.html" class="md-nav__link">
1912
+ Virtual Chassis
1913
+ </a>
1914
+ </li>
1915
+
1916
+
1917
+
1918
+
1919
+ </ul>
1920
+ </nav>
1921
+ </li>
1922
+
1923
+
1924
+
1925
+
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+ <li class="md-nav__item md-nav__item--nested">
1933
+
1934
+
1935
+
1936
+
1937
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_3" >
1938
+
1939
+
1940
+
1941
+ <label class="md-nav__link" for="__nav_2_8_3" id="__nav_2_8_3_label" tabindex="0">
1942
+ Extras
1943
+ <span class="md-nav__icon md-icon"></span>
1944
+ </label>
1945
+
1946
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_3_label" aria-expanded="false">
1947
+ <label class="md-nav__title" for="__nav_2_8_3">
1948
+ <span class="md-nav__icon md-icon"></span>
1949
+ Extras
1950
+ </label>
1951
+ <ul class="md-nav__list" data-md-scrollfix>
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+ <li class="md-nav__item">
1959
+ <a href="../models/extras/configcontext.html" class="md-nav__link">
1960
+ Config Context
1961
+ </a>
1962
+ </li>
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+
1972
+ <li class="md-nav__item">
1973
+ <a href="../models/extras/configcontextschema.html" class="md-nav__link">
1974
+ Config Context Schema
1975
+ </a>
1976
+ </li>
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+
1986
+ <li class="md-nav__item">
1987
+ <a href="../models/extras/graphqlquery.html" class="md-nav__link">
1988
+ GraphQL Query
1989
+ </a>
1990
+ </li>
1991
+
1992
+
1993
+
1994
+
1995
+
1996
+
1997
+
1998
+
1999
+
2000
+ <li class="md-nav__item">
2001
+ <a href="../models/extras/imageattachment.html" class="md-nav__link">
2002
+ Image Attachment
2003
+ </a>
2004
+ </li>
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+
2013
+
2014
+ <li class="md-nav__item">
2015
+ <a href="../models/extras/job.html" class="md-nav__link">
2016
+ Job
2017
+ </a>
2018
+ </li>
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+ <li class="md-nav__item">
2029
+ <a href="../models/extras/joblogentry.html" class="md-nav__link">
2030
+ Job Log Entry
2031
+ </a>
2032
+ </li>
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+
2040
+
2041
+
2042
+ <li class="md-nav__item">
2043
+ <a href="../models/extras/jobresult.html" class="md-nav__link">
2044
+ Job Result
2045
+ </a>
2046
+ </li>
2047
+
2048
+
2049
+
2050
+
2051
+
2052
+
2053
+
2054
+
2055
+
2056
+ <li class="md-nav__item">
2057
+ <a href="../models/extras/role.html" class="md-nav__link">
2058
+ Role
2059
+ </a>
2060
+ </li>
2061
+
2062
+
2063
+
2064
+
2065
+
2066
+
2067
+
2068
+
2069
+
2070
+ <li class="md-nav__item">
2071
+ <a href="../models/extras/secret.html" class="md-nav__link">
2072
+ Secret
2073
+ </a>
2074
+ </li>
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+ <li class="md-nav__item">
2085
+ <a href="../models/extras/secretsgroup.html" class="md-nav__link">
2086
+ Secrets group
2087
+ </a>
2088
+ </li>
2089
+
2090
+
2091
+
2092
+
2093
+ </ul>
2094
+ </nav>
2095
+ </li>
2096
+
2097
+
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+
2104
+
2105
+
2106
+ <li class="md-nav__item md-nav__item--nested">
2107
+
2108
+
2109
+
2110
+
2111
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_4" >
2112
+
2113
+
2114
+
2115
+ <label class="md-nav__link" for="__nav_2_8_4" id="__nav_2_8_4_label" tabindex="0">
2116
+ IPAM
2117
+ <span class="md-nav__icon md-icon"></span>
2118
+ </label>
2119
+
2120
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_4_label" aria-expanded="false">
2121
+ <label class="md-nav__title" for="__nav_2_8_4">
2122
+ <span class="md-nav__icon md-icon"></span>
2123
+ IPAM
2124
+ </label>
2125
+ <ul class="md-nav__list" data-md-scrollfix>
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+ <li class="md-nav__item">
2133
+ <a href="../models/ipam/ipaddress.html" class="md-nav__link">
2134
+ IP Address
2135
+ </a>
2136
+ </li>
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+ <li class="md-nav__item">
2147
+ <a href="../models/ipam/prefix.html" class="md-nav__link">
2148
+ Prefix
2149
+ </a>
2150
+ </li>
2151
+
2152
+
2153
+
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+ <li class="md-nav__item">
2161
+ <a href="../models/ipam/rir.html" class="md-nav__link">
2162
+ Rir
2163
+ </a>
2164
+ </li>
2165
+
2166
+
2167
+
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+ <li class="md-nav__item">
2175
+ <a href="../models/ipam/routetarget.html" class="md-nav__link">
2176
+ Route Target
2177
+ </a>
2178
+ </li>
2179
+
2180
+
2181
+
2182
+
2183
+
2184
+
2185
+
2186
+
2187
+
2188
+ <li class="md-nav__item">
2189
+ <a href="../models/ipam/service.html" class="md-nav__link">
2190
+ Service
2191
+ </a>
2192
+ </li>
2193
+
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+ <li class="md-nav__item">
2203
+ <a href="../models/ipam/vlan.html" class="md-nav__link">
2204
+ VLAN
2205
+ </a>
2206
+ </li>
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+ <li class="md-nav__item">
2217
+ <a href="../models/ipam/vlangroup.html" class="md-nav__link">
2218
+ VLAN Group
2219
+ </a>
2220
+ </li>
2221
+
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+ <li class="md-nav__item">
2231
+ <a href="../models/ipam/vrf.html" class="md-nav__link">
2232
+ VRF
2233
+ </a>
2234
+ </li>
2235
+
2236
+
2237
+
2238
+
2239
+ </ul>
2240
+ </nav>
2241
+ </li>
2242
+
2243
+
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+ <li class="md-nav__item md-nav__item--nested">
2253
+
2254
+
2255
+
2256
+
2257
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_5" >
2258
+
2259
+
2260
+
2261
+ <label class="md-nav__link" for="__nav_2_8_5" id="__nav_2_8_5_label" tabindex="0">
2262
+ Tenancy
2263
+ <span class="md-nav__icon md-icon"></span>
2264
+ </label>
2265
+
2266
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_5_label" aria-expanded="false">
2267
+ <label class="md-nav__title" for="__nav_2_8_5">
2268
+ <span class="md-nav__icon md-icon"></span>
2269
+ Tenancy
2270
+ </label>
2271
+ <ul class="md-nav__list" data-md-scrollfix>
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+ <li class="md-nav__item">
2279
+ <a href="../models/tenancy/tenant.html" class="md-nav__link">
2280
+ Tenant
2281
+ </a>
2282
+ </li>
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+
2289
+
2290
+
2291
+
2292
+ <li class="md-nav__item">
2293
+ <a href="../models/tenancy/tenantgroup.html" class="md-nav__link">
2294
+ Tenant Group
2295
+ </a>
2296
+ </li>
2297
+
2298
+
2299
+
2300
+
2301
+ </ul>
2302
+ </nav>
2303
+ </li>
2304
+
2305
+
2306
+
2307
+
2308
+
2309
+
2310
+
2311
+
2312
+
2313
+
2314
+ <li class="md-nav__item md-nav__item--nested">
2315
+
2316
+
2317
+
2318
+
2319
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_6" >
2320
+
2321
+
2322
+
2323
+ <label class="md-nav__link" for="__nav_2_8_6" id="__nav_2_8_6_label" tabindex="0">
2324
+ Users
2325
+ <span class="md-nav__icon md-icon"></span>
2326
+ </label>
2327
+
2328
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_6_label" aria-expanded="false">
2329
+ <label class="md-nav__title" for="__nav_2_8_6">
2330
+ <span class="md-nav__icon md-icon"></span>
2331
+ Users
2332
+ </label>
2333
+ <ul class="md-nav__list" data-md-scrollfix>
2334
+
2335
+
2336
+
2337
+
2338
+
2339
+
2340
+ <li class="md-nav__item">
2341
+ <a href="../models/users/objectpermission.html" class="md-nav__link">
2342
+ Object Permission
2343
+ </a>
2344
+ </li>
2345
+
2346
+
2347
+
2348
+
2349
+
2350
+
2351
+
2352
+
2353
+
2354
+ <li class="md-nav__item">
2355
+ <a href="../models/users/token.html" class="md-nav__link">
2356
+ Token
2357
+ </a>
2358
+ </li>
2359
+
2360
+
2361
+
2362
+
2363
+ </ul>
2364
+ </nav>
2365
+ </li>
2366
+
2367
+
2368
+
2369
+
2370
+
2371
+
2372
+
2373
+
2374
+
2375
+
2376
+ <li class="md-nav__item md-nav__item--nested">
2377
+
2378
+
2379
+
2380
+
2381
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_8_7" >
2382
+
2383
+
2384
+
2385
+ <label class="md-nav__link" for="__nav_2_8_7" id="__nav_2_8_7_label" tabindex="0">
2386
+ Virtualization
2387
+ <span class="md-nav__icon md-icon"></span>
2388
+ </label>
2389
+
2390
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_8_7_label" aria-expanded="false">
2391
+ <label class="md-nav__title" for="__nav_2_8_7">
2392
+ <span class="md-nav__icon md-icon"></span>
2393
+ Virtualization
2394
+ </label>
2395
+ <ul class="md-nav__list" data-md-scrollfix>
2396
+
2397
+
2398
+
2399
+
2400
+
2401
+
2402
+ <li class="md-nav__item">
2403
+ <a href="../models/virtualization/cluster.html" class="md-nav__link">
2404
+ Cluster
2405
+ </a>
2406
+ </li>
2407
+
2408
+
2409
+
2410
+
2411
+
2412
+
2413
+
2414
+
2415
+
2416
+ <li class="md-nav__item">
2417
+ <a href="../models/virtualization/clustergroup.html" class="md-nav__link">
2418
+ Cluster Group
2419
+ </a>
2420
+ </li>
2421
+
2422
+
2423
+
2424
+
2425
+
2426
+
2427
+
2428
+
2429
+
2430
+ <li class="md-nav__item">
2431
+ <a href="../models/virtualization/clustertype.html" class="md-nav__link">
2432
+ Cluster Type
2433
+ </a>
2434
+ </li>
2435
+
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+ <li class="md-nav__item">
2445
+ <a href="../models/virtualization/virtualmachine.html" class="md-nav__link">
2446
+ Virtual Machine
2447
+ </a>
2448
+ </li>
2449
+
2450
+
2451
+
2452
+
2453
+
2454
+
2455
+
2456
+
2457
+
2458
+ <li class="md-nav__item">
2459
+ <a href="../models/virtualization/vminterface.html" class="md-nav__link">
2460
+ VM Interface
2461
+ </a>
2462
+ </li>
2463
+
2464
+
2465
+
2466
+
2467
+ </ul>
2468
+ </nav>
2469
+ </li>
2470
+
2471
+
2472
+
2473
+
2474
+ </ul>
2475
+ </nav>
2476
+ </li>
2477
+
2478
+
2479
+
2480
+
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+ <li class="md-nav__item md-nav__item--nested">
2488
+
2489
+
2490
+
2491
+
2492
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_9" >
2493
+
2494
+
2495
+
2496
+ <label class="md-nav__link" for="__nav_2_9" id="__nav_2_9_label" tabindex="0">
2497
+ Additional Features
2498
+ <span class="md-nav__icon md-icon"></span>
2499
+ </label>
2500
+
2501
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="false">
2502
+ <label class="md-nav__title" for="__nav_2_9">
2503
+ <span class="md-nav__icon md-icon"></span>
2504
+ Additional Features
2505
+ </label>
2506
+ <ul class="md-nav__list" data-md-scrollfix>
2507
+
2508
+
2509
+
2510
+
2511
+
2512
+
2513
+ <li class="md-nav__item">
2514
+ <a href="../additional-features/caching.html" class="md-nav__link">
2515
+ Caching
2516
+ </a>
2517
+ </li>
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+ <li class="md-nav__item">
2528
+ <a href="../additional-features/change-logging.html" class="md-nav__link">
2529
+ Change Logging
2530
+ </a>
2531
+ </li>
2532
+
2533
+
2534
+
2535
+
2536
+
2537
+
2538
+
2539
+
2540
+
2541
+ <li class="md-nav__item">
2542
+ <a href="../models/extras/computedfield.html" class="md-nav__link">
2543
+ Computed Fields
2544
+ </a>
2545
+ </li>
2546
+
2547
+
2548
+
2549
+
2550
+
2551
+
2552
+
2553
+
2554
+
2555
+ <li class="md-nav__item">
2556
+ <a href="../additional-features/config-contexts.html" class="md-nav__link">
2557
+ Context Data
2558
+ </a>
2559
+ </li>
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+
2566
+
2567
+
2568
+
2569
+ <li class="md-nav__item">
2570
+ <a href="../models/extras/customfield.html" class="md-nav__link">
2571
+ Custom Fields
2572
+ </a>
2573
+ </li>
2574
+
2575
+
2576
+
2577
+
2578
+
2579
+
2580
+
2581
+
2582
+
2583
+ <li class="md-nav__item">
2584
+ <a href="../models/extras/customlink.html" class="md-nav__link">
2585
+ Custom Links
2586
+ </a>
2587
+ </li>
2588
+
2589
+
2590
+
2591
+
2592
+
2593
+
2594
+
2595
+
2596
+
2597
+ <li class="md-nav__item">
2598
+ <a href="../models/extras/dynamicgroup.html" class="md-nav__link">
2599
+ Dynamic Groups
2600
+ </a>
2601
+ </li>
2602
+
2603
+
2604
+
2605
+
2606
+
2607
+
2608
+
2609
+
2610
+
2611
+ <li class="md-nav__item">
2612
+ <a href="../models/extras/exporttemplate.html" class="md-nav__link">
2613
+ Export Templates
2614
+ </a>
2615
+ </li>
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+ <li class="md-nav__item">
2626
+ <a href="../models/extras/gitrepository.html" class="md-nav__link">
2627
+ Git Repositories
2628
+ </a>
2629
+ </li>
2630
+
2631
+
2632
+
2633
+
2634
+
2635
+
2636
+
2637
+
2638
+
2639
+ <li class="md-nav__item">
2640
+ <a href="../additional-features/healthcheck.html" class="md-nav__link">
2641
+ Health Check
2642
+ </a>
2643
+ </li>
2644
+
2645
+
2646
+
2647
+
2648
+
2649
+
2650
+
2651
+
2652
+
2653
+ <li class="md-nav__item">
2654
+ <a href="../additional-features/jobs.html" class="md-nav__link">
2655
+ Jobs
2656
+ </a>
2657
+ </li>
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+ <li class="md-nav__item">
2668
+ <a href="../models/extras/jobbutton.html" class="md-nav__link">
2669
+ Job Buttons
2670
+ </a>
2671
+ </li>
2672
+
2673
+
2674
+
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+ <li class="md-nav__item">
2682
+ <a href="../models/extras/jobhook.html" class="md-nav__link">
2683
+ Job Hooks
2684
+ </a>
2685
+ </li>
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+
2692
+
2693
+
2694
+
2695
+ <li class="md-nav__item">
2696
+ <a href="../additional-features/job-scheduling-and-approvals.html" class="md-nav__link">
2697
+ Job Scheduling and Approvals
2698
+ </a>
2699
+ </li>
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+ <li class="md-nav__item">
2710
+ <a href="../additional-features/napalm.html" class="md-nav__link">
2711
+ NAPALM
2712
+ </a>
2713
+ </li>
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2722
+
2723
+ <li class="md-nav__item">
2724
+ <a href="../models/extras/note.html" class="md-nav__link">
2725
+ Notes
2726
+ </a>
2727
+ </li>
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+ <li class="md-nav__item">
2738
+ <a href="../additional-features/prometheus-metrics.html" class="md-nav__link">
2739
+ Prometheus Metrics
2740
+ </a>
2741
+ </li>
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2748
+
2749
+
2750
+
2751
+ <li class="md-nav__item">
2752
+ <a href="../models/extras/relationship.html" class="md-nav__link">
2753
+ Relationships
2754
+ </a>
2755
+ </li>
2756
+
2757
+
2758
+
2759
+
2760
+
2761
+
2762
+
2763
+
2764
+
2765
+ <li class="md-nav__item">
2766
+ <a href="../models/extras/status.html" class="md-nav__link">
2767
+ Statuses
2768
+ </a>
2769
+ </li>
2770
+
2771
+
2772
+
2773
+
2774
+
2775
+
2776
+
2777
+
2778
+
2779
+ <li class="md-nav__item">
2780
+ <a href="../models/extras/tag.html" class="md-nav__link">
2781
+ Tags
2782
+ </a>
2783
+ </li>
2784
+
2785
+
2786
+
2787
+
2788
+
2789
+
2790
+
2791
+
2792
+
2793
+ <li class="md-nav__item">
2794
+ <a href="../additional-features/template-filters.html" class="md-nav__link">
2795
+ Template Filters
2796
+ </a>
2797
+ </li>
2798
+
2799
+
2800
+
2801
+
2802
+
2803
+
2804
+
2805
+
2806
+
2807
+ <li class="md-nav__item">
2808
+ <a href="../models/extras/webhook.html" class="md-nav__link">
2809
+ Webhooks
2810
+ </a>
2811
+ </li>
2812
+
2813
+
2814
+
2815
+
2816
+ </ul>
2817
+ </nav>
2818
+ </li>
2819
+
2820
+
2821
+
2822
+
2823
+
2824
+
2825
+
2826
+
2827
+
2828
+
2829
+ <li class="md-nav__item md-nav__item--nested">
2830
+
2831
+
2832
+
2833
+
2834
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_10" >
2835
+
2836
+
2837
+
2838
+ <label class="md-nav__link" for="__nav_2_10" id="__nav_2_10_label" tabindex="0">
2839
+ REST API
2840
+ <span class="md-nav__icon md-icon"></span>
2841
+ </label>
2842
+
2843
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_10_label" aria-expanded="false">
2844
+ <label class="md-nav__title" for="__nav_2_10">
2845
+ <span class="md-nav__icon md-icon"></span>
2846
+ REST API
2847
+ </label>
2848
+ <ul class="md-nav__list" data-md-scrollfix>
2849
+
2850
+
2851
+
2852
+
2853
+
2854
+
2855
+ <li class="md-nav__item">
2856
+ <a href="../rest-api/overview.html" class="md-nav__link">
2857
+ Overview
2858
+ </a>
2859
+ </li>
2860
+
2861
+
2862
+
2863
+
2864
+
2865
+
2866
+
2867
+
2868
+
2869
+ <li class="md-nav__item">
2870
+ <a href="../rest-api/filtering.html" class="md-nav__link">
2871
+ Filtering
2872
+ </a>
2873
+ </li>
2874
+
2875
+
2876
+
2877
+
2878
+
2879
+
2880
+
2881
+
2882
+
2883
+ <li class="md-nav__item">
2884
+ <a href="../rest-api/authentication.html" class="md-nav__link">
2885
+ Authentication
2886
+ </a>
2887
+ </li>
2888
+
2889
+
2890
+
2891
+
2892
+
2893
+
2894
+
2895
+
2896
+
2897
+ <li class="md-nav__item">
2898
+ <a href="../rest-api/ui-related-endpoints.html" class="md-nav__link">
2899
+ UI Endpoints
2900
+ </a>
2901
+ </li>
2902
+
2903
+
2904
+
2905
+
2906
+ </ul>
2907
+ </nav>
2908
+ </li>
2909
+
2910
+
2911
+
2912
+
2913
+
2914
+
2915
+
2916
+
2917
+
2918
+
2919
+ <li class="md-nav__item md-nav__item--nested">
2920
+
2921
+
2922
+
2923
+
2924
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_11" >
2925
+
2926
+
2927
+
2928
+ <label class="md-nav__link" for="__nav_2_11" id="__nav_2_11_label" tabindex="0">
2929
+ GraphQL API
2930
+ <span class="md-nav__icon md-icon"></span>
2931
+ </label>
2932
+
2933
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_11_label" aria-expanded="false">
2934
+ <label class="md-nav__title" for="__nav_2_11">
2935
+ <span class="md-nav__icon md-icon"></span>
2936
+ GraphQL API
2937
+ </label>
2938
+ <ul class="md-nav__list" data-md-scrollfix>
2939
+
2940
+
2941
+
2942
+
2943
+
2944
+
2945
+ <li class="md-nav__item">
2946
+ <a href="../additional-features/graphql.html" class="md-nav__link">
2947
+ Overview
2948
+ </a>
2949
+ </li>
2950
+
2951
+
2952
+
2953
+
2954
+ </ul>
2955
+ </nav>
2956
+ </li>
2957
+
2958
+
2959
+
2960
+
2961
+
2962
+
2963
+
2964
+
2965
+
2966
+ <li class="md-nav__item">
2967
+ <a href="../plugins/index.html" class="md-nav__link">
2968
+ Installing and Using Plugins
2969
+ </a>
2970
+ </li>
2971
+
2972
+
2973
+
2974
+
2975
+ </ul>
2976
+ </nav>
2977
+ </li>
2978
+
2979
+
2980
+
2981
+
2982
+
2983
+
2984
+
2985
+
2986
+
2987
+
2988
+
2989
+ <li class="md-nav__item md-nav__item--nested">
2990
+
2991
+
2992
+
2993
+
2994
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
2995
+
2996
+
2997
+
2998
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
2999
+ App Developer Guide
3000
+ <span class="md-nav__icon md-icon"></span>
3001
+ </label>
3002
+
3003
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
3004
+ <label class="md-nav__title" for="__nav_3">
3005
+ <span class="md-nav__icon md-icon"></span>
3006
+ App Developer Guide
3007
+ </label>
3008
+ <ul class="md-nav__list" data-md-scrollfix>
3009
+
3010
+
3011
+
3012
+
3013
+
3014
+
3015
+ <li class="md-nav__item">
3016
+ <a href="../plugins/development.html" class="md-nav__link">
3017
+ Developing Apps
3018
+ </a>
3019
+ </li>
3020
+
3021
+
3022
+
3023
+
3024
+
3025
+
3026
+
3027
+
3028
+
3029
+ <li class="md-nav__item">
3030
+ <a href="../plugins/porting-from-netbox.html" class="md-nav__link">
3031
+ Porting NetBox Plugins to Nautobot
3032
+ </a>
3033
+ </li>
3034
+
3035
+
3036
+
3037
+
3038
+
3039
+
3040
+
3041
+
3042
+
3043
+
3044
+ <li class="md-nav__item md-nav__item--nested">
3045
+
3046
+
3047
+
3048
+
3049
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" >
3050
+
3051
+
3052
+
3053
+ <label class="md-nav__link" for="__nav_3_3" id="__nav_3_3_label" tabindex="0">
3054
+ Code Reference
3055
+ <span class="md-nav__icon md-icon"></span>
3056
+ </label>
3057
+
3058
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
3059
+ <label class="md-nav__title" for="__nav_3_3">
3060
+ <span class="md-nav__icon md-icon"></span>
3061
+ Code Reference
3062
+ </label>
3063
+ <ul class="md-nav__list" data-md-scrollfix>
3064
+
3065
+
3066
+
3067
+
3068
+
3069
+
3070
+ <li class="md-nav__item">
3071
+ <a href="../code-reference/nautobot/apps/__init__.html" class="md-nav__link">
3072
+ nautobot.apps
3073
+ </a>
3074
+ </li>
3075
+
3076
+
3077
+
3078
+
3079
+
3080
+
3081
+
3082
+
3083
+
3084
+ <li class="md-nav__item">
3085
+ <a href="../code-reference/nautobot/apps/admin.html" class="md-nav__link">
3086
+ nautobot.apps.admin
3087
+ </a>
3088
+ </li>
3089
+
3090
+
3091
+
3092
+
3093
+
3094
+
3095
+
3096
+
3097
+
3098
+ <li class="md-nav__item">
3099
+ <a href="../code-reference/nautobot/apps/api.html" class="md-nav__link">
3100
+ nautobot.apps.api
3101
+ </a>
3102
+ </li>
3103
+
3104
+
3105
+
3106
+
3107
+
3108
+
3109
+
3110
+
3111
+
3112
+ <li class="md-nav__item">
3113
+ <a href="../code-reference/nautobot/apps/choices.html" class="md-nav__link">
3114
+ nautobot.apps.choices
3115
+ </a>
3116
+ </li>
3117
+
3118
+
3119
+
3120
+
3121
+
3122
+
3123
+
3124
+
3125
+
3126
+ <li class="md-nav__item">
3127
+ <a href="../code-reference/nautobot/apps/datasources.html" class="md-nav__link">
3128
+ nautobot.apps.datasources
3129
+ </a>
3130
+ </li>
3131
+
3132
+
3133
+
3134
+
3135
+
3136
+
3137
+
3138
+
3139
+
3140
+ <li class="md-nav__item">
3141
+ <a href="../code-reference/nautobot/apps/filters.html" class="md-nav__link">
3142
+ nautobot.apps.filters
3143
+ </a>
3144
+ </li>
3145
+
3146
+
3147
+
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+
3154
+ <li class="md-nav__item">
3155
+ <a href="../code-reference/nautobot/apps/forms.html" class="md-nav__link">
3156
+ nautobot.apps.forms
3157
+ </a>
3158
+ </li>
3159
+
3160
+
3161
+
3162
+
3163
+
3164
+
3165
+
3166
+
3167
+
3168
+ <li class="md-nav__item">
3169
+ <a href="../code-reference/nautobot/apps/models.html" class="md-nav__link">
3170
+ nautobot.apps.models
3171
+ </a>
3172
+ </li>
3173
+
3174
+
3175
+
3176
+
3177
+
3178
+
3179
+
3180
+
3181
+
3182
+ <li class="md-nav__item">
3183
+ <a href="../code-reference/nautobot/apps/secrets.html" class="md-nav__link">
3184
+ nautobot.apps.secrets
3185
+ </a>
3186
+ </li>
3187
+
3188
+
3189
+
3190
+
3191
+
3192
+
3193
+
3194
+
3195
+
3196
+ <li class="md-nav__item">
3197
+ <a href="../code-reference/nautobot/apps/tables.html" class="md-nav__link">
3198
+ nautobot.apps.tables
3199
+ </a>
3200
+ </li>
3201
+
3202
+
3203
+
3204
+
3205
+
3206
+
3207
+
3208
+
3209
+
3210
+ <li class="md-nav__item">
3211
+ <a href="../code-reference/nautobot/apps/testing.html" class="md-nav__link">
3212
+ nautobot.apps.testing
3213
+ </a>
3214
+ </li>
3215
+
3216
+
3217
+
3218
+
3219
+
3220
+
3221
+
3222
+
3223
+
3224
+ <li class="md-nav__item">
3225
+ <a href="../code-reference/nautobot/apps/ui.html" class="md-nav__link">
3226
+ nautobot.apps.ui
3227
+ </a>
3228
+ </li>
3229
+
3230
+
3231
+
3232
+
3233
+
3234
+
3235
+
3236
+
3237
+
3238
+ <li class="md-nav__item">
3239
+ <a href="../code-reference/nautobot/apps/urls.html" class="md-nav__link">
3240
+ nautobot.apps.urls
3241
+ </a>
3242
+ </li>
3243
+
3244
+
3245
+
3246
+
3247
+
3248
+
3249
+
3250
+
3251
+
3252
+ <li class="md-nav__item">
3253
+ <a href="../code-reference/nautobot/apps/views.html" class="md-nav__link">
3254
+ nautobot.apps.views
3255
+ </a>
3256
+ </li>
3257
+
3258
+
3259
+
3260
+
3261
+ </ul>
3262
+ </nav>
3263
+ </li>
3264
+
3265
+
3266
+
3267
+
3268
+ </ul>
3269
+ </nav>
3270
+ </li>
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+
3278
+
3279
+
3280
+
3281
+
3282
+ <li class="md-nav__item md-nav__item--nested">
3283
+
3284
+
3285
+
3286
+
3287
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
3288
+
3289
+
3290
+
3291
+ <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
3292
+ Core Developer Guide
3293
+ <span class="md-nav__icon md-icon"></span>
3294
+ </label>
3295
+
3296
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
3297
+ <label class="md-nav__title" for="__nav_4">
3298
+ <span class="md-nav__icon md-icon"></span>
3299
+ Core Developer Guide
3300
+ </label>
3301
+ <ul class="md-nav__list" data-md-scrollfix>
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+
3308
+ <li class="md-nav__item">
3309
+ <a href="index.html" class="md-nav__link">
3310
+ Introduction
3311
+ </a>
3312
+ </li>
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+
3321
+
3322
+ <li class="md-nav__item">
3323
+ <a href="getting-started.html" class="md-nav__link">
3324
+ Getting Started
3325
+ </a>
3326
+ </li>
3327
+
3328
+
3329
+
3330
+
3331
+
3332
+
3333
+
3334
+
3335
+
3336
+ <li class="md-nav__item">
3337
+ <a href="docker-compose-advanced-use-cases.html" class="md-nav__link">
3338
+ Advanced Docker Compose Usage
3339
+ </a>
3340
+ </li>
3341
+
3342
+
3343
+
3344
+
3345
+
3346
+
3347
+
3348
+
3349
+
3350
+ <li class="md-nav__item">
3351
+ <a href="best-practices.html" class="md-nav__link">
3352
+ Best Practices
3353
+ </a>
3354
+ </li>
3355
+
3356
+
3357
+
3358
+
3359
+
3360
+
3361
+
3362
+
3363
+
3364
+ <li class="md-nav__item">
3365
+ <a href="style-guide.html" class="md-nav__link">
3366
+ Style Guide
3367
+ </a>
3368
+ </li>
3369
+
3370
+
3371
+
3372
+
3373
+
3374
+
3375
+
3376
+
3377
+
3378
+ <li class="md-nav__item">
3379
+ <a href="extending-models.html" class="md-nav__link">
3380
+ Extending Models
3381
+ </a>
3382
+ </li>
3383
+
3384
+
3385
+
3386
+
3387
+
3388
+
3389
+
3390
+
3391
+
3392
+ <li class="md-nav__item">
3393
+ <a href="testing.html" class="md-nav__link">
3394
+ Testing
3395
+ </a>
3396
+ </li>
3397
+
3398
+
3399
+
3400
+
3401
+
3402
+
3403
+
3404
+
3405
+
3406
+ <li class="md-nav__item">
3407
+ <a href="application-registry.html" class="md-nav__link">
3408
+ Application Registry
3409
+ </a>
3410
+ </li>
3411
+
3412
+
3413
+
3414
+
3415
+
3416
+
3417
+
3418
+
3419
+
3420
+ <li class="md-nav__item">
3421
+ <a href="model-features.html" class="md-nav__link">
3422
+ Model Features
3423
+ </a>
3424
+ </li>
3425
+
3426
+
3427
+
3428
+
3429
+
3430
+
3431
+
3432
+
3433
+
3434
+ <li class="md-nav__item">
3435
+ <a href="natural-keys.html" class="md-nav__link">
3436
+ Natural Keys
3437
+ </a>
3438
+ </li>
3439
+
3440
+
3441
+
3442
+
3443
+
3444
+
3445
+
3446
+
3447
+
3448
+ <li class="md-nav__item">
3449
+ <a href="templates.html" class="md-nav__link">
3450
+ Page Templates
3451
+ </a>
3452
+ </li>
3453
+
3454
+
3455
+
3456
+
3457
+
3458
+
3459
+
3460
+
3461
+
3462
+ <li class="md-nav__item">
3463
+ <a href="navigation-menu.html" class="md-nav__link">
3464
+ Navigation Menu
3465
+ </a>
3466
+ </li>
3467
+
3468
+
3469
+
3470
+
3471
+
3472
+
3473
+
3474
+
3475
+
3476
+ <li class="md-nav__item">
3477
+ <a href="homepage.html" class="md-nav__link">
3478
+ Home Page Panels
3479
+ </a>
3480
+ </li>
3481
+
3482
+
3483
+
3484
+
3485
+
3486
+
3487
+
3488
+
3489
+
3490
+ <li class="md-nav__item">
3491
+ <a href="user-preferences.html" class="md-nav__link">
3492
+ User Preferences
3493
+ </a>
3494
+ </li>
3495
+
3496
+
3497
+
3498
+
3499
+
3500
+
3501
+
3502
+
3503
+
3504
+ <li class="md-nav__item">
3505
+ <a href="release-checklist.html" class="md-nav__link">
3506
+ Release Checklist
3507
+ </a>
3508
+ </li>
3509
+
3510
+
3511
+
3512
+
3513
+ </ul>
3514
+ </nav>
3515
+ </li>
3516
+
3517
+
3518
+
3519
+
3520
+
3521
+
3522
+
3523
+
3524
+
3525
+
3526
+
3527
+ <li class="md-nav__item md-nav__item--nested">
3528
+
3529
+
3530
+
3531
+
3532
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
3533
+
3534
+
3535
+
3536
+ <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
3537
+ Release Notes
3538
+ <span class="md-nav__icon md-icon"></span>
3539
+ </label>
3540
+
3541
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
3542
+ <label class="md-nav__title" for="__nav_5">
3543
+ <span class="md-nav__icon md-icon"></span>
3544
+ Release Notes
3545
+ </label>
3546
+ <ul class="md-nav__list" data-md-scrollfix>
3547
+
3548
+
3549
+
3550
+
3551
+
3552
+
3553
+ <li class="md-nav__item">
3554
+ <a href="../release-notes/index.html" class="md-nav__link">
3555
+ Overview
3556
+ </a>
3557
+ </li>
3558
+
3559
+
3560
+
3561
+
3562
+
3563
+
3564
+
3565
+
3566
+
3567
+ <li class="md-nav__item">
3568
+ <a href="../release-notes/version-2.0.html" class="md-nav__link">
3569
+ Version 2.0
3570
+ </a>
3571
+ </li>
3572
+
3573
+
3574
+
3575
+
3576
+
3577
+
3578
+
3579
+
3580
+
3581
+ <li class="md-nav__item">
3582
+ <a href="../release-notes/version-1.5.html" class="md-nav__link">
3583
+ Version 1.5
3584
+ </a>
3585
+ </li>
3586
+
3587
+
3588
+
3589
+
3590
+
3591
+
3592
+
3593
+
3594
+
3595
+ <li class="md-nav__item">
3596
+ <a href="../release-notes/version-1.4.html" class="md-nav__link">
3597
+ Version 1.4
3598
+ </a>
3599
+ </li>
3600
+
3601
+
3602
+
3603
+
3604
+
3605
+
3606
+
3607
+
3608
+
3609
+ <li class="md-nav__item">
3610
+ <a href="../release-notes/version-1.3.html" class="md-nav__link">
3611
+ Version 1.3
3612
+ </a>
3613
+ </li>
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+ <li class="md-nav__item">
3624
+ <a href="../release-notes/version-1.2.html" class="md-nav__link">
3625
+ Version 1.2
3626
+ </a>
3627
+ </li>
3628
+
3629
+
3630
+
3631
+
3632
+
3633
+
3634
+
3635
+
3636
+
3637
+ <li class="md-nav__item">
3638
+ <a href="../release-notes/version-1.1.html" class="md-nav__link">
3639
+ Version 1.1
3640
+ </a>
3641
+ </li>
3642
+
3643
+
3644
+
3645
+
3646
+
3647
+
3648
+
3649
+
3650
+
3651
+ <li class="md-nav__item">
3652
+ <a href="../release-notes/version-1.0.html" class="md-nav__link">
3653
+ Version 1.0
3654
+ </a>
3655
+ </li>
3656
+
3657
+
3658
+
3659
+
3660
+ </ul>
3661
+ </nav>
3662
+ </li>
3663
+
3664
+
3665
+
3666
+
3667
+
3668
+
3669
+
3670
+
3671
+
3672
+
3673
+
3674
+ <li class="md-nav__item md-nav__item--nested">
3675
+
3676
+
3677
+
3678
+
3679
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
3680
+
3681
+
3682
+
3683
+ <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
3684
+ Nautobot Apps
3685
+ <span class="md-nav__icon md-icon"></span>
3686
+ </label>
3687
+
3688
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
3689
+ <label class="md-nav__title" for="__nav_6">
3690
+ <span class="md-nav__icon md-icon"></span>
3691
+ Nautobot Apps
3692
+ </label>
3693
+ <ul class="md-nav__list" data-md-scrollfix>
3694
+
3695
+
3696
+
3697
+
3698
+
3699
+
3700
+ <li class="md-nav__item">
3701
+ <a href="../apps/index.html" class="md-nav__link">
3702
+ Overview
3703
+ </a>
3704
+ </li>
3705
+
3706
+
3707
+
3708
+
3709
+
3710
+
3711
+
3712
+
3713
+
3714
+
3715
+ <li class="md-nav__item md-nav__item--nested">
3716
+
3717
+
3718
+
3719
+
3720
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_2" >
3721
+
3722
+
3723
+
3724
+ <label class="md-nav__link" for="__nav_6_2" id="__nav_6_2_label" tabindex="0">
3725
+ Network to Code App Docs
3726
+ <span class="md-nav__icon md-icon"></span>
3727
+ </label>
3728
+
3729
+ <nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_2_label" aria-expanded="false">
3730
+ <label class="md-nav__title" for="__nav_6_2">
3731
+ <span class="md-nav__icon md-icon"></span>
3732
+ Network to Code App Docs
3733
+ </label>
3734
+ <ul class="md-nav__list" data-md-scrollfix>
3735
+
3736
+
3737
+
3738
+
3739
+
3740
+
3741
+ <li class="md-nav__item">
3742
+ <a href="https://docs.nautobot.com/projects/chatops/en/latest/" class="md-nav__link">
3743
+ Nautobot ChatOps
3744
+ </a>
3745
+ </li>
3746
+
3747
+
3748
+
3749
+
3750
+
3751
+
3752
+
3753
+
3754
+
3755
+ <li class="md-nav__item">
3756
+ <a href="https://docs.nautobot.com/projects/circuit-maintenance/en/latest/" class="md-nav__link">
3757
+ Nautobot Circuit Maintenance
3758
+ </a>
3759
+ </li>
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+ <li class="md-nav__item">
3770
+ <a href="https://docs.nautobot.com/projects/device-lifecycle/en/latest/" class="md-nav__link">
3771
+ Nautobot Device LifeCycle Management
3772
+ </a>
3773
+ </li>
3774
+
3775
+
3776
+
3777
+
3778
+
3779
+
3780
+
3781
+
3782
+
3783
+ <li class="md-nav__item">
3784
+ <a href="https://docs.nautobot.com/projects/device-onboarding/en/latest/" class="md-nav__link">
3785
+ Nautobot Device Onboarding
3786
+ </a>
3787
+ </li>
3788
+
3789
+
3790
+
3791
+
3792
+
3793
+
3794
+
3795
+
3796
+
3797
+ <li class="md-nav__item">
3798
+ <a href="https://nautobot-plugin-firewall-models.readthedocs.io/en/latest/" class="md-nav__link">
3799
+ Nautobot Firewall Models
3800
+ </a>
3801
+ </li>
3802
+
3803
+
3804
+
3805
+
3806
+
3807
+
3808
+
3809
+
3810
+
3811
+ <li class="md-nav__item">
3812
+ <a href="https://docs.nautobot.com/projects/golden-config/" class="md-nav__link">
3813
+ Nautobot Golden Configuration
3814
+ </a>
3815
+ </li>
3816
+
3817
+
3818
+
3819
+
3820
+
3821
+
3822
+
3823
+
3824
+
3825
+ <li class="md-nav__item">
3826
+ <a href="https://docs.nautobot.com/projects/plugin-nornir/en/latest/" class="md-nav__link">
3827
+ Nautobot Plugin Nornir
3828
+ </a>
3829
+ </li>
3830
+
3831
+
3832
+
3833
+
3834
+
3835
+
3836
+
3837
+
3838
+
3839
+ <li class="md-nav__item">
3840
+ <a href="https://docs.nautobot.com/projects/ssot/en/latest/" class="md-nav__link">
3841
+ Nautobot Single Source of Truth
3842
+ </a>
3843
+ </li>
3844
+
3845
+
3846
+
3847
+
3848
+ </ul>
3849
+ </nav>
3850
+ </li>
3851
+
3852
+
3853
+
3854
+
3855
+
3856
+
3857
+
3858
+
3859
+
3860
+ <li class="md-nav__item">
3861
+ <a href="../apps/nautobot-apps.html" class="md-nav__link">
3862
+ Community Apps
3863
+ </a>
3864
+ </li>
3865
+
3866
+
3867
+
3868
+
3869
+ </ul>
3870
+ </nav>
3871
+ </li>
3872
+
3873
+
3874
+
3875
+
3876
+
3877
+
3878
+
3879
+
3880
+
3881
+
3882
+ <li class="md-nav__item">
3883
+ <a href="https://docs.nautobot.com/" class="md-nav__link">
3884
+ Nautobot Docs Home ↗︎
3885
+ </a>
3886
+ </li>
3887
+
3888
+
3889
+
3890
+ </ul>
3891
+ </nav>
3892
+ </div>
3893
+ </div>
3894
+ </div>
3895
+
3896
+
3897
+
3898
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
3899
+ <div class="md-sidebar__scrollwrap">
3900
+ <div class="md-sidebar__inner">
3901
+
3902
+
3903
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
3904
+
3905
+
3906
+
3907
+
3908
+
3909
+
3910
+ <label class="md-nav__title" for="__toc">
3911
+ <span class="md-nav__icon md-icon"></span>
3912
+ Table of contents
3913
+ </label>
3914
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
3915
+
3916
+ <li class="md-nav__item">
3917
+ <a href="#introduction" class="md-nav__link">
3918
+ Introduction
3919
+ </a>
3920
+
3921
+ </li>
3922
+
3923
+ <li class="md-nav__item">
3924
+ <a href="#design-patterns" class="md-nav__link">
3925
+ Design Patterns
3926
+ </a>
3927
+
3928
+ <nav class="md-nav" aria-label="Design Patterns">
3929
+ <ul class="md-nav__list">
3930
+
3931
+ <li class="md-nav__item">
3932
+ <a href="#state-management" class="md-nav__link">
3933
+ State Management
3934
+ </a>
3935
+
3936
+ </li>
3937
+
3938
+ <li class="md-nav__item">
3939
+ <a href="#hooks" class="md-nav__link">
3940
+ Hooks
3941
+ </a>
3942
+
3943
+ </li>
3944
+
3945
+ </ul>
3946
+ </nav>
3947
+
3948
+ </li>
3949
+
3950
+ <li class="md-nav__item">
3951
+ <a href="#getting-started-with-development" class="md-nav__link">
3952
+ Getting Started With Development
3953
+ </a>
3954
+
3955
+ <nav class="md-nav" aria-label="Getting Started With Development">
3956
+ <ul class="md-nav__list">
3957
+
3958
+ <li class="md-nav__item">
3959
+ <a href="#documenting-your-code" class="md-nav__link">
3960
+ Documenting Your Code
3961
+ </a>
3962
+
3963
+ </li>
3964
+
3965
+ <li class="md-nav__item">
3966
+ <a href="#linting-formatting" class="md-nav__link">
3967
+ Linting &amp; Formatting
3968
+ </a>
3969
+
3970
+ <nav class="md-nav" aria-label="Linting &amp; Formatting">
3971
+ <ul class="md-nav__list">
3972
+
3973
+ <li class="md-nav__item">
3974
+ <a href="#linting" class="md-nav__link">
3975
+ Linting
3976
+ </a>
3977
+
3978
+ </li>
3979
+
3980
+ <li class="md-nav__item">
3981
+ <a href="#formatting" class="md-nav__link">
3982
+ Formatting
3983
+ </a>
3984
+
3985
+ </li>
3986
+
3987
+ </ul>
3988
+ </nav>
3989
+
3990
+ </li>
3991
+
3992
+ </ul>
3993
+ </nav>
3994
+
3995
+ </li>
3996
+
3997
+ <li class="md-nav__item">
3998
+ <a href="#additional-links" class="md-nav__link">
3999
+ Additional Links
4000
+ </a>
4001
+
4002
+ </li>
4003
+
4004
+ </ul>
4005
+
4006
+ </nav>
4007
+ </div>
4008
+ </div>
4009
+ </div>
4010
+
4011
+
4012
+
4013
+ <div class="md-content" data-md-component="content">
4014
+ <article class="md-content__inner md-typeset">
4015
+
4016
+
4017
+
4018
+
4019
+
4020
+
4021
+
4022
+ <h1 id="building-the-react-ui">Building the React UI<a class="headerlink" href="#building-the-react-ui" title="Permanent link">&para;</a></h1>
4023
+ <h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">&para;</a></h2>
4024
+ <p>Nautobot 2.0 introduces a new user interface built on React. This new UI will eventually be a complete replacement for the previous Django-based UI. It currently prioritizes read-only operations for core views. In subsequent releases, more operations and features will become available in this new UI.</p>
4025
+ <h2 id="design-patterns">Design Patterns<a class="headerlink" href="#design-patterns" title="Permanent link">&para;</a></h2>
4026
+ <p>A key change with moving to a client-side application for the user interface is that the application is now stateful. This means that the application is aware of the current state of the user interface, and can update the UI without requiring a page refresh. This is a significant change from the previous Django-based UI, which was stateless. In order to achieve this, a perspective on how the UI is rendered is required. Since much of the data is retrieved from the API, the UI is rendered in two phases:</p>
4027
+ <ul>
4028
+ <li><strong>Phase 1</strong>: The UI is rendered with placeholder data, and the API is queried for the actual data</li>
4029
+ <li><strong>Phase 2</strong>: The UI is re-rendered with the actual data</li>
4030
+ </ul>
4031
+ <p>This encourages the UI to be built in a way that is resilient to changes in the data, and allows the UI to be updated without requiring a page refresh. Placeholder data can either be empty, for example on a list view this is easy: an empty list <code>[]</code>. But in more complex cases, a view may choose to show a loading indicator until the data is available.</p>
4032
+ <p>In most cases, we build the UI with the preference we only display the final component once the data is available and display a loading indicator until then.</p>
4033
+ <h3 id="state-management">State Management<a class="headerlink" href="#state-management" title="Permanent link">&para;</a></h3>
4034
+ <p>The React UI is built with a concept of state management, which is handled by Redux. There is a single state store that is used to manage the state of the entire application, split into two core sections:</p>
4035
+ <ul>
4036
+ <li><strong>Application State</strong>: Managed by Redux<ul>
4037
+ <li>Is the user logged in?</li>
4038
+ <li>What is the current user?</li>
4039
+ <li>What is the current page?</li>
4040
+ <li>What are the models and navigation menu the user can access?</li>
4041
+ </ul>
4042
+ </li>
4043
+ <li><strong>API State</strong>: Managed by RTK Query (a subset library provided by Redux)<ul>
4044
+ <li>Previous responses to detail and list requests</li>
4045
+ </ul>
4046
+ </li>
4047
+ </ul>
4048
+ <p>These sections are known as "slices" of state, and have their own methods for updating and retrieving state. For more information on Redux, see the <a href="https://redux.js.org/">Redux documentation</a>.</p>
4049
+ <h3 id="hooks">Hooks<a class="headerlink" href="#hooks" title="Permanent link">&para;</a></h3>
4050
+ <p>The React UI uses hooks to manage state and side effects. Hooks are functions that let you "hook into" React state and lifecycle features. To learn more about hooks, see the <a href="https://react.dev/reference/react">React Hooks documentation</a>.</p>
4051
+ <h2 id="getting-started-with-development">Getting Started With Development<a class="headerlink" href="#getting-started-with-development" title="Permanent link">&para;</a></h2>
4052
+ <p>The libraries and tools used to build the React UI are:</p>
4053
+ <ul>
4054
+ <li><a href="https://reactjs.org/">React</a></li>
4055
+ <li><a href="https://reactrouter.com/">React Router</a></li>
4056
+ <li><a href="https://chakra-ui.com/">Chakra UI</a></li>
4057
+ <li><a href="https://redux.js.org/">Redux</a></li>
4058
+ <li><a href="https://react-redux.js.org/">React Redux</a></li>
4059
+ <li><a href="https://redux-toolkit.js.org/rtk-query/overview">RTK Query</a></li>
4060
+ </ul>
4061
+ <h3 id="documenting-your-code">Documenting Your Code<a class="headerlink" href="#documenting-your-code" title="Permanent link">&para;</a></h3>
4062
+ <p>The UI uses JS Doc to document the code. For more information on JS Doc, see the <a href="https://jsdoc.app/">JS Doc website</a>.</p>
4063
+ <p>We prefer to use the <code>@param</code> and <code>@returns</code> tags to document the parameters and return values of functions. For example:</p>
4064
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="cm">/**</span>
4065
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="cm"> * Given an API payload with session information, updates the state with the session information</span>
4066
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="cm"> * @param {Object} state - The current state</span>
4067
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="cm"> * @param {Object} action - The called-with payload and action type</span>
4068
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="cm"> * @returns The updated state</span>
4069
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="cm"> */</span>
4070
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a><span class="nx">updateAuthStateWithSession</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">action</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
4071
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="w"> </span><span class="c1">//... </span>
4072
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="p">}</span>
4073
+ </code></pre></div>
4074
+ <h3 id="linting-formatting">Linting &amp; Formatting<a class="headerlink" href="#linting-formatting" title="Permanent link">&para;</a></h3>
4075
+ <h4 id="linting">Linting<a class="headerlink" href="#linting" title="Permanent link">&para;</a></h4>
4076
+ <p>The UI uses ESLint to lint the code. For more information on ESLint, see the <a href="https://eslint.org/">ESLint website</a>.</p>
4077
+ <p>To check for linting errors, run the following command:</p>
4078
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>invoke<span class="w"> </span>eslint
4079
+ </code></pre></div>
4080
+ <p>To automatically fix some linting errors, run the following command:</p>
4081
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>invoke<span class="w"> </span>eslint<span class="w"> </span>-a
4082
+ </code></pre></div>
4083
+ <h4 id="formatting">Formatting<a class="headerlink" href="#formatting" title="Permanent link">&para;</a></h4>
4084
+ <p>The UI uses Prettier to format the code. For more information on Prettier, see the <a href="https://prettier.io/">Prettier website</a>.</p>
4085
+ <p>To check for linting errors, run the following command:</p>
4086
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>invoke<span class="w"> </span>prettier
4087
+ </code></pre></div>
4088
+ <p>To automatically format the code, run the following command:</p>
4089
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>invoke<span class="w"> </span>prettier<span class="w"> </span>-a
4090
+ </code></pre></div>
4091
+ <h2 id="additional-links">Additional Links<a class="headerlink" href="#additional-links" title="Permanent link">&para;</a></h2>
4092
+ <p>Here are some links to resources that may be helpful when working with the React UI:</p>
4093
+ <ul>
4094
+ <li><a href="https://react.dev/learn/synchronizing-with-effects">React and Effects</a></li>
4095
+ <li><a href="https://redux-toolkit.js.org/rtk-query/usage/queries#query-hook-options">RTK Query and Asynchronous Hooks</a></li>
4096
+ <li><a href="https://react-redux.js.org/api/hooks#usedispatch">Using useDispatch</a></li>
4097
+ </ul>
4098
+
4099
+
4100
+
4101
+
4102
+
4103
+
4104
+ </article>
4105
+ </div>
4106
+
4107
+
4108
+ </div>
4109
+
4110
+ </main>
4111
+
4112
+ <footer class="md-footer">
4113
+
4114
+ <div class="md-footer-meta md-typeset">
4115
+ <div class="md-footer-meta__inner md-grid">
4116
+ <div class="md-copyright">
4117
+
4118
+ <div class="md-copyright__highlight">
4119
+ Copyright &copy; The Authors
4120
+ </div>
4121
+ <a href="https://github.com/nautobot/nautobot/blob/main/LICENSE.txt">Apache-2.0 LICENSE</a>
4122
+
4123
+ </div>
4124
+
4125
+ <div class="md-copyright">
4126
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">Made with Material for MkDocs</a>
4127
+ | <a href="https://www.networktocode.com/community/" target="_blank" rel="noopener">Join Nautobot Slack</a>
4128
+
4129
+ | <a href="https://networktocode.com" target="_blank" rel="noopener">Sponsored by <img
4130
+ src=../assets/networktocode_bw.png class="copyright-logo"></a>
4131
+
4132
+ </div>
4133
+
4134
+ <!-- RTD version flyout injected on live site -->
4135
+ <div id="readthedocs-embed-flyout"></div>
4136
+
4137
+ <div class="md-social">
4138
+
4139
+
4140
+
4141
+
4142
+
4143
+ <a href="https://blog.networktocode.com/blog/tags/nautobot" target="_blank" rel="noopener" title="Network to Code Blog" class="md-social__link">
4144
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M0 64c0-17.7 14.3-32 32-32 229.8 0 416 186.2 416 416 0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96 14.3 96 0 81.7 0 64zm0 352a64 64 0 1 1 128 0 64 64 0 1 1-128 0zm32-256c159.1 0 288 128.9 288 288 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224-17.7 0-32-14.3-32-32s14.3-32 32-32z"/></svg>
4145
+ </a>
4146
+
4147
+
4148
+
4149
+
4150
+
4151
+ <a href="https://www.youtube.com/playlist?list=PLjA0bhxgryJ2Ts4GJMDA-tPzVWEncv4pb" target="_blank" rel="noopener" title="Nautobot Videos" class="md-social__link">
4152
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"/></svg>
4153
+ </a>
4154
+
4155
+
4156
+
4157
+
4158
+
4159
+ <a href="https://www.networktocode.com/community/" target="_blank" rel="noopener" title="Network to Code Community" class="md-social__link">
4160
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1c0-25.9 21.16-47.06 47.06-47.06h47.06v47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V315.1zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06H164.9zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06H164.9zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06h-47.06V196.9zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06V196.9zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06v-47.06h47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06 0-25.9 21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06H283.1z"/></svg>
4161
+ </a>
4162
+
4163
+
4164
+
4165
+
4166
+
4167
+ <a href="https://github.com/nautobot/nautobot" target="_blank" rel="noopener" title="GitHub Repo" class="md-social__link">
4168
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
4169
+ </a>
4170
+
4171
+
4172
+
4173
+
4174
+
4175
+ <a href="https://twitter.com/networktocode" target="_blank" rel="noopener" title="Network to Code Twitter" class="md-social__link">
4176
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
4177
+ </a>
4178
+
4179
+ </div>
4180
+
4181
+ </div>
4182
+ </div>
4183
+ </footer>
4184
+
4185
+ </div>
4186
+ <div class="md-dialog" data-md-component="dialog">
4187
+ <div class="md-dialog__inner md-typeset"></div>
4188
+ </div>
4189
+
4190
+ <script id="__config" type="application/json">{"base": "..", "features": ["navigation.tracking", "navigation.tabs", "navigation.tabs.sticky", "search.suggest", "search.highlight", "search.share"], "search": "../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
4191
+
4192
+
4193
+ <script src="../assets/javascripts/bundle.51198bba.min.js"></script>
4194
+
4195
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
4196
+
4197
+
4198
+ </body>
4199
+ </html>