nautobot 3.0.0a3__py3-none-any.whl → 3.0.0rc1__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 (388) hide show
  1. nautobot/apps/choices.py +4 -0
  2. nautobot/apps/ui.py +4 -0
  3. nautobot/apps/utils.py +8 -0
  4. nautobot/circuits/tests/integration/test_circuits_bulk_operations.py +0 -3
  5. nautobot/circuits/views.py +6 -2
  6. nautobot/core/api/serializers.py +1 -1
  7. nautobot/core/api/urls.py +1 -0
  8. nautobot/core/api/views.py +4 -0
  9. nautobot/core/choices.py +1 -1
  10. nautobot/core/cli/bootstrap_v3_to_v5.py +36 -13
  11. nautobot/core/cli/migrate_deprecated_templates.py +36 -9
  12. nautobot/core/filters.py +4 -0
  13. nautobot/core/forms/__init__.py +2 -0
  14. nautobot/core/forms/widgets.py +21 -2
  15. nautobot/core/jobs/__init__.py +56 -0
  16. nautobot/core/management/commands/generate_test_data.py +3 -3
  17. nautobot/core/models/__init__.py +11 -0
  18. nautobot/core/models/utils.py +1 -1
  19. nautobot/core/settings.py +17 -7
  20. nautobot/core/settings.yaml +4 -26
  21. nautobot/core/templates/admin/base.html +1 -2
  22. nautobot/core/templates/admin/change_list.html +9 -12
  23. nautobot/core/templates/base_django.html +1 -2
  24. nautobot/core/templates/components/panel/header_extra_content_table.html +1 -1
  25. nautobot/core/templates/components/tab/content_wrapper.html +4 -4
  26. nautobot/core/templates/echarts/echarts.html +21 -8
  27. nautobot/core/templates/generic/object_bulk_create.html +2 -2
  28. nautobot/core/templates/generic/object_bulk_delete.html +1 -1
  29. nautobot/core/templates/generic/object_bulk_edit.html +1 -1
  30. nautobot/core/templates/generic/object_bulk_import.html +1 -1
  31. nautobot/core/templates/generic/object_delete.html +1 -1
  32. nautobot/core/templates/generic/object_detail.html +1 -1
  33. nautobot/core/templates/generic/object_edit.html +1 -1
  34. nautobot/core/templates/generic/object_retrieve.html +2 -2
  35. nautobot/core/templates/graphene/graphiql.html +0 -1
  36. nautobot/core/templates/inc/footer.html +3 -1
  37. nautobot/core/templates/inc/header.html +10 -0
  38. nautobot/core/templates/inc/media.html +14 -0
  39. nautobot/core/templates/inc/nav_menu.html +1 -8
  40. nautobot/core/templates/inc/object_details_advanced_panel.html +2 -2
  41. nautobot/core/templates/nautobot_config.py.j2 +0 -6
  42. nautobot/core/templates/rest_framework/api.html +103 -2
  43. nautobot/core/templates/utilities/templatetags/filter_form_drawer.html +33 -0
  44. nautobot/core/templates/utilities/theme_preview.html +3 -0
  45. nautobot/core/templates/widgets/number_input_with_choices.html +44 -0
  46. nautobot/core/templatetags/helpers.py +24 -12
  47. nautobot/core/testing/integration.py +24 -13
  48. nautobot/core/testing/utils.py +18 -4
  49. nautobot/core/testing/views.py +104 -17
  50. nautobot/core/tests/integration/test_filters.py +48 -11
  51. nautobot/core/tests/integration/test_theme.py +22 -21
  52. nautobot/core/tests/nautobot_config.py +3 -0
  53. nautobot/core/tests/runner.py +1 -2
  54. nautobot/core/tests/test_breadcrumbs.py +21 -21
  55. nautobot/core/tests/test_jobs.py +73 -6
  56. nautobot/core/tests/test_renderers.py +59 -0
  57. nautobot/core/tests/test_settings_schema.py +1 -0
  58. nautobot/core/tests/test_templatetags_helpers.py +9 -0
  59. nautobot/core/tests/test_titles.py +0 -16
  60. nautobot/core/tests/test_ui.py +122 -3
  61. nautobot/core/tests/test_utils.py +41 -1
  62. nautobot/core/ui/breadcrumbs.py +68 -17
  63. nautobot/core/ui/bulk_buttons.py +1 -1
  64. nautobot/core/ui/choices.py +49 -65
  65. nautobot/core/ui/echarts.py +15 -20
  66. nautobot/core/ui/object_detail.py +54 -46
  67. nautobot/core/ui/titles.py +3 -6
  68. nautobot/core/urls.py +8 -8
  69. nautobot/core/utils/filtering.py +11 -1
  70. nautobot/core/utils/lookup.py +46 -0
  71. nautobot/core/views/mixins.py +31 -20
  72. nautobot/core/views/renderers.py +2 -3
  73. nautobot/data_validation/migrations/0002_data_migration_from_app.py +3 -2
  74. nautobot/dcim/api/serializers.py +3 -0
  75. nautobot/dcim/choices.py +49 -0
  76. nautobot/dcim/constants.py +7 -0
  77. nautobot/dcim/factory.py +1 -1
  78. nautobot/dcim/filters.py +13 -1
  79. nautobot/dcim/forms.py +89 -3
  80. nautobot/dcim/migrations/0075_interface_duplex_interface_speed_and_more.py +32 -0
  81. nautobot/dcim/migrations/{0075_add_deviceclusterassignment.py → 0076_add_deviceclusterassignment.py} +1 -1
  82. nautobot/dcim/migrations/{0076_device_cluster_to_clusters_data_migration.py → 0077_device_cluster_to_clusters_data_migration.py} +1 -1
  83. nautobot/dcim/migrations/{0077_remove_device_cluster.py → 0078_remove_device_cluster.py} +1 -1
  84. nautobot/dcim/migrations/{0078_remove_device_location_tenant_name_uniqueness.py → 0079_remove_device_location_tenant_name_uniqueness.py} +1 -1
  85. nautobot/dcim/migrations/{0079_device_name_data_migration.py → 0080_device_name_data_migration.py} +1 -1
  86. nautobot/dcim/migrations/0081_alter_device_device_redundancy_group_priority_and_more.py +25 -0
  87. nautobot/dcim/models/device_component_templates.py +33 -1
  88. nautobot/dcim/models/device_components.py +22 -1
  89. nautobot/dcim/models/devices.py +17 -4
  90. nautobot/dcim/tables/devices.py +15 -0
  91. nautobot/dcim/tables/devicetypes.py +8 -1
  92. nautobot/dcim/tables/racks.py +0 -2
  93. nautobot/dcim/tables/template_code.py +1 -1
  94. nautobot/dcim/templates/dcim/cable_trace.html +0 -2
  95. nautobot/dcim/templates/dcim/consoleport.html +1 -1
  96. nautobot/dcim/templates/dcim/consoleserverport.html +1 -1
  97. nautobot/dcim/templates/dcim/devicebay.html +1 -1
  98. nautobot/dcim/templates/dcim/frontport.html +1 -1
  99. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
  100. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +1 -1
  101. nautobot/dcim/templates/dcim/inc/rack_elevation.html +1 -1
  102. nautobot/dcim/templates/dcim/interface.html +9 -1
  103. nautobot/dcim/templates/dcim/interface_edit.html +2 -0
  104. nautobot/dcim/templates/dcim/inventoryitem.html +1 -1
  105. nautobot/dcim/templates/dcim/module_consoleports.html +1 -1
  106. nautobot/dcim/templates/dcim/module_consoleserverports.html +1 -1
  107. nautobot/dcim/templates/dcim/module_frontports.html +1 -1
  108. nautobot/dcim/templates/dcim/module_interfaces.html +1 -1
  109. nautobot/dcim/templates/dcim/module_modulebays.html +1 -1
  110. nautobot/dcim/templates/dcim/module_poweroutlets.html +1 -1
  111. nautobot/dcim/templates/dcim/module_powerports.html +1 -1
  112. nautobot/dcim/templates/dcim/module_rearports.html +1 -1
  113. nautobot/dcim/templates/dcim/moduletype_list.html +2 -2
  114. nautobot/dcim/templates/dcim/poweroutlet.html +1 -1
  115. nautobot/dcim/templates/dcim/powerport.html +1 -1
  116. nautobot/dcim/templates/dcim/rack_elevation_list.html +1 -1
  117. nautobot/dcim/templates/dcim/rack_retrieve.html +0 -11
  118. nautobot/dcim/templates/dcim/rearport.html +1 -1
  119. nautobot/dcim/templates/dcim/trace/cable.html +1 -1
  120. nautobot/dcim/templates/dcim/virtualchassis_update.html +1 -1
  121. nautobot/dcim/tests/integration/test_controller.py +3 -6
  122. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +1 -5
  123. nautobot/dcim/tests/integration/test_create_device.py +0 -2
  124. nautobot/dcim/tests/integration/test_device_bulk_operations.py +1 -3
  125. nautobot/dcim/tests/integration/test_fileinputpicker.py +6 -10
  126. nautobot/dcim/tests/integration/test_location_bulk_operations.py +0 -2
  127. nautobot/dcim/tests/integration/test_module_bay_position.py +3 -4
  128. nautobot/dcim/tests/test_api.py +186 -6
  129. nautobot/dcim/tests/test_filters.py +43 -1
  130. nautobot/dcim/tests/test_forms.py +110 -8
  131. nautobot/dcim/tests/test_graphql.py +44 -1
  132. nautobot/dcim/tests/test_models.py +265 -0
  133. nautobot/dcim/tests/test_tables.py +160 -0
  134. nautobot/dcim/tests/test_views.py +69 -7
  135. nautobot/dcim/views.py +232 -126
  136. nautobot/extras/api/views.py +51 -44
  137. nautobot/extras/datasources/git.py +3 -1
  138. nautobot/extras/filters.py +19 -2
  139. nautobot/extras/forms/forms.py +9 -2
  140. nautobot/extras/jobs.py +2 -0
  141. nautobot/extras/jobs_ui.py +4 -3
  142. nautobot/extras/management/__init__.py +2 -0
  143. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +4 -1
  144. nautobot/extras/migrations/0131_configcontext_device_families.py +18 -0
  145. nautobot/extras/models/approvals.py +11 -1
  146. nautobot/extras/models/change_logging.py +4 -0
  147. nautobot/extras/models/jobs.py +1 -3
  148. nautobot/extras/models/models.py +10 -2
  149. nautobot/extras/plugins/marketplace_manifest.yml +49 -1
  150. nautobot/extras/plugins/views.py +0 -5
  151. nautobot/extras/querysets.py +8 -0
  152. nautobot/extras/tables.py +12 -0
  153. nautobot/extras/templates/django_ajax_tables/ajax_wrapper.html +2 -0
  154. nautobot/extras/templates/extras/configcontext_update.html +1 -0
  155. nautobot/extras/templates/extras/dynamicgroup_update.html +1 -1
  156. nautobot/extras/templates/extras/objectchange_retrieve.html +0 -2
  157. nautobot/extras/templates/extras/plugin_detail.html +3 -3
  158. nautobot/extras/templates/extras/secret_create.html +1 -1
  159. nautobot/extras/tests/integration/test_computedfields.py +8 -9
  160. nautobot/extras/tests/integration/test_customfields.py +1 -3
  161. nautobot/extras/tests/integration/test_dynamicgroups.py +7 -8
  162. nautobot/extras/tests/integration/test_relationships.py +0 -2
  163. nautobot/extras/tests/test_api.py +63 -0
  164. nautobot/extras/tests/test_changelog.py +24 -2
  165. nautobot/extras/tests/test_filters.py +36 -3
  166. nautobot/extras/tests/test_models.py +38 -2
  167. nautobot/extras/tests/test_utils.py +3 -4
  168. nautobot/extras/tests/test_views.py +22 -83
  169. nautobot/extras/urls.py +0 -14
  170. nautobot/extras/views.py +83 -52
  171. nautobot/ipam/filters.py +26 -0
  172. nautobot/ipam/tables.py +6 -0
  173. nautobot/ipam/templates/ipam/namespace_ip_addresses.html +1 -1
  174. nautobot/ipam/templates/ipam/namespace_prefixes.html +1 -1
  175. nautobot/ipam/templates/ipam/namespace_vrfs.html +1 -1
  176. nautobot/ipam/tests/test_filters.py +26 -1
  177. nautobot/ipam/tests/test_models.py +1 -1
  178. nautobot/ipam/views.py +9 -7
  179. nautobot/load_balancers/__init__.py +0 -0
  180. nautobot/load_balancers/api/__init__.py +1 -0
  181. nautobot/load_balancers/api/serializers.py +75 -0
  182. nautobot/load_balancers/api/urls.py +23 -0
  183. nautobot/load_balancers/api/views.py +61 -0
  184. nautobot/load_balancers/apps.py +17 -0
  185. nautobot/load_balancers/choices.py +167 -0
  186. nautobot/load_balancers/filters.py +225 -0
  187. nautobot/load_balancers/forms.py +532 -0
  188. nautobot/load_balancers/management/commands/__init__.py +0 -0
  189. nautobot/load_balancers/management/commands/generate_load_balancer_models_test_data.py +38 -0
  190. nautobot/load_balancers/migrations/0001_initial.py +465 -0
  191. nautobot/load_balancers/migrations/0002_create_default_statuses_pool_members.py +31 -0
  192. nautobot/load_balancers/migrations/__init__.py +0 -0
  193. nautobot/load_balancers/models.py +423 -0
  194. nautobot/load_balancers/navigation.py +80 -0
  195. nautobot/load_balancers/tables.py +255 -0
  196. nautobot/load_balancers/tests/__init__.py +474 -0
  197. nautobot/load_balancers/tests/test_api.py +353 -0
  198. nautobot/load_balancers/tests/test_filters.py +134 -0
  199. nautobot/load_balancers/tests/test_forms.py +266 -0
  200. nautobot/load_balancers/tests/test_models.py +195 -0
  201. nautobot/load_balancers/tests/test_views.py +229 -0
  202. nautobot/load_balancers/urls.py +17 -0
  203. nautobot/load_balancers/views.py +248 -0
  204. nautobot/project-static/dist/css/github-dark.min.css +10 -0
  205. nautobot/project-static/dist/css/github.min.css +10 -0
  206. nautobot/project-static/dist/css/nautobot.css +1 -11
  207. nautobot/project-static/dist/css/nautobot.css.map +1 -1
  208. nautobot/project-static/dist/js/libraries.js +1 -1
  209. nautobot/project-static/dist/js/libraries.js.map +1 -1
  210. nautobot/project-static/dist/js/nautobot.js +1 -1
  211. nautobot/project-static/dist/js/nautobot.js.map +1 -1
  212. nautobot/project-static/js/forms.js +13 -0
  213. nautobot/project-static/nautobot-icons/bus-globe.svg +3 -0
  214. nautobot/project-static/nautobot-icons/bus-shield-check.svg +3 -0
  215. nautobot/project-static/nautobot-icons/bus-shield.svg +3 -0
  216. nautobot/ui/package-lock.json +87 -4
  217. nautobot/ui/package.json +2 -1
  218. nautobot/ui/src/js/nautobot.js +0 -1
  219. nautobot/ui/src/js/select2.js +53 -2
  220. nautobot/ui/src/scss/nautobot.scss +51 -2
  221. nautobot/ui/webpack.config.js +13 -0
  222. nautobot/users/templates/users/preferences.html +11 -2
  223. nautobot/virtualization/filters.py +6 -1
  224. nautobot/virtualization/tests/test_filters.py +10 -1
  225. nautobot/virtualization/tests/test_models.py +1 -0
  226. nautobot/virtualization/views.py +4 -1
  227. nautobot/vpn/factory.py +25 -15
  228. nautobot/vpn/filters.py +1 -0
  229. nautobot/vpn/forms.py +1 -0
  230. nautobot/vpn/migrations/0001_initial.py +1 -1
  231. nautobot/vpn/models.py +16 -8
  232. nautobot/vpn/tables.py +5 -2
  233. nautobot/vpn/tests/test_api.py +0 -5
  234. nautobot/vpn/tests/test_forms.py +1 -2
  235. nautobot/vpn/tests/test_models.py +57 -7
  236. nautobot/vpn/tests/test_views.py +22 -3
  237. nautobot/vpn/views.py +78 -20
  238. {nautobot-3.0.0a3.dist-info → nautobot-3.0.0rc1.dist-info}/METADATA +4 -4
  239. {nautobot-3.0.0a3.dist-info → nautobot-3.0.0rc1.dist-info}/RECORD +243 -352
  240. nautobot/circuits/templates/circuits/circuit.html +0 -2
  241. nautobot/circuits/templates/circuits/circuit_edit.html +0 -2
  242. nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -2
  243. nautobot/circuits/templates/circuits/circuit_update.html +0 -1
  244. nautobot/circuits/templates/circuits/circuittermination.html +0 -2
  245. nautobot/circuits/templates/circuits/circuittermination_edit.html +0 -2
  246. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +0 -2
  247. nautobot/circuits/templates/circuits/circuittermination_update.html +0 -1
  248. nautobot/circuits/templates/circuits/circuittype.html +0 -2
  249. nautobot/circuits/templates/circuits/circuittype_retrieve.html +0 -2
  250. nautobot/circuits/templates/circuits/inc/circuit_termination.html +0 -85
  251. nautobot/circuits/templates/circuits/provider.html +0 -2
  252. nautobot/circuits/templates/circuits/provider_edit.html +0 -2
  253. nautobot/circuits/templates/circuits/provider_retrieve.html +0 -1
  254. nautobot/circuits/templates/circuits/provider_update.html +0 -1
  255. nautobot/circuits/templates/circuits/providernetwork.html +0 -2
  256. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +0 -2
  257. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +0 -2
  258. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +0 -2
  259. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +0 -2
  260. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +0 -2
  261. nautobot/core/templates/buttons/import.html +0 -9
  262. nautobot/data_validation/templates/data_validation/datacompliance_retrieve.html +0 -1
  263. nautobot/dcim/templates/dcim/cable.html +0 -2
  264. nautobot/dcim/templates/dcim/cable_edit.html +0 -2
  265. nautobot/dcim/templates/dcim/controller/base.html +0 -2
  266. nautobot/dcim/templates/dcim/controller_retrieve.html +0 -2
  267. nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +0 -2
  268. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -2
  269. nautobot/dcim/templates/dcim/device/base.html +0 -2
  270. nautobot/dcim/templates/dcim/device/consoleports.html +0 -2
  271. nautobot/dcim/templates/dcim/device/consoleserverports.html +0 -2
  272. nautobot/dcim/templates/dcim/device/devicebays.html +0 -2
  273. nautobot/dcim/templates/dcim/device/frontports.html +0 -2
  274. nautobot/dcim/templates/dcim/device/interfaces.html +0 -2
  275. nautobot/dcim/templates/dcim/device/inventory.html +0 -2
  276. nautobot/dcim/templates/dcim/device/modulebays.html +0 -2
  277. nautobot/dcim/templates/dcim/device/poweroutlets.html +0 -2
  278. nautobot/dcim/templates/dcim/device/powerports.html +0 -2
  279. nautobot/dcim/templates/dcim/device/rearports.html +0 -2
  280. nautobot/dcim/templates/dcim/device/wireless.html +0 -2
  281. nautobot/dcim/templates/dcim/device_component.html +0 -2
  282. nautobot/dcim/templates/dcim/device_edit.html +0 -2
  283. nautobot/dcim/templates/dcim/devicefamily_retrieve.html +0 -2
  284. nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +0 -2
  285. nautobot/dcim/templates/dcim/devicetype.html +0 -2
  286. nautobot/dcim/templates/dcim/devicetype_edit.html +0 -2
  287. nautobot/dcim/templates/dcim/devicetype_retrieve.html +0 -2
  288. nautobot/dcim/templates/dcim/inc/device_napalm_tabs.html +0 -1
  289. nautobot/dcim/templates/dcim/interfaceredundancygroup_retrieve.html +0 -2
  290. nautobot/dcim/templates/dcim/location.html +0 -2
  291. nautobot/dcim/templates/dcim/location_edit.html +0 -2
  292. nautobot/dcim/templates/dcim/location_retrieve.html +0 -2
  293. nautobot/dcim/templates/dcim/locationtype.html +0 -2
  294. nautobot/dcim/templates/dcim/locationtype_retrieve.html +0 -2
  295. nautobot/dcim/templates/dcim/manufacturer.html +0 -2
  296. nautobot/dcim/templates/dcim/modulebay_retrieve.html +0 -1
  297. nautobot/dcim/templates/dcim/platform.html +0 -2
  298. nautobot/dcim/templates/dcim/powerfeed.html +0 -2
  299. nautobot/dcim/templates/dcim/powerfeed_retrieve.html +0 -2
  300. nautobot/dcim/templates/dcim/powerpanel.html +0 -2
  301. nautobot/dcim/templates/dcim/powerpanel_edit.html +0 -2
  302. nautobot/dcim/templates/dcim/powerpanel_retrieve.html +0 -2
  303. nautobot/dcim/templates/dcim/rack.html +0 -2
  304. nautobot/dcim/templates/dcim/rack_edit.html +0 -2
  305. nautobot/dcim/templates/dcim/rackgroup.html +0 -2
  306. nautobot/dcim/templates/dcim/rackreservation.html +0 -2
  307. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +0 -2
  308. nautobot/dcim/templates/dcim/softwareversion_retrieve.html +0 -2
  309. nautobot/dcim/templates/dcim/virtualchassis.html +0 -2
  310. nautobot/dcim/templates/dcim/virtualchassis_add.html +0 -2
  311. nautobot/dcim/templates/dcim/virtualchassis_edit.html +0 -2
  312. nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +0 -2
  313. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +0 -2
  314. nautobot/dcim/ui.py +0 -29
  315. nautobot/extras/templates/extras/computedfield.html +0 -2
  316. nautobot/extras/templates/extras/computedfield_retrieve.html +0 -2
  317. nautobot/extras/templates/extras/configcontext.html +0 -2
  318. nautobot/extras/templates/extras/configcontext_edit.html +0 -2
  319. nautobot/extras/templates/extras/configcontext_retrieve.html +0 -2
  320. nautobot/extras/templates/extras/configcontextschema.html +0 -2
  321. nautobot/extras/templates/extras/configcontextschema_edit.html +0 -2
  322. nautobot/extras/templates/extras/contact_retrieve.html +0 -2
  323. nautobot/extras/templates/extras/customfield.html +0 -2
  324. nautobot/extras/templates/extras/customfield_edit.html +0 -2
  325. nautobot/extras/templates/extras/customfield_retrieve.html +0 -2
  326. nautobot/extras/templates/extras/customlink.html +0 -2
  327. nautobot/extras/templates/extras/dynamicgroup.html +0 -2
  328. nautobot/extras/templates/extras/dynamicgroup_edit.html +0 -2
  329. nautobot/extras/templates/extras/exporttemplate.html +0 -2
  330. nautobot/extras/templates/extras/gitrepository.html +0 -2
  331. nautobot/extras/templates/extras/gitrepository_object_edit.html +0 -2
  332. nautobot/extras/templates/extras/graphqlquery.html +0 -2
  333. nautobot/extras/templates/extras/graphqlquery_list.html +0 -1
  334. nautobot/extras/templates/extras/graphqlquery_retrieve.html +0 -2
  335. nautobot/extras/templates/extras/job_detail.html +0 -2
  336. nautobot/extras/templates/extras/jobbutton_retrieve.html +0 -2
  337. nautobot/extras/templates/extras/jobhook.html +0 -2
  338. nautobot/extras/templates/extras/jobqueue_retrieve.html +0 -2
  339. nautobot/extras/templates/extras/jobresult.html +0 -2
  340. nautobot/extras/templates/extras/metadatatype_retrieve.html +0 -2
  341. nautobot/extras/templates/extras/note.html +0 -2
  342. nautobot/extras/templates/extras/note_retrieve.html +0 -1
  343. nautobot/extras/templates/extras/object_changelog.html +0 -2
  344. nautobot/extras/templates/extras/object_notes.html +0 -2
  345. nautobot/extras/templates/extras/objectchange.html +0 -2
  346. nautobot/extras/templates/extras/objectchange_list.html +0 -3
  347. nautobot/extras/templates/extras/relationship.html +0 -1
  348. nautobot/extras/templates/extras/secret.html +0 -1
  349. nautobot/extras/templates/extras/secret_edit.html +0 -1
  350. nautobot/extras/templates/extras/secretsgroup.html +0 -2
  351. nautobot/extras/templates/extras/secretsgroup_edit.html +0 -2
  352. nautobot/extras/templates/extras/secretsgroup_retrieve.html +0 -2
  353. nautobot/extras/templates/extras/status.html +0 -2
  354. nautobot/extras/templates/extras/tag.html +0 -2
  355. nautobot/extras/templates/extras/tag_edit.html +0 -2
  356. nautobot/extras/templates/extras/tag_retrieve.html +0 -2
  357. nautobot/extras/templates/extras/team_retrieve.html +0 -2
  358. nautobot/ipam/templates/ipam/namespace_retrieve.html +0 -1
  359. nautobot/ipam/templates/ipam/prefix.html +0 -2
  360. nautobot/ipam/templates/ipam/prefix_edit.html +0 -1
  361. nautobot/ipam/templates/ipam/prefix_retrieve.html +0 -2
  362. nautobot/ipam/templates/ipam/rir.html +0 -2
  363. nautobot/ipam/templates/ipam/routetarget.html +0 -1
  364. nautobot/ipam/templates/ipam/service.html +0 -2
  365. nautobot/ipam/templates/ipam/service_edit.html +0 -2
  366. nautobot/ipam/templates/ipam/service_retrieve.html +0 -2
  367. nautobot/ipam/templates/ipam/vlan.html +0 -2
  368. nautobot/ipam/templates/ipam/vlan_edit.html +0 -2
  369. nautobot/ipam/templates/ipam/vlan_retrieve.html +0 -2
  370. nautobot/ipam/templates/ipam/vlangroup.html +0 -2
  371. nautobot/ipam/templates/ipam/vrf.html +0 -1
  372. nautobot/tenancy/templates/tenancy/tenant.html +0 -2
  373. nautobot/tenancy/templates/tenancy/tenant_edit.html +0 -2
  374. nautobot/tenancy/templates/tenancy/tenantgroup.html +0 -2
  375. nautobot/tenancy/templates/tenancy/tenantgroup_retrieve.html +0 -1
  376. nautobot/virtualization/templates/virtualization/clustergroup.html +0 -2
  377. nautobot/virtualization/templates/virtualization/clustertype.html +0 -2
  378. nautobot/virtualization/templates/virtualization/virtualmachine.html +0 -2
  379. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +0 -2
  380. nautobot/virtualization/templates/virtualization/virtualmachine_retrieve.html +0 -2
  381. nautobot/vpn/templates/vpn/vpnprofile.html +0 -2
  382. nautobot/wireless/templates/wireless/radioprofile_retrieve.html +0 -2
  383. nautobot/wireless/templates/wireless/supporteddatarate_retrieve.html +0 -2
  384. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +0 -2
  385. {nautobot-3.0.0a3.dist-info → nautobot-3.0.0rc1.dist-info}/LICENSE.txt +0 -0
  386. {nautobot-3.0.0a3.dist-info → nautobot-3.0.0rc1.dist-info}/NOTICE +0 -0
  387. {nautobot-3.0.0a3.dist-info → nautobot-3.0.0rc1.dist-info}/WHEEL +0 -0
  388. {nautobot-3.0.0a3.dist-info → nautobot-3.0.0rc1.dist-info}/entry_points.txt +0 -0
