nautobot 2.1.0b1__py3-none-any.whl → 2.1.1__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 (1002) hide show
  1. nautobot/__init__.py +1 -3
  2. nautobot/apps/__init__.py +1 -2
  3. nautobot/apps/admin.py +0 -1
  4. nautobot/apps/api.py +0 -1
  5. nautobot/apps/change_logging.py +0 -1
  6. nautobot/apps/choices.py +0 -3
  7. nautobot/apps/datasources.py +2 -2
  8. nautobot/apps/exceptions.py +0 -1
  9. nautobot/apps/factory.py +0 -1
  10. nautobot/apps/filters.py +6 -9
  11. nautobot/apps/forms.py +1 -2
  12. nautobot/apps/graphql.py +0 -1
  13. nautobot/apps/jobs.py +2 -1
  14. nautobot/apps/models.py +4 -2
  15. nautobot/apps/querysets.py +0 -1
  16. nautobot/apps/secrets.py +0 -1
  17. nautobot/apps/tables.py +0 -1
  18. nautobot/apps/testing.py +0 -1
  19. nautobot/apps/ui.py +1 -3
  20. nautobot/apps/urls.py +0 -1
  21. nautobot/apps/utils.py +0 -1
  22. nautobot/apps/views.py +0 -1
  23. nautobot/circuits/api/serializers.py +1 -1
  24. nautobot/circuits/api/urls.py +1 -1
  25. nautobot/circuits/api/views.py +2 -1
  26. nautobot/circuits/apps.py +1 -1
  27. nautobot/circuits/choices.py +0 -1
  28. nautobot/circuits/factory.py +1 -1
  29. nautobot/circuits/filters.py +2 -1
  30. nautobot/circuits/forms.py +2 -2
  31. nautobot/circuits/homepage.py +0 -1
  32. nautobot/circuits/migrations/0001_initial_part_1.py +3 -1
  33. nautobot/circuits/migrations/0002_initial_part_2.py +2 -1
  34. nautobot/circuits/migrations/0003_auto_slug.py +1 -0
  35. nautobot/circuits/migrations/0005_providernetwork.py +4 -2
  36. nautobot/circuits/migrations/0013_alter_circuittermination__path.py +1 -0
  37. nautobot/circuits/migrations/0014_related_name_changes.py +1 -0
  38. nautobot/circuits/migrations/0016_tagsfield.py +1 -0
  39. nautobot/circuits/migrations/0018_status_nonnullable.py +1 -0
  40. nautobot/circuits/models.py +2 -2
  41. nautobot/circuits/navigation.py +0 -1
  42. nautobot/circuits/signals.py +3 -2
  43. nautobot/circuits/tables.py +1 -0
  44. nautobot/circuits/tests/integration/test_relationships.py +1 -1
  45. nautobot/circuits/tests/test_api.py +1 -1
  46. nautobot/circuits/tests/test_urls.py +1 -1
  47. nautobot/circuits/tests/test_views.py +1 -0
  48. nautobot/circuits/urls.py +1 -1
  49. nautobot/circuits/views.py +1 -10
  50. nautobot/core/__init__.py +0 -1
  51. nautobot/core/admin.py +3 -5
  52. nautobot/core/api/__init__.py +0 -1
  53. nautobot/core/api/metadata.py +4 -6
  54. nautobot/core/api/pagination.py +2 -2
  55. nautobot/core/api/parsers.py +1 -3
  56. nautobot/core/api/renderers.py +0 -1
  57. nautobot/core/api/schema.py +2 -3
  58. nautobot/core/api/serializers.py +9 -7
  59. nautobot/core/api/urls.py +1 -5
  60. nautobot/core/api/utils.py +14 -15
  61. nautobot/core/api/versioning.py +1 -1
  62. nautobot/core/api/views.py +22 -91
  63. nautobot/core/apps/__init__.py +5 -7
  64. nautobot/core/authentication.py +1 -1
  65. nautobot/core/celery/__init__.py +1 -2
  66. nautobot/core/celery/control.py +0 -2
  67. nautobot/core/celery/encoders.py +0 -1
  68. nautobot/core/celery/schedulers.py +1 -2
  69. nautobot/core/celery/task.py +1 -1
  70. nautobot/core/checks.py +31 -2
  71. nautobot/core/choices.py +2 -2
  72. nautobot/core/cli/__init__.py +8 -17
  73. nautobot/core/context_processors.py +1 -5
  74. nautobot/core/factory.py +2 -2
  75. nautobot/core/filters.py +1 -1
  76. nautobot/core/forms/fields.py +2 -4
  77. nautobot/core/forms/forms.py +1 -1
  78. nautobot/core/forms/search.py +1 -1
  79. nautobot/core/forms/utils.py +1 -1
  80. nautobot/core/graphql/__init__.py +2 -3
  81. nautobot/core/graphql/generators.py +2 -2
  82. nautobot/core/graphql/schema.py +21 -8
  83. nautobot/core/graphql/schema_init.py +0 -1
  84. nautobot/core/graphql/types.py +10 -0
  85. nautobot/core/graphql/utils.py +1 -2
  86. nautobot/core/management/commands/generate_test_data.py +7 -6
  87. nautobot/core/management/commands/makemigrations.py +1 -1
  88. nautobot/core/management/commands/migrate.py +1 -1
  89. nautobot/core/management/commands/post_upgrade.py +1 -15
  90. nautobot/core/management/commands/refresh_content_type_cache.py +1 -2
  91. nautobot/core/management/commands/send_installation_metrics.py +2 -3
  92. nautobot/core/management/commands/validate_models.py +1 -1
  93. nautobot/core/middleware.py +2 -2
  94. nautobot/core/models/__init__.py +12 -12
  95. nautobot/core/models/fields.py +1 -1
  96. nautobot/core/models/generics.py +2 -3
  97. nautobot/core/models/managers.py +0 -1
  98. nautobot/core/models/name_color_content_types.py +2 -2
  99. nautobot/core/models/tree_queries.py +2 -4
  100. nautobot/core/models/validators.py +1 -1
  101. nautobot/core/releases.py +1 -1
  102. nautobot/core/runner/importer.py +2 -25
  103. nautobot/core/runner/runner.py +2 -2
  104. nautobot/core/runner/settings.py +1 -1
  105. nautobot/core/settings.py +15 -21
  106. nautobot/core/settings_funcs.py +1 -2
  107. nautobot/core/signals.py +0 -1
  108. nautobot/core/tables.py +1 -1
  109. nautobot/core/templates/admin/base.html +9 -9
  110. nautobot/core/templates/exceptions/programming_error.html +2 -2
  111. nautobot/core/templates/graphene/graphiql.html +9 -3
  112. nautobot/core/templates/home.html +26 -6
  113. nautobot/core/templates/inc/footer.html +0 -7
  114. nautobot/core/templates/inc/javascript.html +4 -2
  115. nautobot/core/templates/inc/media.html +2 -2
  116. nautobot/core/templates/inc/nav_menu.html +27 -25
  117. nautobot/core/templates/inc/object_details_advanced_panel.html +12 -0
  118. nautobot/core/templates/nautobot_config.py.j2 +4 -4
  119. nautobot/core/templates/utilities/theme_preview.html +883 -0
  120. nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
  121. nautobot/core/templatetags/buttons.py +2 -1
  122. nautobot/core/templatetags/helpers.py +45 -18
  123. nautobot/core/testing/__init__.py +1 -2
  124. nautobot/core/testing/api.py +2 -4
  125. nautobot/core/testing/filters.py +1 -1
  126. nautobot/core/testing/integration.py +2 -2
  127. nautobot/core/testing/migrations.py +1 -0
  128. nautobot/core/testing/mixins.py +1 -2
  129. nautobot/core/testing/schema.py +1 -1
  130. nautobot/core/testing/utils.py +3 -3
  131. nautobot/core/testing/views.py +8 -8
  132. nautobot/core/tests/integration/test_home.py +1 -1
  133. nautobot/core/tests/integration/test_navbar.py +2 -2
  134. nautobot/core/tests/integration/test_plugin_home.py +2 -1
  135. nautobot/core/tests/integration/test_plugin_navbar.py +6 -6
  136. nautobot/core/tests/nautobot_config.py +3 -3
  137. nautobot/core/tests/runner.py +3 -4
  138. nautobot/core/tests/test_api.py +6 -51
  139. nautobot/core/tests/test_authentication.py +2 -3
  140. nautobot/core/tests/test_checks.py +1 -2
  141. nautobot/core/tests/test_config.py +1 -1
  142. nautobot/core/tests/test_csv.py +4 -4
  143. nautobot/core/tests/test_factory.py +1 -3
  144. nautobot/core/tests/test_filters.py +4 -7
  145. nautobot/core/tests/test_forms.py +3 -6
  146. nautobot/core/tests/test_graphql.py +33 -17
  147. nautobot/core/tests/test_jinja_filters.py +5 -4
  148. nautobot/core/tests/test_jobs.py +1 -1
  149. nautobot/core/tests/test_models.py +28 -3
  150. nautobot/core/tests/test_navigations.py +2 -1
  151. nautobot/core/tests/test_openapi.py +0 -1
  152. nautobot/core/tests/test_paginator.py +2 -2
  153. nautobot/core/tests/test_releases.py +2 -2
  154. nautobot/core/tests/test_tables.py +1 -1
  155. nautobot/core/tests/test_templatetags_helpers.py +17 -2
  156. nautobot/core/tests/test_templatetags_netutils.py +1 -2
  157. nautobot/core/tests/test_utils.py +4 -8
  158. nautobot/core/tests/test_views.py +95 -1
  159. nautobot/core/tests/test_views_utils.py +0 -1
  160. nautobot/core/urls.py +24 -4
  161. nautobot/core/utils/color.py +1 -1
  162. nautobot/core/utils/data.py +1 -2
  163. nautobot/core/utils/filtering.py +4 -5
  164. nautobot/core/utils/git.py +6 -2
  165. nautobot/core/utils/logging.py +2 -1
  166. nautobot/core/utils/lookup.py +4 -6
  167. nautobot/core/utils/migrations.py +1 -0
  168. nautobot/core/utils/permissions.py +2 -4
  169. nautobot/core/utils/requests.py +10 -0
  170. nautobot/core/views/__init__.py +32 -8
  171. nautobot/core/views/generic.py +14 -13
  172. nautobot/core/views/mixins.py +24 -22
  173. nautobot/core/views/renderers.py +1 -1
  174. nautobot/core/views/routers.py +6 -0
  175. nautobot/core/views/utils.py +2 -1
  176. nautobot/dcim/api/urls.py +1 -1
  177. nautobot/dcim/api/views.py +6 -5
  178. nautobot/dcim/apps.py +1 -1
  179. nautobot/dcim/choices.py +4 -1
  180. nautobot/dcim/constants.py +0 -1
  181. nautobot/dcim/elevations.py +1 -2
  182. nautobot/dcim/factory.py +125 -13
  183. nautobot/dcim/fields.py +1 -0
  184. nautobot/dcim/filters/__init__.py +2 -3
  185. nautobot/dcim/filters/mixins.py +1 -1
  186. nautobot/dcim/forms.py +37 -44
  187. nautobot/dcim/graphql/types.py +16 -17
  188. nautobot/dcim/migrations/0001_initial_part_1.py +4 -2
  189. nautobot/dcim/migrations/0002_initial_part_2.py +2 -1
  190. nautobot/dcim/migrations/0003_initial_part_3.py +2 -1
  191. nautobot/dcim/migrations/0004_initial_part_4.py +2 -1
  192. nautobot/dcim/migrations/0006_auto_slug.py +1 -0
  193. nautobot/dcim/migrations/0009_add_natural_indexing.py +1 -0
  194. nautobot/dcim/migrations/0010_interface_status.py +1 -0
  195. nautobot/dcim/migrations/0011_interface_status_data_migration.py +1 -0
  196. nautobot/dcim/migrations/0013_location_location_type.py +4 -2
  197. nautobot/dcim/migrations/0014_location_status_data_migration.py +1 -0
  198. nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
  199. nautobot/dcim/migrations/0018_device_redundancy_group.py +4 -2
  200. nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +1 -0
  201. nautobot/dcim/migrations/0022_interface_redundancy_group.py +3 -1
  202. nautobot/dcim/migrations/0023_interface_redundancy_group_data_migration.py +1 -0
  203. nautobot/dcim/migrations/0024_move_site_fields_to_location_model.py +2 -1
  204. nautobot/dcim/migrations/0027_alter_interface_mac_address.py +1 -0
  205. nautobot/dcim/migrations/0028_alter_device_and_rack_role_add_new_role.py +1 -0
  206. nautobot/dcim/migrations/0029_device_and_rack_roles_data_migrations.py +1 -0
  207. nautobot/dcim/migrations/0033_add_tree_managers_and_foreign_keys_pre_data_migration.py +1 -0
  208. nautobot/dcim/migrations/0034_migrate_region_and_site_data_to_locations.py +1 -2
  209. nautobot/dcim/migrations/0038_fixup_fks_and_related_names.py +1 -0
  210. nautobot/dcim/migrations/0039_related_name_changes.py +1 -0
  211. nautobot/dcim/migrations/0042_alter_location_managers.py +1 -0
  212. nautobot/dcim/migrations/0044_tagsfield.py +1 -0
  213. nautobot/dcim/migrations/0047_status_nonnullable.py +1 -0
  214. nautobot/dcim/migrations/0051_interface_redundancy_group_nullable_status.py +1 -0
  215. nautobot/dcim/models/cables.py +3 -3
  216. nautobot/dcim/models/device_component_templates.py +6 -6
  217. nautobot/dcim/models/devices.py +9 -4
  218. nautobot/dcim/models/locations.py +6 -1
  219. nautobot/dcim/models/power.py +1 -1
  220. nautobot/dcim/models/racks.py +5 -4
  221. nautobot/dcim/navigation.py +0 -1
  222. nautobot/dcim/signals.py +3 -2
  223. nautobot/dcim/tables/__init__.py +5 -4
  224. nautobot/dcim/tables/cables.py +1 -0
  225. nautobot/dcim/tables/devices.py +1 -0
  226. nautobot/dcim/tables/locations.py +1 -1
  227. nautobot/dcim/tables/power.py +1 -0
  228. nautobot/dcim/tables/racks.py +2 -1
  229. nautobot/dcim/templates/dcim/device/consoleports.html +2 -2
  230. nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -2
  231. nautobot/dcim/templates/dcim/device/devicebays.html +1 -1
  232. nautobot/dcim/templates/dcim/device/frontports.html +2 -2
  233. nautobot/dcim/templates/dcim/device/interfaces.html +4 -4
  234. nautobot/dcim/templates/dcim/device/inventory.html +1 -1
  235. nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -2
  236. nautobot/dcim/templates/dcim/device/powerports.html +2 -2
  237. nautobot/dcim/templates/dcim/device/rearports.html +2 -2
  238. nautobot/dcim/templates/dcim/inc/location_hierarchy.html +4 -2
  239. nautobot/dcim/templates/dcim/rack.html +1 -1
  240. nautobot/dcim/templates/dcim/rack_elevation_list.html +1 -1
  241. nautobot/dcim/templates/dcim/rackreservation.html +1 -1
  242. nautobot/dcim/tests/test_api.py +7 -7
  243. nautobot/dcim/tests/test_cablepaths.py +0 -1
  244. nautobot/dcim/tests/test_filters.py +16 -13
  245. nautobot/dcim/tests/test_forms.py +2 -3
  246. nautobot/dcim/tests/test_graphql.py +1 -0
  247. nautobot/dcim/tests/test_migrations.py +2 -2
  248. nautobot/dcim/tests/test_models.py +2 -2
  249. nautobot/dcim/tests/test_views.py +77 -14
  250. nautobot/dcim/urls.py +3 -2
  251. nautobot/dcim/utils.py +1 -1
  252. nautobot/dcim/views.py +4 -3
  253. nautobot/extras/admin.py +2 -1
  254. nautobot/extras/api/customfields.py +0 -2
  255. nautobot/extras/api/mixins.py +0 -1
  256. nautobot/extras/api/serializers.py +4 -4
  257. nautobot/extras/api/urls.py +1 -1
  258. nautobot/extras/api/views.py +1 -1
  259. nautobot/extras/apps.py +3 -4
  260. nautobot/extras/choices.py +3 -18
  261. nautobot/extras/context_managers.py +1 -1
  262. nautobot/extras/datasources/__init__.py +3 -1
  263. nautobot/extras/datasources/git.py +33 -12
  264. nautobot/extras/datasources/utils.py +0 -1
  265. nautobot/extras/factory.py +20 -0
  266. nautobot/extras/filters/__init__.py +2 -3
  267. nautobot/extras/filters/customfields.py +0 -1
  268. nautobot/extras/filters/mixins.py +1 -1
  269. nautobot/extras/forms/__init__.py +3 -4
  270. nautobot/extras/forms/base.py +1 -1
  271. nautobot/extras/forms/forms.py +29 -11
  272. nautobot/extras/forms/mixins.py +1 -1
  273. nautobot/extras/graphql/types.py +2 -2
  274. nautobot/extras/health_checks.py +1 -1
  275. nautobot/extras/jobs.py +43 -25
  276. nautobot/extras/management/__init__.py +0 -1
  277. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -1
  278. nautobot/extras/management/commands/runjob.py +3 -3
  279. nautobot/extras/management/commands/webhook_receiver.py +1 -2
  280. nautobot/extras/migrations/0001_initial_part_1.py +2 -1
  281. nautobot/extras/migrations/0002_initial_part_2.py +2 -1
  282. nautobot/extras/migrations/0003_initial_part_3.py +1 -0
  283. nautobot/extras/migrations/0006_graphqlquery.py +2 -1
  284. nautobot/extras/migrations/0007_configcontextschema.py +3 -1
  285. nautobot/extras/migrations/0009_computedfield.py +3 -1
  286. nautobot/extras/migrations/0011_fileattachment_fileproxy.py +3 -1
  287. nautobot/extras/migrations/0012_healthchecktestmodel.py +2 -1
  288. nautobot/extras/migrations/0014_auto_slug.py +1 -0
  289. nautobot/extras/migrations/0015_scheduled_job.py +3 -1
  290. nautobot/extras/migrations/0016_secret.py +4 -2
  291. nautobot/extras/migrations/0017_joblogentry.py +2 -1
  292. nautobot/extras/migrations/0018_joblog_data_migration.py +2 -1
  293. nautobot/extras/migrations/0021_customfield_changelog_data.py +3 -2
  294. nautobot/extras/migrations/0022_objectchange_object_datav2.py +1 -0
  295. nautobot/extras/migrations/0023_job_model.py +4 -2
  296. nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +1 -0
  297. nautobot/extras/migrations/0029_dynamicgroup.py +3 -1
  298. nautobot/extras/migrations/0031_tag_content_types.py +1 -0
  299. nautobot/extras/migrations/0032_tag_content_types_data_migration.py +1 -0
  300. nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +2 -1
  301. nautobot/extras/migrations/0041_jobresult_job_kwargs.py +1 -0
  302. nautobot/extras/migrations/0043_note.py +3 -1
  303. nautobot/extras/migrations/0044_add_job_hook.py +3 -1
  304. nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +1 -0
  305. nautobot/extras/migrations/0047_enforce_custom_field_slug.py +1 -0
  306. nautobot/extras/migrations/0051_add_job_task_queues.py +1 -0
  307. nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +1 -0
  308. nautobot/extras/migrations/0057_jobbutton.py +3 -1
  309. nautobot/extras/migrations/0065_configcontext_data_migrations.py +1 -0
  310. nautobot/extras/migrations/0067_migrate_job_result_status.py +0 -1
  311. nautobot/extras/migrations/0068_jobresult__add_celery_fields.py +1 -0
  312. nautobot/extras/migrations/0071_replace_related_names.py +1 -0
  313. nautobot/extras/migrations/0077_migrate_custom_field_data.py +1 -0
  314. nautobot/extras/migrations/0078_remove_name_field_and_make_label_field_non_nullable.py +1 -0
  315. nautobot/extras/migrations/0080_tagsfield.py +1 -0
  316. nautobot/extras/migrations/0082_rename_relationship_name_to_label.py +1 -0
  317. nautobot/extras/migrations/0083_ensure_relationship_keys_are_unique.py +1 -0
  318. nautobot/extras/migrations/0090_joblogentry__log_level_data_migration.py +0 -1
  319. nautobot/extras/migrations/0095_ensure_note_timestamps_are_unique.py +4 -5
  320. nautobot/extras/migrations/0097_alter_job_result_remove_result.py +1 -0
  321. nautobot/extras/migrations/0100_fileproxy_job_result.py +1 -0
  322. nautobot/extras/migrations/0101_externalintegration.py +9 -1
  323. nautobot/extras/models/__init__.py +2 -3
  324. nautobot/extras/models/change_logging.py +0 -1
  325. nautobot/extras/models/customfields.py +13 -4
  326. nautobot/extras/models/datasources.py +2 -2
  327. nautobot/extras/models/groups.py +3 -4
  328. nautobot/extras/models/jobs.py +13 -7
  329. nautobot/extras/models/models.py +61 -24
  330. nautobot/extras/models/relationships.py +8 -4
  331. nautobot/extras/models/roles.py +1 -1
  332. nautobot/extras/models/secrets.py +1 -3
  333. nautobot/extras/models/tags.py +0 -1
  334. nautobot/extras/navigation.py +0 -1
  335. nautobot/extras/plugins/__init__.py +6 -7
  336. nautobot/extras/plugins/tables.py +1 -2
  337. nautobot/extras/plugins/utils.py +1 -1
  338. nautobot/extras/plugins/views.py +21 -21
  339. nautobot/extras/querysets.py +30 -13
  340. nautobot/extras/signals.py +6 -7
  341. nautobot/extras/tables.py +13 -5
  342. nautobot/extras/tasks.py +1 -2
  343. nautobot/extras/templates/extras/configcontext_edit.html +1 -1
  344. nautobot/extras/templates/extras/customfield_edit.html +7 -12
  345. nautobot/extras/templates/extras/dynamicgroup_edit.html +42 -47
  346. nautobot/extras/templates/extras/externalintegration_retrieve.html +12 -0
  347. nautobot/extras/templates/extras/externalintegration_update.html +28 -0
  348. nautobot/extras/templates/extras/gitrepository_result.html +2 -2
  349. nautobot/extras/templates/extras/graphqlquery.html +4 -2
  350. nautobot/extras/templates/extras/inc/jobresult_js.html +1 -1
  351. nautobot/extras/templates/extras/job_list.html +1 -1
  352. nautobot/extras/templates/extras/jobresult.html +2 -2
  353. nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
  354. nautobot/extras/templatetags/custom_links.py +2 -3
  355. nautobot/extras/templatetags/job_buttons.py +76 -83
  356. nautobot/extras/templatetags/log_levels.py +0 -1
  357. nautobot/extras/templatetags/plugins.py +1 -1
  358. nautobot/extras/test_jobs/api_test_job.py +1 -2
  359. nautobot/extras/test_jobs/atomic_transaction.py +1 -2
  360. nautobot/extras/test_jobs/dry_run.py +1 -2
  361. nautobot/extras/test_jobs/fail.py +1 -2
  362. nautobot/extras/test_jobs/field_order.py +1 -1
  363. nautobot/extras/test_jobs/file_upload_fail.py +1 -2
  364. nautobot/extras/test_jobs/file_upload_pass.py +1 -2
  365. nautobot/extras/test_jobs/has_sensitive_variables.py +1 -2
  366. nautobot/extras/test_jobs/ipaddress_vars.py +1 -4
  367. nautobot/extras/test_jobs/job_button_receiver.py +1 -2
  368. nautobot/extras/test_jobs/job_hook_receiver.py +1 -2
  369. nautobot/extras/test_jobs/job_variables.py +7 -2
  370. nautobot/extras/test_jobs/location_with_custom_field.py +1 -2
  371. nautobot/extras/test_jobs/log_redaction.py +1 -2
  372. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -2
  373. nautobot/extras/test_jobs/modify_db.py +1 -2
  374. nautobot/extras/test_jobs/object_var_optional.py +1 -2
  375. nautobot/extras/test_jobs/object_var_required.py +1 -2
  376. nautobot/extras/test_jobs/object_vars.py +1 -2
  377. nautobot/extras/test_jobs/pass.py +1 -2
  378. nautobot/extras/test_jobs/profiling.py +1 -2
  379. nautobot/extras/tests/integration/__init__.py +1 -1
  380. nautobot/extras/tests/integration/test_computedfields.py +2 -2
  381. nautobot/extras/tests/integration/test_configcontextschema.py +5 -5
  382. nautobot/extras/tests/integration/test_plugins.py +5 -4
  383. nautobot/extras/tests/integration/test_tagfilter.py +1 -1
  384. nautobot/extras/tests/test_api.py +15 -9
  385. nautobot/extras/tests/test_changelog.py +3 -2
  386. nautobot/extras/tests/test_context_managers.py +6 -3
  387. nautobot/extras/tests/test_customfields.py +4 -4
  388. nautobot/extras/tests/test_datasources.py +1 -1
  389. nautobot/extras/tests/test_dynamicgroups.py +3 -3
  390. nautobot/extras/tests/test_filters.py +3 -2
  391. nautobot/extras/tests/test_forms.py +5 -6
  392. nautobot/extras/tests/test_git.py +1 -1
  393. nautobot/extras/tests/test_job_variables.py +20 -1
  394. nautobot/extras/tests/test_jobs.py +34 -5
  395. nautobot/extras/tests/test_models.py +156 -6
  396. nautobot/extras/tests/test_notes.py +0 -1
  397. nautobot/extras/tests/test_plugins.py +71 -9
  398. nautobot/extras/tests/test_relationships.py +3 -3
  399. nautobot/extras/tests/test_tags.py +1 -1
  400. nautobot/extras/tests/test_views.py +105 -25
  401. nautobot/extras/tests/test_webhooks.py +4 -5
  402. nautobot/extras/urls.py +0 -2
  403. nautobot/extras/utils.py +11 -9
  404. nautobot/extras/views.py +42 -44
  405. nautobot/generate_secret_key.py +10 -5
  406. nautobot/ipam/api/serializers.py +1 -2
  407. nautobot/ipam/api/urls.py +1 -1
  408. nautobot/ipam/api/views.py +1 -0
  409. nautobot/ipam/apps.py +2 -1
  410. nautobot/ipam/factory.py +6 -9
  411. nautobot/ipam/fields.py +1 -1
  412. nautobot/ipam/filters.py +42 -58
  413. nautobot/ipam/formfields.py +1 -2
  414. nautobot/ipam/forms.py +5 -4
  415. nautobot/ipam/graphql/types.py +1 -1
  416. nautobot/ipam/homepage.py +0 -1
  417. nautobot/ipam/lookups.py +2 -3
  418. nautobot/ipam/migrations/0002_initial_part_2.py +2 -1
  419. nautobot/ipam/migrations/0003_remove_max_length.py +1 -0
  420. nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
  421. nautobot/ipam/migrations/0005_auto_slug.py +1 -0
  422. nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -0
  423. nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +1 -0
  424. nautobot/ipam/migrations/0020_related_name_changes.py +1 -0
  425. nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +1 -2
  426. nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +2 -1
  427. nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +15 -13
  428. nautobot/ipam/migrations/0028_tagsfield.py +1 -0
  429. nautobot/ipam/migrations/0030_ipam__namespaces.py +3 -1
  430. nautobot/ipam/migrations/0034_status_nonnullable.py +1 -0
  431. nautobot/ipam/migrations/0037_data_migration_vlan_group_name_uniqueness.py +0 -1
  432. nautobot/ipam/migrations/0039_alter_ipaddresstointerface_ip_address.py +20 -0
  433. nautobot/ipam/models.py +11 -8
  434. nautobot/ipam/navigation.py +0 -1
  435. nautobot/ipam/querysets.py +48 -49
  436. nautobot/ipam/tables.py +11 -2
  437. nautobot/ipam/templates/ipam/ipaddress.html +30 -6
  438. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +3 -3
  439. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +32 -0
  440. nautobot/ipam/tests/test_api.py +2 -2
  441. nautobot/ipam/tests/test_filters.py +13 -17
  442. nautobot/ipam/tests/test_migrations.py +1 -2
  443. nautobot/ipam/tests/test_models.py +17 -2
  444. nautobot/ipam/tests/test_ordering.py +1 -1
  445. nautobot/ipam/tests/test_querysets.py +2 -2
  446. nautobot/ipam/tests/test_views.py +6 -6
  447. nautobot/ipam/urls.py +6 -0
  448. nautobot/ipam/utils/migrations.py +0 -1
  449. nautobot/ipam/views.py +26 -6
  450. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +142 -142
  451. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  452. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +1 -1
  453. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  454. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +307 -307
  455. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  456. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  457. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  458. nautobot/project-static/css/base.css +59 -30
  459. nautobot/project-static/css/dark.css +38 -31
  460. nautobot/project-static/docs/404.html +17 -87
  461. nautobot/project-static/docs/apps/index.html +17 -87
  462. nautobot/project-static/docs/apps/nautobot-apps.html +17 -87
  463. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +405 -475
  464. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +28 -98
  465. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2334 -2396
  466. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +17 -87
  467. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +132 -202
  468. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +17 -87
  469. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +155 -87
  470. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +17 -87
  471. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +17 -87
  472. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +42 -112
  473. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1028 -1098
  474. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +186 -256
  475. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1454 -1156
  476. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1443 -1507
  477. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +157 -203
  478. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +17 -87
  479. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +32 -102
  480. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3822 -3888
  481. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +990 -1060
  482. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +65 -123
  483. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1431 -1495
  484. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3618 -3640
  485. nautobot/project-static/docs/development/apps/api/configuration-view.html +17 -87
  486. nautobot/project-static/docs/development/apps/api/database-backend-config.html +19 -89
  487. nautobot/project-static/docs/development/apps/api/models/django-admin.html +17 -87
  488. nautobot/project-static/docs/development/apps/api/models/global-search.html +17 -87
  489. nautobot/project-static/docs/development/apps/api/models/graphql.html +17 -87
  490. nautobot/project-static/docs/development/apps/api/models/index.html +17 -87
  491. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +17 -87
  492. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +17 -87
  493. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +19 -89
  494. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +19 -89
  495. nautobot/project-static/docs/development/apps/api/platform-features/index.html +19 -89
  496. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +17 -87
  497. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +17 -87
  498. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +21 -87
  499. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +17 -87
  500. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +17 -87
  501. nautobot/project-static/docs/development/apps/api/prometheus.html +17 -87
  502. nautobot/project-static/docs/development/apps/api/setup.html +17 -87
  503. nautobot/project-static/docs/development/apps/api/testing.html +20 -90
  504. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +17 -87
  505. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +17 -87
  506. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +17 -87
  507. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +19 -89
  508. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +209 -140
  509. nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +13 -5390
  510. nautobot/project-static/docs/development/apps/api/views/base-template.html +17 -87
  511. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +22 -92
  512. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +17 -87
  513. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +17 -87
  514. nautobot/project-static/docs/development/apps/api/views/index.html +17 -87
  515. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +17 -87
  516. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +17 -87
  517. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +17 -87
  518. nautobot/project-static/docs/development/apps/api/views/notes.html +19 -89
  519. nautobot/project-static/docs/development/apps/api/views/rest-api.html +17 -87
  520. nautobot/project-static/docs/development/apps/api/views/urls.html +17 -87
  521. nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5385
  522. nautobot/project-static/docs/development/apps/index.html +17 -87
  523. nautobot/project-static/docs/development/apps/migration/code-updates.html +17 -87
  524. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +17 -87
  525. nautobot/project-static/docs/development/apps/migration/from-v1.html +17 -88
  526. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +17 -87
  527. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +17 -87
  528. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +17 -87
  529. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +17 -87
  530. nautobot/project-static/docs/development/apps/porting-from-netbox.html +17 -87
  531. nautobot/project-static/docs/development/core/application-registry.html +20 -90
  532. nautobot/project-static/docs/development/core/best-practices.html +20 -90
  533. nautobot/project-static/docs/development/core/bootstrap-ui.html +5360 -0
  534. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +17 -87
  535. nautobot/project-static/docs/development/core/extending-models.html +21 -87
  536. nautobot/project-static/docs/development/core/generic-views.html +17 -87
  537. nautobot/project-static/docs/development/core/getting-started.html +124 -301
  538. nautobot/project-static/docs/development/core/homepage.html +17 -87
  539. nautobot/project-static/docs/development/core/index.html +17 -87
  540. nautobot/project-static/docs/development/core/model-features.html +17 -87
  541. nautobot/project-static/docs/development/core/natural-keys.html +17 -87
  542. nautobot/project-static/docs/development/core/navigation-menu.html +17 -87
  543. nautobot/project-static/docs/development/core/react-ui.html +13 -5668
  544. nautobot/project-static/docs/development/core/release-checklist.html +20 -96
  545. nautobot/project-static/docs/development/core/role-internals.html +20 -90
  546. nautobot/project-static/docs/development/core/style-guide.html +77 -146
  547. nautobot/project-static/docs/development/core/templates.html +20 -90
  548. nautobot/project-static/docs/development/core/testing.html +17 -87
  549. nautobot/project-static/docs/development/core/user-preferences.html +17 -87
  550. nautobot/project-static/docs/development/index.html +17 -87
  551. nautobot/project-static/docs/development/jobs/index.html +424 -425
  552. nautobot/project-static/docs/development/jobs/migration/from-v1.html +75 -98
  553. nautobot/project-static/docs/development/react-ui.html +3 -3
  554. nautobot/project-static/docs/img/relationship_w_json_filter.png +0 -0
  555. nautobot/project-static/docs/index.html +90 -93
  556. nautobot/project-static/docs/media/admin_ui_run_permission.png +0 -0
  557. nautobot/project-static/docs/media/development/homepage_changelog_panel.png +0 -0
  558. nautobot/project-static/docs/media/development/homepage_dcim_panel.png +0 -0
  559. nautobot/project-static/docs/media/installation/nautobot_ui_admin.png +0 -0
  560. nautobot/project-static/docs/media/installation/nautobot_ui_login.png +0 -0
  561. nautobot/project-static/docs/media/models/dynamicgroup_filtering_01.png +0 -0
  562. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_01.png +0 -0
  563. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_02.png +0 -0
  564. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_03.png +0 -0
  565. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_04.png +0 -0
  566. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_1_05.png +0 -0
  567. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_01.png +0 -0
  568. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_02.png +0 -0
  569. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_03.png +0 -0
  570. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_04.png +0 -0
  571. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_05.png +0 -0
  572. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_06.png +0 -0
  573. nautobot/project-static/docs/media/models/dynamicgroup_workflow_advanced_2_07.png +0 -0
  574. nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_01.png +0 -0
  575. nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_02.png +0 -0
  576. nautobot/project-static/docs/media/models/dynamicgroup_workflow_basic_03.png +0 -0
  577. nautobot/project-static/docs/media/models/jobbutton_form.png +0 -0
  578. nautobot/project-static/docs/media/models/site_jobbuttons.png +0 -0
  579. nautobot/project-static/docs/media/plugins/plugin_admin_config.png +0 -0
  580. nautobot/project-static/docs/media/plugins/plugin_admin_ui.png +0 -0
  581. nautobot/project-static/docs/media/ss_config_contexts.png +0 -0
  582. nautobot/project-static/docs/media/ss_graphiql.png +0 -0
  583. nautobot/project-static/docs/media/ss_main_page.png +0 -0
  584. nautobot/project-static/docs/media/ss_plugin_chatops.png +0 -0
  585. nautobot/project-static/docs/media/ss_plugin_golden_config.png +0 -0
  586. nautobot/project-static/docs/media/ss_prefix_hierarchy.png +0 -0
  587. nautobot/project-static/docs/objects.inv +0 -0
  588. nautobot/project-static/docs/release-notes/index.html +17 -87
  589. nautobot/project-static/docs/release-notes/version-1.0.html +17 -87
  590. nautobot/project-static/docs/release-notes/version-1.1.html +17 -87
  591. nautobot/project-static/docs/release-notes/version-1.2.html +17 -87
  592. nautobot/project-static/docs/release-notes/version-1.3.html +17 -87
  593. nautobot/project-static/docs/release-notes/version-1.4.html +18 -88
  594. nautobot/project-static/docs/release-notes/version-1.5.html +17 -87
  595. nautobot/project-static/docs/release-notes/version-1.6.html +17 -87
  596. nautobot/project-static/docs/release-notes/version-2.0.html +467 -336
  597. nautobot/project-static/docs/release-notes/version-2.1.html +470 -108
  598. nautobot/project-static/docs/search/search_index.json +1 -1
  599. nautobot/project-static/docs/sitemap.xml +240 -255
  600. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  601. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +17 -87
  602. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +20 -90
  603. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +17 -87
  604. nautobot/project-static/docs/user-guide/administration/configuration/index.html +17 -87
  605. nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5417
  606. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +47 -113
  607. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +17 -87
  608. nautobot/project-static/docs/user-guide/administration/guides/caching.html +17 -87
  609. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +17 -87
  610. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +17 -87
  611. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +17 -87
  612. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +17 -87
  613. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +17 -87
  614. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +17 -87
  615. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +17 -87
  616. nautobot/project-static/docs/user-guide/administration/installation/docker.html +17 -87
  617. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +17 -87
  618. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +17 -87
  619. nautobot/project-static/docs/user-guide/administration/installation/index.html +22 -109
  620. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +18 -101
  621. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +23 -140
  622. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +17 -87
  623. nautobot/project-static/docs/user-guide/administration/installation/services.html +17 -87
  624. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +17 -87
  625. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +17 -87
  626. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +92 -181
  627. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +17 -87
  628. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +17 -87
  629. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +17 -87
  630. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +17 -87
  631. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +17 -87
  632. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +17 -87
  633. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +18 -88
  634. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +17 -87
  635. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +17 -87
  636. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +23 -89
  637. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +17 -87
  638. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +17 -87
  639. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +17 -87
  640. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +17 -87
  641. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +17 -87
  642. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +17 -87
  643. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +17 -87
  644. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +17 -87
  645. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +17 -87
  646. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +17 -87
  647. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +17 -87
  648. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +17 -87
  649. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +17 -87
  650. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +18 -88
  651. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +17 -87
  652. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +17 -87
  653. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +17 -87
  654. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +17 -87
  655. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +17 -87
  656. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +17 -87
  657. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +17 -87
  658. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +17 -87
  659. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +17 -87
  660. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +17 -87
  661. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +17 -87
  662. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +17 -87
  663. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +17 -87
  664. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +17 -87
  665. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +17 -87
  666. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +17 -87
  667. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +17 -87
  668. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +17 -87
  669. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +17 -87
  670. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +17 -87
  671. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +17 -87
  672. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +17 -87
  673. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +17 -87
  674. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +17 -87
  675. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +17 -87
  676. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +17 -87
  677. nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio +259 -1
  678. nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.png +0 -0
  679. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +18 -88
  680. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +17 -87
  681. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +17 -87
  682. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +17 -87
  683. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +17 -87
  684. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +17 -87
  685. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +17 -87
  686. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +17 -87
  687. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +17 -87
  688. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +17 -87
  689. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +17 -87
  690. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +17 -87
  691. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +17 -87
  692. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +17 -87
  693. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +17 -87
  694. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +17 -87
  695. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +23 -93
  696. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +17 -87
  697. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +17 -87
  698. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +26 -96
  699. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +35 -103
  700. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +19 -89
  701. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +19 -91
  702. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +19 -89
  703. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +24 -94
  704. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +39 -258
  705. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +45 -243
  706. nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_choices.png +0 -0
  707. nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_grouped.png +0 -0
  708. nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_label.png +0 -0
  709. nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_edit.png +0 -0
  710. nautobot/project-static/docs/user-guide/feature-guides/images/custom-fields/custom_field_select.png +0 -0
  711. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/1-create-location-type.png +0 -0
  712. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/10-add-platform.png +0 -0
  713. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/11-platforms-page.png +0 -0
  714. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/12-add-tenant.png +0 -0
  715. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/13-assign-tenant-to-device.png +0 -0
  716. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/14-assign-tenant-to-device-2.png +0 -0
  717. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/15-create-device-type.png +0 -0
  718. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/16-interface-templates.png +0 -0
  719. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/17-templated-interfaces.png +0 -0
  720. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/18-assign-device-type.png +0 -0
  721. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/19-edit-ints-for-lag.png +0 -0
  722. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/2-create-manufacturer.png +0 -0
  723. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/20-ints-int-lag.png +0 -0
  724. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/21-device-type.png +0 -0
  725. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/22-create-vlans.png +0 -0
  726. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/23-create-vlans-2.png +0 -0
  727. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/24-vlan-main-page.png +0 -0
  728. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/25-add-vlan-to-interface.png +0 -0
  729. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/26-add-vlan-to-interface-2.png +0 -0
  730. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/27-add-rir.png +0 -0
  731. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/3-create-role.png +0 -0
  732. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/30-add-prefix.png +0 -0
  733. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/32-add-ip-addr.png +0 -0
  734. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/33-assign-address.png +0 -0
  735. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/34-assign-address-2.png +0 -0
  736. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/35-assign-address-3.png +0 -0
  737. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/36-verify-address.png +0 -0
  738. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/37-verify-prefix.png +0 -0
  739. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/38-verify-prefix2.png +0 -0
  740. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/4-create-device-type.png +0 -0
  741. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/41-device-search-results.png +0 -0
  742. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/42-address-search-v2.png +0 -0
  743. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/43-get-to-device-main-page.png +0 -0
  744. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/44-add-platform.png +0 -0
  745. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/5-create-device.png +0 -0
  746. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/6-create-location.png +0 -0
  747. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/7-location-type-page.png +0 -0
  748. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/8-location-page.png +0 -0
  749. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/01-git-data-source.png +0 -0
  750. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/02-git-data-source.png +0 -0
  751. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/03-git-data-source.png +0 -0
  752. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/04-git-data-source.png +0 -0
  753. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/05-git-data-source.png +0 -0
  754. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/06-git-data-source.png +0 -0
  755. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/07-git-data-source.png +0 -0
  756. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/08-git-data-source.png +0 -0
  757. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/09-git-data-source.png +0 -0
  758. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/10-git-data-source.png +0 -0
  759. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/11-git-data-source.png +0 -0
  760. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/12-git-data-source.png +0 -0
  761. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/13-git-data-source.png +0 -0
  762. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/14-git-data-source.png +0 -0
  763. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/15-git-data-source.png +0 -0
  764. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/16-git-data-source.png +0 -0
  765. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/17-git-data-source.png +0 -0
  766. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/00-graphiql.png +0 -0
  767. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/01-graphiql-explorer.png +0 -0
  768. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/02-graphiql-explorer-device-query.png +0 -0
  769. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/03-graphiql-explorer-device-attributes.png +0 -0
  770. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/04-graphql-query-01.png +0 -0
  771. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/05-graphiql-autocomplete.png +0 -0
  772. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/06-graphql-query-02.png +0 -0
  773. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/07-graphql-query-03.png +0 -0
  774. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/08-graphql-query-04.png +0 -0
  775. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/09-graphql-query-05.png +0 -0
  776. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/10-graphql-swagger.png +0 -0
  777. nautobot/project-static/docs/user-guide/feature-guides/images/graphql/11-graphql-query-06.png +0 -0
  778. nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/ip_merge_button.png +0 -0
  779. nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_button.png +0 -0
  780. nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_view.png +0 -0
  781. nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/no_more_dup_ips.png +0 -0
  782. nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/skip_button.png +0 -0
  783. nautobot/project-static/docs/user-guide/feature-guides/images/ip-address-merge-tool/unselect_ips.png +0 -0
  784. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/01-relationships.png +0 -0
  785. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/02-relationships.png +0 -0
  786. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/03-relationships.png +0 -0
  787. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/04-relationships.png +0 -0
  788. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/05-relationships.png +0 -0
  789. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/06-relationships.png +0 -0
  790. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/07-relationships.png +0 -0
  791. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/08-relationships.png +0 -0
  792. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/09-relationships.png +0 -0
  793. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/10-relationships.png +0 -0
  794. nautobot/project-static/docs/user-guide/feature-guides/images/relationships/11-relationships.png +0 -0
  795. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +20 -90
  796. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +22 -92
  797. nautobot/project-static/docs/user-guide/index.html +17 -87
  798. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +17 -87
  799. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +17 -87
  800. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +17 -87
  801. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +17 -87
  802. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +22 -88
  803. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +17 -87
  804. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +68 -87
  805. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +18 -88
  806. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +17 -87
  807. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +17 -87
  808. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +17 -87
  809. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +17 -87
  810. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +17 -87
  811. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +22 -88
  812. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +17 -87
  813. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +17 -87
  814. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +17 -87
  815. nautobot/project-static/docs/user-guide/platform-functionality/note.html +17 -87
  816. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +18 -88
  817. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +17 -87
  818. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +17 -87
  819. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +17 -87
  820. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +17 -87
  821. nautobot/project-static/docs/user-guide/platform-functionality/role.html +17 -87
  822. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +17 -87
  823. nautobot/project-static/docs/user-guide/platform-functionality/status.html +17 -87
  824. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +17 -87
  825. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +43 -91
  826. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +21 -87
  827. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +17 -87
  828. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +17 -87
  829. nautobot/project-static/js/homepage_layout.js +170 -0
  830. nautobot/project-static/js/theme.js +0 -5
  831. nautobot/tenancy/api/urls.py +1 -1
  832. nautobot/tenancy/api/views.py +1 -0
  833. nautobot/tenancy/factory.py +2 -2
  834. nautobot/tenancy/filters/__init__.py +1 -2
  835. nautobot/tenancy/forms.py +2 -2
  836. nautobot/tenancy/homepage.py +0 -1
  837. nautobot/tenancy/migrations/0001_initial.py +2 -1
  838. nautobot/tenancy/migrations/0002_auto_slug.py +1 -0
  839. nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +1 -0
  840. nautobot/tenancy/migrations/0008_tagsfield.py +1 -0
  841. nautobot/tenancy/models.py +0 -1
  842. nautobot/tenancy/navigation.py +0 -1
  843. nautobot/tenancy/tables.py +1 -0
  844. nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
  845. nautobot/tenancy/tests/test_filters.py +5 -5
  846. nautobot/tenancy/urls.py +1 -0
  847. nautobot/tenancy/views.py +2 -2
  848. nautobot/users/admin.py +1 -2
  849. nautobot/users/api/urls.py +1 -1
  850. nautobot/users/api/views.py +6 -4
  851. nautobot/users/factory.py +8 -24
  852. nautobot/users/filters.py +4 -4
  853. nautobot/users/forms.py +1 -0
  854. nautobot/users/migrations/0004_alter_user_managers.py +1 -0
  855. nautobot/users/migrations/0008_make_object_permission_a_changelogged_model.py +22 -0
  856. nautobot/users/models.py +2 -2
  857. nautobot/users/tests/test_api.py +7 -6
  858. nautobot/users/tests/test_filters.py +0 -1
  859. nautobot/users/tests/test_models.py +0 -1
  860. nautobot/users/tests/test_password_ui.py +1 -1
  861. nautobot/users/views.py +5 -4
  862. nautobot/virtualization/api/urls.py +1 -1
  863. nautobot/virtualization/api/views.py +2 -1
  864. nautobot/virtualization/apps.py +1 -1
  865. nautobot/virtualization/choices.py +0 -1
  866. nautobot/virtualization/factory.py +1 -1
  867. nautobot/virtualization/filters.py +1 -1
  868. nautobot/virtualization/forms.py +6 -6
  869. nautobot/virtualization/homepage.py +0 -1
  870. nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +1 -0
  871. nautobot/virtualization/migrations/0004_auto_slug.py +1 -0
  872. nautobot/virtualization/migrations/0005_add_natural_indexing.py +1 -0
  873. nautobot/virtualization/migrations/0006_vminterface_status.py +1 -0
  874. nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +1 -0
  875. nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +1 -0
  876. nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -0
  877. nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +1 -0
  878. nautobot/virtualization/migrations/0018_related_name_changes.py +1 -0
  879. nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +1 -0
  880. nautobot/virtualization/migrations/0025_status_nonnullable.py +1 -0
  881. nautobot/virtualization/models.py +1 -2
  882. nautobot/virtualization/navigation.py +0 -1
  883. nautobot/virtualization/signals.py +0 -1
  884. nautobot/virtualization/tables.py +1 -0
  885. nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -2
  886. nautobot/virtualization/tests/test_filters.py +3 -3
  887. nautobot/virtualization/tests/test_models.py +1 -1
  888. nautobot/virtualization/tests/test_views.py +2 -2
  889. nautobot/virtualization/urls.py +1 -0
  890. nautobot/virtualization/views.py +1 -1
  891. {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/METADATA +10 -2
  892. {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/RECORD +895 -993
  893. nautobot/core/management/commands/build_ui.py +0 -281
  894. nautobot/core/templates/base_react.html +0 -55
  895. nautobot/core/tests/test_cli.py +0 -25
  896. nautobot/project-static/docs/media/installation/nautobot_ui_guest.png +0 -0
  897. nautobot/project-static/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.svg +0 -4
  898. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/39-address-search.png +0 -0
  899. nautobot/project-static/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/40-addr-main-page.png +0 -0
  900. nautobot/project-static/docs/user-guide/feature-guides/images/git-as-data-source/18-git-data-source.png +0 -0
  901. nautobot/ui/.eslintignore +0 -3
  902. nautobot/ui/.gitignore +0 -7
  903. nautobot/ui/.prettierignore +0 -6
  904. nautobot/ui/.prettierrc +0 -4
  905. nautobot/ui/README.md +0 -27
  906. nautobot/ui/config/env.js +0 -102
  907. nautobot/ui/config/getHttpsConfig.js +0 -68
  908. nautobot/ui/config/jest/babelTransform.js +0 -14
  909. nautobot/ui/config/jest/cssTransform.js +0 -12
  910. nautobot/ui/config/jest/fileTransform.js +0 -38
  911. nautobot/ui/config/modules.js +0 -151
  912. nautobot/ui/config/paths.js +0 -67
  913. nautobot/ui/config/webpack/persistentCache/createEnvironmentHash.js +0 -8
  914. nautobot/ui/config/webpack.config.js +0 -674
  915. nautobot/ui/config/webpackDevServer.config.js +0 -127
  916. nautobot/ui/jest.config.js +0 -35
  917. nautobot/ui/jsconfig.json +0 -4
  918. nautobot/ui/package-lock.json +0 -22947
  919. nautobot/ui/package.json +0 -119
  920. nautobot/ui/public/index.html +0 -47
  921. nautobot/ui/public/logo192.png +0 -0
  922. nautobot/ui/public/logo512.png +0 -0
  923. nautobot/ui/public/manifest.json +0 -25
  924. nautobot/ui/public/nautobot_logo.svg +0 -131
  925. nautobot/ui/public/robots.txt +0 -3
  926. nautobot/ui/scripts/build.js +0 -224
  927. nautobot/ui/scripts/start.js +0 -140
  928. nautobot/ui/scripts/test.js +0 -40
  929. nautobot/ui/src/App.js +0 -79
  930. nautobot/ui/src/components/AppFullWidthComponents.js +0 -8
  931. nautobot/ui/src/components/AppTab.js +0 -40
  932. nautobot/ui/src/components/Apps.js +0 -60
  933. nautobot/ui/src/components/FeedbackModal.js +0 -123
  934. nautobot/ui/src/components/FiltersPanel.js +0 -693
  935. nautobot/ui/src/components/HomeChangelogPanel.js +0 -98
  936. nautobot/ui/src/components/HomePanel.js +0 -58
  937. nautobot/ui/src/components/JobHistoryTable.js +0 -78
  938. nautobot/ui/src/components/Layout.js +0 -76
  939. nautobot/ui/src/components/LoadingWidget.js +0 -14
  940. nautobot/ui/src/components/Navbar.js +0 -204
  941. nautobot/ui/src/components/NotificationPopover.js +0 -27
  942. nautobot/ui/src/components/ObjectTable/ObjectListTable.js +0 -300
  943. nautobot/ui/src/components/ObjectTable/ObjectTable.js +0 -96
  944. nautobot/ui/src/components/ObjectTable/ObjectTableItem.js +0 -70
  945. nautobot/ui/src/components/ObjectTable/index.js +0 -3
  946. nautobot/ui/src/components/Pagination/PageNumberForm.js +0 -228
  947. nautobot/ui/src/components/Pagination/PageSizeForm.js +0 -65
  948. nautobot/ui/src/components/Pagination/Pagination.js +0 -67
  949. nautobot/ui/src/components/Pagination/index.js +0 -3
  950. nautobot/ui/src/components/ReferenceDataTag.js +0 -35
  951. nautobot/ui/src/components/Retrieve/RenderChangeLogsTab.js +0 -58
  952. nautobot/ui/src/components/Retrieve/RenderColumn.js +0 -30
  953. nautobot/ui/src/components/Retrieve/RenderGroup.js +0 -24
  954. nautobot/ui/src/components/Retrieve/RenderHeader.js +0 -125
  955. nautobot/ui/src/components/Retrieve/RenderNotesTab.js +0 -60
  956. nautobot/ui/src/components/Retrieve/RenderTable.js +0 -33
  957. nautobot/ui/src/components/Retrieve/RenderTabs.js +0 -56
  958. nautobot/ui/src/components/Retrieve/index.js +0 -7
  959. nautobot/ui/src/components/RouterButton.js +0 -10
  960. nautobot/ui/src/components/RouterLink.js +0 -10
  961. nautobot/ui/src/components/SidebarNav.js +0 -156
  962. nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +0 -16
  963. nautobot/ui/src/components/__tests__/AppTab.test.js +0 -21
  964. nautobot/ui/src/components/__tests__/Apps.test.js +0 -14
  965. nautobot/ui/src/components/__tests__/Layout.test.js +0 -33
  966. nautobot/ui/src/components/__tests__/PageSizeForm.test.js +0 -13
  967. nautobot/ui/src/components/__tests__/Pagination.test.js +0 -43
  968. nautobot/ui/src/components/__tests__/Table.test.js +0 -39
  969. nautobot/ui/src/components/__tests__/TableItem.test.js +0 -39
  970. nautobot/ui/src/components/index.js +0 -4
  971. nautobot/ui/src/constants/apiPath.js +0 -13
  972. nautobot/ui/src/constants/icons.js +0 -15
  973. nautobot/ui/src/constants/size.js +0 -15
  974. nautobot/ui/src/file_templates/app_imports.js.j2 +0 -7
  975. nautobot/ui/src/file_templates/jsconfig-base.json +0 -12
  976. nautobot/ui/src/index.js +0 -65
  977. nautobot/ui/src/reportWebVitals.js +0 -15
  978. nautobot/ui/src/router.js +0 -77
  979. nautobot/ui/src/utils/api.js +0 -160
  980. nautobot/ui/src/utils/app-import.js +0 -15
  981. nautobot/ui/src/utils/color.js +0 -15
  982. nautobot/ui/src/utils/date.js +0 -14
  983. nautobot/ui/src/utils/index.js +0 -15
  984. nautobot/ui/src/utils/navigation.js +0 -48
  985. nautobot/ui/src/utils/session.js +0 -64
  986. nautobot/ui/src/utils/store.js +0 -242
  987. nautobot/ui/src/utils/string.js +0 -6
  988. nautobot/ui/src/utils/url.js +0 -4
  989. nautobot/ui/src/views/Home.js +0 -142
  990. nautobot/ui/src/views/InstalledApps.js +0 -80
  991. nautobot/ui/src/views/Login.js +0 -48
  992. nautobot/ui/src/views/Logout.js +0 -20
  993. nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +0 -11
  994. nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +0 -107
  995. nautobot/ui/src/views/__tests__/Login.test.js +0 -15
  996. nautobot/ui/src/views/generic/GenericView.js +0 -191
  997. nautobot/ui/src/views/generic/ObjectCreate.js +0 -96
  998. nautobot/ui/src/views/generic/ObjectList.js +0 -137
  999. nautobot/ui/src/views/generic/ObjectRetrieve.js +0 -87
  1000. {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
  1001. {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
  1002. {nautobot-2.1.0b1.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
@@ -14,14 +14,14 @@
14
14
  <link rel="prev" href="navigation.html">
15
15
 
16
16
 
17
- <link rel="next" href="tabs.html">
17
+ <link rel="next" href="../testing.html">
18
18
 
19
19
  <link rel="icon" href="../../../../assets/favicon.ico">
20
20
  <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.1.21">
21
21
 
22
22
 
23
23
 
24
- <title>Object Detail Views - Nautobot Documentation</title>
24
+ <title>Object Detail Views and Tabs - Nautobot Documentation</title>
25
25
 
26
26
 
27
27
 
@@ -77,7 +77,7 @@
77
77
  <div data-md-component="skip">
78
78
 
79
79
 
80
- <a href="#extending-object-detail-views" class="md-skip">
80
+ <a href="#extending-object-detail-views-and-tabs" class="md-skip">
81
81
  Skip to content
82
82
  </a>
83
83
 
@@ -111,7 +111,7 @@
111
111
  <div class="md-header__topic" data-md-component="header-topic">
112
112
  <span class="md-ellipsis">
113
113
 
114
- Object Detail Views
114
+ Object Detail Views and Tabs
115
115
 
116
116
  </span>
117
117
  </div>
@@ -977,20 +977,6 @@
977
977
 
978
978
 
979
979
 
980
-
981
-
982
-
983
-
984
-
985
- <li class="md-nav__item">
986
- <a href="../../../../user-guide/administration/configuration/node-configuration.html" class="md-nav__link">
987
- Node.js Configuration
988
- </a>
989
- </li>
990
-
991
-
992
-
993
-
994
980
  </ul>
995
981
  </nav>
996
982
  </li>
@@ -1439,34 +1425,6 @@
1439
1425
 
1440
1426
 
1441
1427
 
1442
- <li class="md-nav__item">
1443
- <a href="../../../../user-guide/feature-guides/git-data-source.html" class="md-nav__link">
1444
- Git as a Data Source
1445
- </a>
1446
- </li>
1447
-
1448
-
1449
-
1450
-
1451
-
1452
-
1453
-
1454
-
1455
-
1456
- <li class="md-nav__item">
1457
- <a href="../../../../user-guide/feature-guides/graphql.html" class="md-nav__link">
1458
- GraphQL
1459
- </a>
1460
- </li>
1461
-
1462
-
1463
-
1464
-
1465
-
1466
-
1467
-
1468
-
1469
-
1470
1428
  <li class="md-nav__item">
1471
1429
  <a href="../../../../user-guide/feature-guides/relationships.html" class="md-nav__link">
1472
1430
  Relationships
@@ -3556,23 +3514,9 @@
3556
3514
 
3557
3515
 
3558
3516
 
3559
- <li class="md-nav__item">
3560
- <a href="../views/view-overrides.html" class="md-nav__link">
3561
- View Overrides
3562
- </a>
3563
- </li>
3564
-
3565
-
3566
-
3567
-
3568
-
3569
-
3570
-
3571
-
3572
-
3573
3517
  <li class="md-nav__item">
3574
3518
  <a href="../views/core-view-overrides.html" class="md-nav__link">
3575
- Legacy View Overrides
3519
+ View Overrides
3576
3520
  </a>
3577
3521
  </li>
3578
3522
 
@@ -3661,7 +3605,7 @@
3661
3605
 
3662
3606
  <li class="md-nav__item">
3663
3607
  <a href="../platform-features/filter-extensions.html" class="md-nav__link">
3664
- Filter Extentions
3608
+ Filter Extensions
3665
3609
  </a>
3666
3610
  </li>
3667
3611
 
@@ -3879,24 +3823,55 @@
3879
3823
 
3880
3824
 
3881
3825
 
3826
+ <label class="md-nav__link md-nav__link--active" for="__toc">
3827
+ Object Detail Views and Tabs
3828
+ <span class="md-nav__icon md-icon"></span>
3829
+ </label>
3830
+
3882
3831
  <a href="object-detail-views.html" class="md-nav__link md-nav__link--active">
3883
- Object Detail Views
3832
+ Object Detail Views and Tabs
3884
3833
  </a>
3885
3834
 
3886
- </li>
3887
-
3835
+
3888
3836
 
3889
-
3890
-
3891
-
3892
-
3837
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
3893
3838
 
3894
3839
 
3895
3840
 
3896
- <li class="md-nav__item">
3897
- <a href="tabs.html" class="md-nav__link">
3898
- Tabs
3899
- </a>
3841
+
3842
+
3843
+
3844
+ <label class="md-nav__title" for="__toc">
3845
+ <span class="md-nav__icon md-icon"></span>
3846
+ Table of contents
3847
+ </label>
3848
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
3849
+
3850
+ <li class="md-nav__item">
3851
+ <a href="#extending-object-detail-views" class="md-nav__link">
3852
+ Extending Object Detail Views
3853
+ </a>
3854
+
3855
+ </li>
3856
+
3857
+ <li class="md-nav__item">
3858
+ <a href="#adding-detail-tabs" class="md-nav__link">
3859
+ Adding Detail Tabs
3860
+ </a>
3861
+
3862
+ </li>
3863
+
3864
+ <li class="md-nav__item">
3865
+ <a href="#example-adding-object-details-and-tabs" class="md-nav__link">
3866
+ Example Adding Object Details and Tabs
3867
+ </a>
3868
+
3869
+ </li>
3870
+
3871
+ </ul>
3872
+
3873
+ </nav>
3874
+
3900
3875
  </li>
3901
3876
 
3902
3877
 
@@ -4566,6 +4541,20 @@
4566
4541
 
4567
4542
 
4568
4543
 
4544
+ <li class="md-nav__item">
4545
+ <a href="../../../core/bootstrap-ui.html" class="md-nav__link">
4546
+ Bootstrap UI
4547
+ </a>
4548
+ </li>
4549
+
4550
+
4551
+
4552
+
4553
+
4554
+
4555
+
4556
+
4557
+
4569
4558
  <li class="md-nav__item">
4570
4559
  <a href="../../../core/best-practices.html" class="md-nav__link">
4571
4560
  Best Practices
@@ -4678,20 +4667,6 @@
4678
4667
 
4679
4668
 
4680
4669
 
4681
- <li class="md-nav__item">
4682
- <a href="../../../core/react-ui.html" class="md-nav__link">
4683
- React UI
4684
- </a>
4685
- </li>
4686
-
4687
-
4688
-
4689
-
4690
-
4691
-
4692
-
4693
-
4694
-
4695
4670
  <li class="md-nav__item">
4696
4671
  <a href="../../../core/role-internals.html" class="md-nav__link">
4697
4672
  Role Internals
@@ -5187,6 +5162,35 @@
5187
5162
 
5188
5163
 
5189
5164
 
5165
+ <label class="md-nav__title" for="__toc">
5166
+ <span class="md-nav__icon md-icon"></span>
5167
+ Table of contents
5168
+ </label>
5169
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
5170
+
5171
+ <li class="md-nav__item">
5172
+ <a href="#extending-object-detail-views" class="md-nav__link">
5173
+ Extending Object Detail Views
5174
+ </a>
5175
+
5176
+ </li>
5177
+
5178
+ <li class="md-nav__item">
5179
+ <a href="#adding-detail-tabs" class="md-nav__link">
5180
+ Adding Detail Tabs
5181
+ </a>
5182
+
5183
+ </li>
5184
+
5185
+ <li class="md-nav__item">
5186
+ <a href="#example-adding-object-details-and-tabs" class="md-nav__link">
5187
+ Example Adding Object Details and Tabs
5188
+ </a>
5189
+
5190
+ </li>
5191
+
5192
+ </ul>
5193
+
5190
5194
  </nav>
5191
5195
  </div>
5192
5196
  </div>
@@ -5203,8 +5207,9 @@
5203
5207
 
5204
5208
 
5205
5209
 
5206
- <h1 id="extending-object-detail-views">Extending Object Detail Views<a class="headerlink" href="#extending-object-detail-views" title="Permanent link">&para;</a></h1>
5207
- <p>Apps can inject custom content into certain areas of the detail views of applicable models. This is accomplished by subclassing <code>TemplateExtension</code>, designating a particular Nautobot model, and defining the desired methods to render custom content. Four methods are available:</p>
5210
+ <h1 id="extending-object-detail-views-and-tabs">Extending Object Detail Views and Tabs<a class="headerlink" href="#extending-object-detail-views-and-tabs" title="Permanent link">&para;</a></h1>
5211
+ <h2 id="extending-object-detail-views">Extending Object Detail Views<a class="headerlink" href="#extending-object-detail-views" title="Permanent link">&para;</a></h2>
5212
+ <p>Apps can inject custom content into certain areas of the detail views of applicable models. This is accomplished by subclassing <code>TemplateExtension</code>, designating a particular Nautobot model, and defining the desired methods to render custom content. Five methods are available:</p>
5208
5213
  <ul>
5209
5214
  <li><code>left_page()</code> - Inject content on the left side of the page</li>
5210
5215
  <li><code>right_page()</code> - Inject content on the right side of the page</li>
@@ -5221,56 +5226,120 @@
5221
5226
  <li><code>config</code> - App-specific configuration parameters</li>
5222
5227
  </ul>
5223
5228
  <p>For example, accessing <code>{{ request.user }}</code> within a template will return the current user.</p>
5224
- <p>Declared subclasses should be gathered into a list or tuple for integration with Nautobot. By default, Nautobot looks for an iterable named <code>template_extensions</code> within a <code>template_content.py</code> file. (This can be overridden by setting <code>template_extensions</code> to a custom value on the app's <code>NautobotAppConfig</code>.) An example is below.</p>
5225
- <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># template_content.py</span>
5226
- <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">reverse</span>
5227
- <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="kn">from</span> <span class="nn">nautobot.apps.ui</span> <span class="kn">import</span> <span class="n">TemplateExtension</span>
5229
+ <p>Declared subclasses should be gathered into a list or tuple for integration with Nautobot. By default, Nautobot looks for an iterable named <code>template_extensions</code> within a <code>template_content.py</code> file. (This can be overridden by setting <code>template_extensions</code> to a custom value on the app's <code>NautobotAppConfig</code>.) An example is <a href="#example-adding-object-details-and-tabs">below</a>.</p>
5230
+ <h2 id="adding-detail-tabs">Adding Detail Tabs<a class="headerlink" href="#adding-detail-tabs" title="Permanent link">&para;</a></h2>
5231
+ <div class="admonition version-added">
5232
+ <p class="admonition-title">Added in version 1.4.0</p>
5233
+ </div>
5234
+ <p>The <code>TemplateExtension.detail_tabs()</code> method should return a list of dicts, each of which has the keys <code>"title"</code> and <code>"url"</code>. In addition, in order for tabs to work properly:</p>
5235
+ <ul>
5236
+ <li>The <code>"url"</code> key should typically be a URL that includes <code>self.context["object"].pk</code> in some form (so that the URL may know which object is being referenced)</li>
5237
+ <li>The view referenced by the <code>"url"</code> must inherit from the <code>nautobot.apps.views.ObjectView</code> class</li>
5238
+ <li>The template rendered by this view must extend the object's detail template</li>
5239
+ </ul>
5240
+ <p>For example:</p>
5241
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="k">class</span> <span class="nc">DeviceExtraTabs</span><span class="p">(</span><span class="n">TemplateExtension</span><span class="p">):</span>
5242
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Template extension to add extra tabs to the Device detail view.&quot;&quot;&quot;</span>
5243
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> <span class="n">model</span> <span class="o">=</span> <span class="s1">&#39;dcim.device&#39;</span>
5228
5244
  <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
5229
- <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Animal</span>
5230
- <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>
5231
- <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
5232
- <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a><span class="k">class</span> <span class="nc">LocationAnimalCount</span><span class="p">(</span><span class="n">TemplateExtension</span><span class="p">):</span>
5233
- <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Template extension to display animal count on the right side of the page.&quot;&quot;&quot;</span>
5234
- <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>
5235
- <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="n">model</span> <span class="o">=</span> <span class="s1">&#39;dcim.location&#39;</span>
5236
- <a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>
5237
- <a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a> <span class="k">def</span> <span class="nf">right_page</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
5238
- <a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">&#39;nautobot_animal_sounds/inc/animal_count.html&#39;</span><span class="p">,</span> <span class="n">extra_context</span><span class="o">=</span><span class="p">{</span>
5239
- <a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a> <span class="s1">&#39;animal_count&#39;</span><span class="p">:</span> <span class="n">Animal</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">(),</span>
5240
- <a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a> <span class="p">})</span>
5241
- <a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a>
5242
- <a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a>
5243
- <a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="k">class</span> <span class="nc">DeviceExtraTabs</span><span class="p">(</span><span class="n">TemplateExtension</span><span class="p">):</span>
5244
- <a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Template extension to add extra tabs to the object detail tabs.&quot;&quot;&quot;</span>
5245
- <a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a>
5246
- <a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a> <span class="n">model</span> <span class="o">=</span> <span class="s1">&#39;dcim.device&#39;</span>
5247
- <a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a>
5248
- <a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a> <span class="k">def</span> <span class="nf">detail_tabs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
5249
- <a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
5250
- <a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="sd"> You may define extra tabs to render on a model&#39;s detail page by utilizing this method.</span>
5251
- <a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a><span class="sd"> Each tab is defined as a dict in a list of dicts.</span>
5252
- <a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a>
5253
- <a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a><span class="sd"> For each of the tabs defined:</span>
5254
- <a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a><span class="sd"> - The &lt;title&gt; key&#39;s value will become the tab link&#39;s title.</span>
5255
- <a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a><span class="sd"> - The &lt;url&gt; key&#39;s value is used to render the HTML link for the tab</span>
5256
- <a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a>
5257
- <a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a><span class="sd"> These tabs will be visible (in this instance) on the Device model&#39;s detail page as</span>
5258
- <a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a><span class="sd"> set by the DeviceContent.model attribute &quot;dcim.device&quot;</span>
5259
- <a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a>
5260
- <a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a><span class="sd"> This example demonstrates defining two tabs. The tabs will be ordered by their position in list.</span>
5261
- <a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a><span class="sd"> &quot;&quot;&quot;</span>
5262
- <a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a> <span class="k">return</span> <span class="p">[</span>
5263
- <a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a> <span class="p">{</span>
5264
- <a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a> <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;App Tab 1&quot;</span><span class="p">,</span>
5265
- <a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a> <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;plugins:example_plugin:device_detail_tab_1&quot;</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="s2">&quot;object&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pk</span><span class="p">}),</span>
5266
- <a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a> <span class="p">},</span>
5267
- <a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a> <span class="p">{</span>
5268
- <a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a> <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;App Tab 2&quot;</span><span class="p">,</span>
5269
- <a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a> <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;plugins:example_plugin:device_detail_tab_2&quot;</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="s2">&quot;object&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pk</span><span class="p">}),</span>
5270
- <a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a> <span class="p">},</span>
5271
- <a id="__codelineno-0-47" name="__codelineno-0-47" href="#__codelineno-0-47"></a> <span class="p">]</span>
5272
- <a id="__codelineno-0-48" name="__codelineno-0-48" href="#__codelineno-0-48"></a>
5273
- <a id="__codelineno-0-49" name="__codelineno-0-49" href="#__codelineno-0-49"></a><span class="n">template_extensions</span> <span class="o">=</span> <span class="p">[</span><span class="n">DeviceExtraTabs</span><span class="p">,</span> <span class="n">LocationAnimalCount</span><span class="p">]</span>
5245
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> <span class="k">def</span> <span class="nf">detail_tabs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
5246
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> <span class="k">return</span> <span class="p">[</span>
5247
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="p">{</span>
5248
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;App Tab 1&quot;</span><span class="p">,</span>
5249
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;plugins:example_plugin:device_detail_tab_1&quot;</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="s2">&quot;object&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pk</span><span class="p">}),</span>
5250
+ <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="p">},</span>
5251
+ <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="p">]</span>
5252
+ </code></pre></div>
5253
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="cm">&lt;!-- example_plugin/tab_device_detail_1.html --&gt;</span>
5254
+ <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>{% extends &#39;dcim/device.html&#39; %}
5255
+ <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
5256
+ <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>{% block content %}
5257
+ <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a> <span class="p">&lt;</span><span class="nt">h2</span><span class="p">&gt;</span>Device App Tab 1<span class="p">&lt;/</span><span class="nt">h2</span><span class="p">&gt;</span>
5258
+ <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a> <span class="p">&lt;</span><span class="nt">p</span><span class="p">&gt;</span>I am some content for the example plugin&#39;s device ({{ object.pk }}) detail tab 1.<span class="p">&lt;/</span><span class="nt">p</span><span class="p">&gt;</span>
5259
+ <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>{% endblock %}
5260
+ </code></pre></div>
5261
+ <p>Here's a basic example of a tab's view</p>
5262
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="c1"># views.py</span>
5263
+ <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kn">from</span> <span class="nn">nautobot.apps.views</span> <span class="kn">import</span> <span class="n">ObjectView</span>
5264
+ <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a><span class="kn">from</span> <span class="nn">nautobot.dcim.models</span> <span class="kn">import</span> <span class="n">Device</span>
5265
+ <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>
5266
+ <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="k">class</span> <span class="nc">DeviceDetailAppTabOne</span><span class="p">(</span><span class="n">ObjectView</span><span class="p">):</span>
5267
+ <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
5268
+ <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a><span class="sd"> This view&#39;s template extends the device detail template,</span>
5269
+ <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="sd"> making it suitable to show as a tab on the device detail page.</span>
5270
+ <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>
5271
+ <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="sd"> Views that are intended to be for an object detail tab&#39;s content rendering must</span>
5272
+ <a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="sd"> always inherit from nautobot.apps.views.ObjectView.</span>
5273
+ <a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="sd"> &quot;&quot;&quot;</span>
5274
+ <a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>
5275
+ <a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a> <span class="n">queryset</span> <span class="o">=</span> <span class="n">Device</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
5276
+ <a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a> <span class="n">template_name</span> <span class="o">=</span> <span class="s2">&quot;example_plugin/tab_device_detail_1.html&quot;</span>
5277
+ </code></pre></div>
5278
+ <p>You must also add the view to the <code>url_patterns</code> like so (make sure to read the note after this code snippet):</p>
5279
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="c1"># urls.py</span>
5280
+ <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">path</span>
5281
+ <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>
5282
+ <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="kn">from</span> <span class="nn">example_plugin</span> <span class="kn">import</span> <span class="n">views</span>
5283
+ <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>
5284
+ <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="n">urlpatterns</span> <span class="o">=</span> <span class="p">[</span>
5285
+ <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a> <span class="c1"># ... previously defined urls</span>
5286
+ <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a> <span class="n">path</span><span class="p">(</span><span class="s2">&quot;devices/&lt;uuid:pk&gt;/example-plugin-tab-1/&quot;</span><span class="p">,</span> <span class="n">views</span><span class="o">.</span><span class="n">DeviceDetailAppTabOne</span><span class="o">.</span><span class="n">as_view</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;device_detail_tab_1&quot;</span><span class="p">),</span>
5287
+ <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="p">]</span>
5288
+ </code></pre></div>
5289
+ <div class="admonition note">
5290
+ <p class="admonition-title">Note</p>
5291
+ <p>For added tab views, we recommend for consistency that you follow the URL pattern established by the base model detail view and tabs (if any). For example, <code>nautobot/dcim/urls.py</code> references Device tab views with the URL pattern <code>devices/&lt;uuid:pk&gt;/TAB-NAME/</code>, so above we have followed that same pattern.</p>
5292
+ </div>
5293
+ <h2 id="example-adding-object-details-and-tabs">Example Adding Object Details and Tabs<a class="headerlink" href="#example-adding-object-details-and-tabs" title="Permanent link">&para;</a></h2>
5294
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="c1"># template_content.py</span>
5295
+ <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="kn">from</span> <span class="nn">django.urls</span> <span class="kn">import</span> <span class="n">reverse</span>
5296
+ <a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="kn">from</span> <span class="nn">nautobot.apps.ui</span> <span class="kn">import</span> <span class="n">TemplateExtension</span>
5297
+ <a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>
5298
+ <a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="kn">from</span> <span class="nn">.models</span> <span class="kn">import</span> <span class="n">Animal</span>
5299
+ <a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>
5300
+ <a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>
5301
+ <a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="k">class</span> <span class="nc">LocationAnimalCount</span><span class="p">(</span><span class="n">TemplateExtension</span><span class="p">):</span>
5302
+ <a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Template extension to display animal count on the right side of the page.&quot;&quot;&quot;</span>
5303
+ <a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a>
5304
+ <a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a> <span class="n">model</span> <span class="o">=</span> <span class="s1">&#39;dcim.location&#39;</span>
5305
+ <a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a>
5306
+ <a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a> <span class="k">def</span> <span class="nf">right_page</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
5307
+ <a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s1">&#39;nautobot_animal_sounds/inc/animal_count.html&#39;</span><span class="p">,</span> <span class="n">extra_context</span><span class="o">=</span><span class="p">{</span>
5308
+ <a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a> <span class="s1">&#39;animal_count&#39;</span><span class="p">:</span> <span class="n">Animal</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">count</span><span class="p">(),</span>
5309
+ <a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a> <span class="p">})</span>
5310
+ <a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a>
5311
+ <a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a>
5312
+ <a id="__codelineno-4-19" name="__codelineno-4-19" href="#__codelineno-4-19"></a><span class="k">class</span> <span class="nc">DeviceExtraTabs</span><span class="p">(</span><span class="n">TemplateExtension</span><span class="p">):</span>
5313
+ <a id="__codelineno-4-20" name="__codelineno-4-20" href="#__codelineno-4-20"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Template extension to add extra tabs to the object detail tabs.&quot;&quot;&quot;</span>
5314
+ <a id="__codelineno-4-21" name="__codelineno-4-21" href="#__codelineno-4-21"></a>
5315
+ <a id="__codelineno-4-22" name="__codelineno-4-22" href="#__codelineno-4-22"></a> <span class="n">model</span> <span class="o">=</span> <span class="s1">&#39;dcim.device&#39;</span>
5316
+ <a id="__codelineno-4-23" name="__codelineno-4-23" href="#__codelineno-4-23"></a>
5317
+ <a id="__codelineno-4-24" name="__codelineno-4-24" href="#__codelineno-4-24"></a> <span class="k">def</span> <span class="nf">detail_tabs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
5318
+ <a id="__codelineno-4-25" name="__codelineno-4-25" href="#__codelineno-4-25"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
5319
+ <a id="__codelineno-4-26" name="__codelineno-4-26" href="#__codelineno-4-26"></a><span class="sd"> You may define extra tabs to render on a model&#39;s detail page by utilizing this method.</span>
5320
+ <a id="__codelineno-4-27" name="__codelineno-4-27" href="#__codelineno-4-27"></a><span class="sd"> Each tab is defined as a dict in a list of dicts.</span>
5321
+ <a id="__codelineno-4-28" name="__codelineno-4-28" href="#__codelineno-4-28"></a>
5322
+ <a id="__codelineno-4-29" name="__codelineno-4-29" href="#__codelineno-4-29"></a><span class="sd"> For each of the tabs defined:</span>
5323
+ <a id="__codelineno-4-30" name="__codelineno-4-30" href="#__codelineno-4-30"></a><span class="sd"> - The &lt;title&gt; key&#39;s value will become the tab link&#39;s title.</span>
5324
+ <a id="__codelineno-4-31" name="__codelineno-4-31" href="#__codelineno-4-31"></a><span class="sd"> - The &lt;url&gt; key&#39;s value is used to render the HTML link for the tab</span>
5325
+ <a id="__codelineno-4-32" name="__codelineno-4-32" href="#__codelineno-4-32"></a>
5326
+ <a id="__codelineno-4-33" name="__codelineno-4-33" href="#__codelineno-4-33"></a><span class="sd"> These tabs will be visible (in this instance) on the Device model&#39;s detail page as</span>
5327
+ <a id="__codelineno-4-34" name="__codelineno-4-34" href="#__codelineno-4-34"></a><span class="sd"> set by the DeviceContent.model attribute &quot;dcim.device&quot;</span>
5328
+ <a id="__codelineno-4-35" name="__codelineno-4-35" href="#__codelineno-4-35"></a>
5329
+ <a id="__codelineno-4-36" name="__codelineno-4-36" href="#__codelineno-4-36"></a><span class="sd"> This example demonstrates defining two tabs. The tabs will be ordered by their position in list.</span>
5330
+ <a id="__codelineno-4-37" name="__codelineno-4-37" href="#__codelineno-4-37"></a><span class="sd"> &quot;&quot;&quot;</span>
5331
+ <a id="__codelineno-4-38" name="__codelineno-4-38" href="#__codelineno-4-38"></a> <span class="k">return</span> <span class="p">[</span>
5332
+ <a id="__codelineno-4-39" name="__codelineno-4-39" href="#__codelineno-4-39"></a> <span class="p">{</span>
5333
+ <a id="__codelineno-4-40" name="__codelineno-4-40" href="#__codelineno-4-40"></a> <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;App Tab 1&quot;</span><span class="p">,</span>
5334
+ <a id="__codelineno-4-41" name="__codelineno-4-41" href="#__codelineno-4-41"></a> <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;plugins:example_plugin:device_detail_tab_1&quot;</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="s2">&quot;object&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pk</span><span class="p">}),</span>
5335
+ <a id="__codelineno-4-42" name="__codelineno-4-42" href="#__codelineno-4-42"></a> <span class="p">},</span>
5336
+ <a id="__codelineno-4-43" name="__codelineno-4-43" href="#__codelineno-4-43"></a> <span class="p">{</span>
5337
+ <a id="__codelineno-4-44" name="__codelineno-4-44" href="#__codelineno-4-44"></a> <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;App Tab 2&quot;</span><span class="p">,</span>
5338
+ <a id="__codelineno-4-45" name="__codelineno-4-45" href="#__codelineno-4-45"></a> <span class="s2">&quot;url&quot;</span><span class="p">:</span> <span class="n">reverse</span><span class="p">(</span><span class="s2">&quot;plugins:example_plugin:device_detail_tab_2&quot;</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;pk&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="s2">&quot;object&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">pk</span><span class="p">}),</span>
5339
+ <a id="__codelineno-4-46" name="__codelineno-4-46" href="#__codelineno-4-46"></a> <span class="p">},</span>
5340
+ <a id="__codelineno-4-47" name="__codelineno-4-47" href="#__codelineno-4-47"></a> <span class="p">]</span>
5341
+ <a id="__codelineno-4-48" name="__codelineno-4-48" href="#__codelineno-4-48"></a>
5342
+ <a id="__codelineno-4-49" name="__codelineno-4-49" href="#__codelineno-4-49"></a><span class="n">template_extensions</span> <span class="o">=</span> <span class="p">[</span><span class="n">DeviceExtraTabs</span><span class="p">,</span> <span class="n">LocationAnimalCount</span><span class="p">]</span>
5274
5343
  </code></pre></div>
5275
5344
 
5276
5345
 
@@ -5309,13 +5378,13 @@
5309
5378
 
5310
5379
 
5311
5380
 
5312
- <a href="tabs.html" class="md-footer__link md-footer__link--next" aria-label="Next: Tabs" rel="next">
5381
+ <a href="../testing.html" class="md-footer__link md-footer__link--next" aria-label="Next: Testing" rel="next">
5313
5382
  <div class="md-footer__title">
5314
5383
  <span class="md-footer__direction">
5315
5384
  Next
5316
5385
  </span>
5317
5386
  <div class="md-ellipsis">
5318
- Tabs
5387
+ Testing
5319
5388
  </div>
5320
5389
  </div>
5321
5390
  <div class="md-footer__button md-icon">