@@ -102,7 +102,7 @@ TREE_LINK = """
102
102
 
103
103
  POWERFEED_CABLE = """
104
104
  <a href="{{ value.get_absolute_url }}">{{ value }}</a>
105
- <a href="{% url 'dcim:powerfeed_trace' pk=record.pk %}" class="btn btn-primary btn-xs" title="Trace">
105
+ <a href="{% url 'dcim:powerfeed_trace' pk=record.pk %}" class="btn btn-primary btn-sm" title="Trace">
106
106
  <i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i>
107
107
  </a>
108
108
  """
@@ -1,8 +1,6 @@
1
1
  {% extends 'base.html' %}
2
2
  {% load helpers %}
3
3
 
4
- {% block title %}Cable Trace for {{ object|meta:"verbose_name"|bettertitle }} {{ object }}{% endblock %}
5
-
6
4
  {% block content %}
7
5
  <div class="row">
8
6
  <div class="col-lg-5 col-md-12">
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -10,7 +10,7 @@
10
10
  <div class="card-footer d-print-none">
11
11
  {% if table.rows %}
12
12
  <button type="submit" name="_edit" formaction="{% url table.Meta.model|viewname:"bulk_rename" %}?return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-warning">
13
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
13
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
14
14
  </button>
15
15
  <button type="submit" name="_edit" formaction="{% url table.Meta.model|viewname:"bulk_edit" %}?return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-warning">
16
16
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -10,7 +10,7 @@
10
10
  <div class="card-footer d-print-none">
11
11
  {% if table.rows %}
12
12
  <button type="submit" name="_edit" formaction="{% url table.Meta.model|viewname:"bulk_rename" %}?return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-warning">
13
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
13
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
14
14
  </button>
15
15
  <button type="submit" name="_edit" formaction="{% url table.Meta.model|viewname:"bulk_edit" %}?return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-warning">
16
16
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -1,5 +1,5 @@
1
1
  <div style="margin-left: -30px">
2
- <object data="{% url 'dcim-api:rack-elevation' pk=object.pk %}?face={{face}}&render=svg" class="rack_elevation"></object>
2
+ <object data="{% url 'dcim-api:rack-elevation' pk=object.pk %}?face={{face}}&render=svg" class="rack_elevation invert-in-dark-mode"></object>
3
3
  </div>
4
4
  <div class="text-center text-small">
5
5
  <a href="{% url 'dcim-api:rack-elevation' pk=object.pk %}?face={{face}}&render=svg" class="rack_elevation_save_svg_link" download="rack_{{ face }}_{{ object }}.svg">
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -44,6 +44,14 @@
44
44
  <td>Type</td>
45
45
  <td>{{ object.get_type_display }}</td>
46
46
  </tr>
47
+ <tr>
48
+ <td>Speed</td>
49
+ <td>{{ object.speed|humanize_speed|placeholder }}</td>
50
+ </tr>
51
+ <tr>
52
+ <td>Duplex</td>
53
+ <td>{{ object.get_duplex_display|placeholder }}</td>
54
+ </tr>
47
55
  <tr>
48
56
  <td>Enabled</td>
49
57
  <td>{{ object.enabled | render_boolean }}</td>
@@ -12,6 +12,8 @@
12
12
  {% render_field form.status %}
13
13
  {% render_field form.role %}
14
14
  {% render_field form.type %}
15
+ {% render_field form.speed %}
16
+ {% render_field form.duplex %}
15
17
  {% render_field form.enabled %}
16
18
  {% render_field form.parent_interface %}
17
19
  {% render_field form.bridge %}
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_consoleport %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:consoleport_bulk_rename' %}?return_url={% url 'dcim:module_consoleports' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:consoleport_bulk_edit' %}?module={{ object.pk }}&return_url={% url 'dcim:module_consoleports' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_consoleserverport %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={% url 'dcim:module_consoleserverports' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:consoleserverport_bulk_edit' %}?module={{ object.pk }}&return_url={% url 'dcim:module_consoleserverports' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_frontport %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={% url 'dcim:module_frontports' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:frontport_bulk_edit' %}?module={{ object.pk }}&return_url={% url 'dcim:module_frontports' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -20,7 +20,7 @@
20
20
  <div class="card-footer d-print-none">
21
21
  {% if perms.dcim.change_interface %}
22
22
  <button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={% url 'dcim:module_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
23
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
23
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
24
24
  </button>
25
25
  <button type="submit" name="_edit" formaction="{% url 'dcim:interface_bulk_edit' %}?return_url={% url 'dcim:module_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
26
26
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_modulebay %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:modulebay_bulk_rename' %}?return_url={% url 'dcim:module_modulebays' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:modulebay_bulk_edit' %}?parent_module={{ object.pk }}&return_url={% url 'dcim:module_modulebays' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_poweroutlet %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={% url 'dcim:module_poweroutlets' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:poweroutlet_bulk_edit' %}?module={{ object.pk }}&return_url={% url 'dcim:module_poweroutlets' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_powerport %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:powerport_bulk_rename' %}?return_url={% url 'dcim:module_powerports' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:powerport_bulk_edit' %}?module={{ object.pk }}&return_url={% url 'dcim:module_powerports' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -17,7 +17,7 @@
17
17
  <div class="card-footer d-print-none">
18
18
  {% if perms.dcim.change_rearport %}
19
19
  <button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={% url 'dcim:module_rearports' pk=object.pk %}" class="btn btn-warning btn-sm">
20
- <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
20
+ <span class="mdi mdi-rename" aria-hidden="true"></span> Rename
21
21
  </button>
22
22
  <button type="submit" name="_edit" formaction="{% url 'dcim:rearport_bulk_edit' %}?module={{ object.pk }}&return_url={% url 'dcim:module_rearports' pk=object.pk %}" class="btn btn-warning btn-sm">
23
23
  <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
@@ -2,10 +2,10 @@
2
2
  {% load buttons %}
3
3
 
4
4
  {% block import_list_element %}
5
- <li><a href="{% url 'dcim:moduletype_import' %}">
5
+ <li><a class="dropdown-item" href="{% url 'dcim:moduletype_import' %}">
6
6
  <span class="mdi mdi-database-import text-secondary" aria-hidden="true"></span> Import from JSON/YAML (single record)
7
7
  </a></li>
8
- <li><a href="{% job_import_url content_type %}">
8
+ <li><a class="dropdown-item" href="{% job_import_url content_type %}">
9
9
  <span class="mdi mdi-database-import text-secondary" aria-hidden="true"></span> Import from CSV (multiple records)
10
10
  </a></li>
11
11
  {% endblock import_list_element %}
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -40,7 +40,7 @@
40
40
  <div class="text-center">
41
41
  <strong>{{ rack|hyperlinked_object }}</strong>
42
42
  {% if rack.role %}
43
- <br /><small class="label" style="color: {{ rack.role.color|fgcolor }}; background-color: #{{ rack.role.color }}">{{ rack.role }}</small>
43
+ <br /><small class="badge" style="color: {{ rack.role.color|fgcolor }}; background-color: #{{ rack.role.color }}">{{ rack.role }}</small>
44
44
  {% endif %}
45
45
  {% if rack.facility_id %}
46
46
  <br /><small class="text-secondary">{{ rack.facility_id }}</small>
@@ -2,15 +2,6 @@
2
2
  {% load helpers %}
3
3
  {% load static %}
4
4
 
5
- {% block extra_styles %}
6
- <!-- Invert the rack elevation in dark mode as a quick fix until we have a proper dark mode svg generation -->
7
- <style>
8
- [data-theme="dark"] .rack_elevation {
9
- filter: invert(1) hue-rotate(180deg);
10
- }
11
- </style>
12
- {% endblock %}
13
-
14
5
  {% block extra_buttons %}
15
6
  {% if prev_rack %}
16
7
  <a href="{% url 'dcim:rack' pk=prev_rack.pk %}" class="btn btn-primary">
@@ -38,8 +29,6 @@
38
29
  </button>
39
30
  {% endblock extra_buttons %}
40
31
 
41
- {% block title %}Rack {{ object }}{% endblock title %}
42
-
43
32
  {% block content_left_page %}
44
33
  <div class="card">
45
34
  <div class="card-header">
@@ -1,4 +1,4 @@
1
- {% extends 'dcim/device_component.html' %}
1
+ {% extends 'generic/object_retrieve.html' %}
2
2
  {% load helpers %}
3
3
 
4
4
  {% block content_left_page %}
@@ -8,7 +8,7 @@
8
8
  {% if cable.length %}
9
9
  ({{ cable.length }} {{ cable.get_length_unit_display }})<br />
10
10
  {% endif %}
11
- <span class="label" style="color: {{cable.status.color|fgcolor}}; background-color: #{{cable.status.color}}">{{ cable.get_status_display }}</span><br />
11
+ <span class="badge" style="color: {{cable.status.color|fgcolor}}; background-color: #{{cable.status.color}}">{{ cable.get_status_display }}</span><br />
12
12
  {% for tag in cable.tags.all %}
13
13
  {% tag tag 'dcim:cable_list' %}
14
14
  {% endfor %}
@@ -32,7 +32,7 @@
32
32
  {% include 'inc/extras_features_edit_form_fields.html' with form=vc_form %}
33
33
  <div class="card">
34
34
  <div class="card-header"><strong>Members</strong></div>
35
- <table class="card-body">
35
+ <table class="table table-hover">
36
36
  <thead>
37
37
  <tr>
38
38
  <th>Device</th>
@@ -1,4 +1,3 @@
1
- from django.test import tag
2
1
  from django.urls import reverse
3
2
 
4
3
  from nautobot.core.testing.integration import SeleniumTestCase
@@ -10,7 +9,6 @@ class ControllerTestCase(SeleniumTestCase):
10
9
  Perform set of Controller tests using Selenium.
11
10
  """
12
11
 
13
- @tag("fix_in_v3")
14
12
  def test_controller_bulk_edit(self):
15
13
  """
16
14
  This test goes through the process of creating a Controller and performing bulk edit.
@@ -55,9 +53,8 @@ class ControllerTestCase(SeleniumTestCase):
55
53
  self.browser.find_by_xpath(f"//button[@formaction='{bulk_edit_url}']").click()
56
54
 
57
55
  # Submit bulk edit form without any changes
58
- self.browser.find_by_xpath("//button[@name='_apply']", wait_time=5).click()
56
+ self.assertTrue(self.browser.is_element_present_by_xpath("//button[@name='_apply']", wait_time=5))
57
+ self.browser.find_by_xpath("//button[@name='_apply']").click()
59
58
 
60
59
  job_result = JobResult.objects.filter(name="Bulk Edit Objects").first()
61
- self.assertEqual(
62
- self.browser.url, self.live_server_url + reverse("extras:jobresult", args=[job_result.pk]) + "?tab=main"
63
- )
60
+ self.assertEqual(self.browser.url, self.live_server_url + reverse("extras:jobresult", args=[job_result.pk]))
@@ -1,4 +1,3 @@
1
- from django.test import tag
2
1
  from django.urls import reverse
3
2
 
4
3
  from nautobot.core.testing.integration import SeleniumTestCase
@@ -10,7 +9,6 @@ class ControllerManagedDeviceGroupsTestCase(SeleniumTestCase):
10
9
  Perform set of Controller Managed Device Group tests using Selenium.
11
10
  """
12
11
 
13
- @tag("fix_in_v3")
14
12
  def test_controller_managed_device_groups_bulk_edit(self):
15
13
  """
16
14
  This test goes through the process of creating a Controller Managed Device Group and performing bulk edit.
@@ -66,6 +64,4 @@ class ControllerManagedDeviceGroupsTestCase(SeleniumTestCase):
66
64
  self.browser.find_by_xpath("//button[@name='_apply']", wait_time=5).click()
67
65
 
68
66
  job_result = JobResult.objects.filter(name="Bulk Edit Objects").first()
69
- self.assertEqual(
70
- self.browser.url, self.live_server_url + reverse("extras:jobresult", args=[job_result.pk]) + "?tab=main"
71
- )
67
+ self.assertEqual(self.browser.url, self.live_server_url + reverse("extras:jobresult", args=[job_result.pk]))
@@ -1,4 +1,3 @@
1
- from django.test import tag
2
1
  from django.urls import reverse
3
2
 
4
3
  from nautobot.core.testing.integration import SeleniumTestCase
@@ -9,7 +8,6 @@ class CreateDeviceTestCase(SeleniumTestCase):
9
8
  Create a device and all pre-requisite objects through the UI.
10
9
  """
11
10
 
12
- @tag("fix_in_v3")
13
11
  def test_create_device(self):
14
12
  """
15
13
  This test goes through the process of creating a device in the UI. All pre-requisite objects are created:
@@ -1,6 +1,5 @@
1
1
  import uuid
2
2
 
3
- from django.test import tag
4
3
  from django.urls import reverse
5
4
  from selenium.webdriver.common.by import By
6
5
  from selenium.webdriver.support import expected_conditions
@@ -14,7 +13,6 @@ from nautobot.dcim.models import Controller, Device
14
13
  from nautobot.extras.tests.integration import create_test_device
15
14
 
16
15
 
17
- @tag("fix_in_v3")
18
16
  class DeviceBulkOperationsTestCase(BulkOperationsTestCases.BulkOperationsTestCase):
19
17
  """
20
18
  Test devices bulk edit / delete operations.
@@ -92,6 +90,6 @@ class DeviceBulkUrlParamTestCase(SeleniumTestCase):
92
90
  lambda d: d.find_element(By.ID, "select2-id_device_type-container")
93
91
  .find_element(By.CLASS_NAME, "select2-selection__placeholder")
94
92
  .text.strip()
95
- == "None"
93
+ == "---------"
96
94
  )
97
95
  )
@@ -1,7 +1,6 @@
1
- from django.test import tag
2
1
  from django.urls import reverse
3
2
 
4
- from nautobot.core.testing.integration import SeleniumTestCase, WebDriverWait
3
+ from nautobot.core.testing.integration import SeleniumTestCase
5
4
  from nautobot.dcim.models import Location, LocationType
6
5
  from nautobot.extras.models import Job, Status
7
6
 
@@ -16,14 +15,14 @@ class ClearableFileInputTestCase(SeleniumTestCase):
16
15
  Ensure clearable input file type has working clear and info display.
17
16
  """
18
17
  self.browser.visit(f"{self.live_server_url}{uri_to_visit}")
19
- WebDriverWait(self.browser, 10).until(lambda driver: driver.is_text_present(page_loaded_confirmation))
18
+ self.assertTrue(self.browser.is_text_present(page_loaded_confirmation, wait_time=10))
20
19
 
21
20
  # Find the first file input button and scroll to it
22
21
  front_image_button = self.browser.find_by_css("span.group-span-filestyle.input-group-btn").first
23
22
  front_image_button.scroll_to()
24
23
 
25
24
  # cancel button is NOT visible initially
26
- self.assertFalse(self.browser.find_by_css("button.clear-button").first.visible)
25
+ self.assertTrue(self.browser.find_by_css("button.clear-button").first.is_not_visible(wait_time=5))
27
26
 
28
27
  # Test file text changes after selecting a file
29
28
  file_selection_indicator_css = "div.bootstrap-filestyle input[type='text'].form-control"
@@ -34,14 +33,13 @@ class ClearableFileInputTestCase(SeleniumTestCase):
34
33
 
35
34
  # clear button is now visible
36
35
  clear_button = self.browser.find_by_css("button.clear-button").first
37
- self.assertTrue(clear_button.visible)
36
+ self.assertTrue(clear_button.is_visible(wait_time=5))
38
37
 
39
38
  # clicking clearbutton should hide the button, and wipe the file input value
40
39
  clear_button.click()
41
- self.assertFalse(clear_button.visible)
40
+ self.assertTrue(clear_button.is_not_visible(wait_time=5))
42
41
  self.assertEqual(front_image_file_input.value, "")
43
42
 
44
- @tag("fix_in_v3")
45
43
  def test_add_device_page(self):
46
44
  """
47
45
  Confirm device type add page input is working correctly.
@@ -52,7 +50,6 @@ class ClearableFileInputTestCase(SeleniumTestCase):
52
50
  file_input_selector_id="id_front_image",
53
51
  )
54
52
 
55
- @tag("fix_in_v3")
56
53
  def test_job_runner_page(self):
57
54
  """
58
55
  Confirm job run page file input is working correctly.
@@ -65,7 +62,6 @@ class ClearableFileInputTestCase(SeleniumTestCase):
65
62
  file_input_selector_id="id_input_file",
66
63
  )
67
64
 
68
- @tag("fix_in_v3")
69
65
  def test_location_image_attachment_view(self):
70
66
  """
71
67
  Confirm location image attachment page is working correctly.
@@ -80,6 +76,6 @@ class ClearableFileInputTestCase(SeleniumTestCase):
80
76
  )
81
77
  self._assert_file_picker(
82
78
  uri_to_visit=location_image_attach_uri,
83
- page_loaded_confirmation="Image attachment",
79
+ page_loaded_confirmation="IMAGE ATTACHMENT",
84
80
  file_input_selector_id="id_image",
85
81
  )
@@ -1,5 +1,4 @@
1
1
  from django.contrib.contenttypes.models import ContentType
2
- from django.test import tag
3
2
 
4
3
  from nautobot.core.testing.integration import (
5
4
  BulkOperationsTestCases,
@@ -8,7 +7,6 @@ from nautobot.dcim.models import Device, Location, LocationType
8
7
  from nautobot.extras.models import Status
9
8
 
10
9
 
11
- @tag("fix_in_v3")
12
10
  class LocationBulkOperationsTestCase(BulkOperationsTestCases.BulkOperationsTestCase):
13
11
  """
14
12
  Test locations bulk edit / delete operations.
@@ -33,10 +33,9 @@ class ModuleBayPositionTestCase(SeleniumTestCase, ObjectsListMixin):
33
33
  self.assertEqual(position_field.value, "new pattern", "Position field value has unexpectedly changed")
34
34
 
35
35
  # Regenerate position
36
- self.browser.execute_script(
37
- "document.querySelector('button[title=\"Regenerate position\"]').scrollIntoView({ behavior: 'instant', block: 'start' })"
38
- )
39
- self.browser.find_by_css('button[title="Regenerate position"]').click()
36
+ regenerate_position_button = self.browser.find_by_css('button[title="Regenerate position"]')
37
+ self.scroll_element_into_view(element=regenerate_position_button)
38
+ regenerate_position_button.click()
40
39
  self.assertEqual(position_field.value, f"{name_pattern_value}v2", "Position field value is not re-populated")
41
40
 
42
41
  def test_create_device_type_module_bay(self):