nautobot 2.1.0__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 (815) 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 -1
  7. nautobot/apps/datasources.py +0 -1
  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 +0 -1
  14. nautobot/apps/models.py +1 -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 +0 -2
  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 +4 -6
  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 +1 -2
  71. nautobot/core/choices.py +2 -2
  72. nautobot/core/cli/__init__.py +2 -3
  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 +1 -1
  82. nautobot/core/graphql/schema.py +6 -7
  83. nautobot/core/graphql/schema_init.py +0 -1
  84. nautobot/core/graphql/utils.py +1 -2
  85. nautobot/core/management/commands/generate_test_data.py +4 -6
  86. nautobot/core/management/commands/makemigrations.py +1 -1
  87. nautobot/core/management/commands/migrate.py +1 -1
  88. nautobot/core/management/commands/post_upgrade.py +0 -15
  89. nautobot/core/management/commands/refresh_content_type_cache.py +1 -2
  90. nautobot/core/management/commands/send_installation_metrics.py +2 -3
  91. nautobot/core/management/commands/validate_models.py +1 -1
  92. nautobot/core/middleware.py +2 -2
  93. nautobot/core/models/__init__.py +12 -12
  94. nautobot/core/models/fields.py +1 -1
  95. nautobot/core/models/generics.py +2 -3
  96. nautobot/core/models/managers.py +0 -1
  97. nautobot/core/models/name_color_content_types.py +2 -2
  98. nautobot/core/models/tree_queries.py +2 -4
  99. nautobot/core/models/validators.py +1 -1
  100. nautobot/core/releases.py +1 -1
  101. nautobot/core/runner/importer.py +2 -25
  102. nautobot/core/runner/runner.py +2 -2
  103. nautobot/core/runner/settings.py +1 -1
  104. nautobot/core/settings.py +9 -22
  105. nautobot/core/settings_funcs.py +1 -2
  106. nautobot/core/signals.py +0 -1
  107. nautobot/core/tables.py +1 -1
  108. nautobot/core/templates/graphene/graphiql.html +7 -1
  109. nautobot/core/templates/inc/footer.html +0 -7
  110. nautobot/core/templates/nautobot_config.py.j2 +0 -4
  111. nautobot/core/templatetags/bootstrapped_goodies_tags.py +6 -3
  112. nautobot/core/templatetags/buttons.py +1 -1
  113. nautobot/core/templatetags/helpers.py +5 -16
  114. nautobot/core/testing/__init__.py +1 -2
  115. nautobot/core/testing/api.py +2 -4
  116. nautobot/core/testing/filters.py +1 -1
  117. nautobot/core/testing/integration.py +2 -2
  118. nautobot/core/testing/migrations.py +1 -0
  119. nautobot/core/testing/mixins.py +1 -2
  120. nautobot/core/testing/schema.py +1 -1
  121. nautobot/core/testing/utils.py +3 -3
  122. nautobot/core/testing/views.py +4 -7
  123. nautobot/core/tests/integration/test_plugin_home.py +2 -1
  124. nautobot/core/tests/integration/test_plugin_navbar.py +1 -1
  125. nautobot/core/tests/nautobot_config.py +3 -3
  126. nautobot/core/tests/runner.py +3 -4
  127. nautobot/core/tests/test_api.py +6 -51
  128. nautobot/core/tests/test_authentication.py +2 -3
  129. nautobot/core/tests/test_checks.py +1 -2
  130. nautobot/core/tests/test_config.py +1 -1
  131. nautobot/core/tests/test_csv.py +3 -3
  132. nautobot/core/tests/test_factory.py +1 -3
  133. nautobot/core/tests/test_filters.py +3 -7
  134. nautobot/core/tests/test_forms.py +3 -6
  135. nautobot/core/tests/test_graphql.py +13 -14
  136. nautobot/core/tests/test_jinja_filters.py +4 -4
  137. nautobot/core/tests/test_jobs.py +1 -1
  138. nautobot/core/tests/test_models.py +1 -2
  139. nautobot/core/tests/test_navigations.py +2 -1
  140. nautobot/core/tests/test_openapi.py +0 -1
  141. nautobot/core/tests/test_paginator.py +2 -2
  142. nautobot/core/tests/test_releases.py +2 -2
  143. nautobot/core/tests/test_tables.py +1 -1
  144. nautobot/core/tests/test_templatetags_helpers.py +3 -2
  145. nautobot/core/tests/test_templatetags_netutils.py +1 -2
  146. nautobot/core/tests/test_utils.py +4 -8
  147. nautobot/core/tests/test_views.py +5 -2
  148. nautobot/core/tests/test_views_utils.py +0 -1
  149. nautobot/core/urls.py +4 -4
  150. nautobot/core/utils/color.py +1 -1
  151. nautobot/core/utils/data.py +1 -2
  152. nautobot/core/utils/filtering.py +4 -5
  153. nautobot/core/utils/git.py +3 -2
  154. nautobot/core/utils/logging.py +2 -1
  155. nautobot/core/utils/migrations.py +1 -0
  156. nautobot/core/utils/permissions.py +2 -4
  157. nautobot/core/views/__init__.py +5 -5
  158. nautobot/core/views/generic.py +4 -4
  159. nautobot/core/views/mixins.py +11 -12
  160. nautobot/core/views/renderers.py +1 -1
  161. nautobot/core/views/utils.py +2 -1
  162. nautobot/dcim/api/urls.py +1 -1
  163. nautobot/dcim/api/views.py +6 -5
  164. nautobot/dcim/apps.py +1 -1
  165. nautobot/dcim/choices.py +0 -1
  166. nautobot/dcim/constants.py +0 -1
  167. nautobot/dcim/elevations.py +1 -2
  168. nautobot/dcim/factory.py +10 -13
  169. nautobot/dcim/fields.py +1 -0
  170. nautobot/dcim/filters/__init__.py +2 -3
  171. nautobot/dcim/filters/mixins.py +1 -1
  172. nautobot/dcim/forms.py +10 -12
  173. nautobot/dcim/graphql/types.py +16 -17
  174. nautobot/dcim/migrations/0001_initial_part_1.py +4 -2
  175. nautobot/dcim/migrations/0002_initial_part_2.py +2 -1
  176. nautobot/dcim/migrations/0003_initial_part_3.py +2 -1
  177. nautobot/dcim/migrations/0004_initial_part_4.py +2 -1
  178. nautobot/dcim/migrations/0006_auto_slug.py +1 -0
  179. nautobot/dcim/migrations/0009_add_natural_indexing.py +1 -0
  180. nautobot/dcim/migrations/0010_interface_status.py +1 -0
  181. nautobot/dcim/migrations/0011_interface_status_data_migration.py +1 -0
  182. nautobot/dcim/migrations/0013_location_location_type.py +4 -2
  183. nautobot/dcim/migrations/0014_location_status_data_migration.py +1 -0
  184. nautobot/dcim/migrations/0016_device_components__timestamp_data_migration.py +0 -1
  185. nautobot/dcim/migrations/0018_device_redundancy_group.py +4 -2
  186. nautobot/dcim/migrations/0019_device_redundancy_group_data_migration.py +1 -0
  187. nautobot/dcim/migrations/0022_interface_redundancy_group.py +3 -1
  188. nautobot/dcim/migrations/0023_interface_redundancy_group_data_migration.py +1 -0
  189. nautobot/dcim/migrations/0024_move_site_fields_to_location_model.py +2 -1
  190. nautobot/dcim/migrations/0027_alter_interface_mac_address.py +1 -0
  191. nautobot/dcim/migrations/0028_alter_device_and_rack_role_add_new_role.py +1 -0
  192. nautobot/dcim/migrations/0029_device_and_rack_roles_data_migrations.py +1 -0
  193. nautobot/dcim/migrations/0033_add_tree_managers_and_foreign_keys_pre_data_migration.py +1 -0
  194. nautobot/dcim/migrations/0034_migrate_region_and_site_data_to_locations.py +1 -2
  195. nautobot/dcim/migrations/0038_fixup_fks_and_related_names.py +1 -0
  196. nautobot/dcim/migrations/0039_related_name_changes.py +1 -0
  197. nautobot/dcim/migrations/0042_alter_location_managers.py +1 -0
  198. nautobot/dcim/migrations/0044_tagsfield.py +1 -0
  199. nautobot/dcim/migrations/0047_status_nonnullable.py +1 -0
  200. nautobot/dcim/migrations/0051_interface_redundancy_group_nullable_status.py +1 -0
  201. nautobot/dcim/models/cables.py +3 -3
  202. nautobot/dcim/models/device_component_templates.py +6 -6
  203. nautobot/dcim/models/devices.py +9 -4
  204. nautobot/dcim/models/locations.py +6 -1
  205. nautobot/dcim/models/power.py +1 -1
  206. nautobot/dcim/models/racks.py +5 -4
  207. nautobot/dcim/navigation.py +0 -1
  208. nautobot/dcim/signals.py +3 -2
  209. nautobot/dcim/tables/__init__.py +5 -4
  210. nautobot/dcim/tables/cables.py +1 -0
  211. nautobot/dcim/tables/devices.py +1 -0
  212. nautobot/dcim/tables/power.py +1 -0
  213. nautobot/dcim/tables/racks.py +2 -1
  214. nautobot/dcim/tests/test_api.py +5 -7
  215. nautobot/dcim/tests/test_cablepaths.py +0 -1
  216. nautobot/dcim/tests/test_filters.py +14 -12
  217. nautobot/dcim/tests/test_forms.py +2 -3
  218. nautobot/dcim/tests/test_migrations.py +2 -2
  219. nautobot/dcim/tests/test_models.py +2 -2
  220. nautobot/dcim/tests/test_views.py +7 -8
  221. nautobot/dcim/urls.py +3 -2
  222. nautobot/dcim/utils.py +1 -1
  223. nautobot/dcim/views.py +4 -3
  224. nautobot/extras/admin.py +2 -1
  225. nautobot/extras/api/customfields.py +0 -2
  226. nautobot/extras/api/mixins.py +0 -1
  227. nautobot/extras/api/serializers.py +4 -4
  228. nautobot/extras/api/urls.py +1 -1
  229. nautobot/extras/api/views.py +1 -1
  230. nautobot/extras/apps.py +3 -4
  231. nautobot/extras/choices.py +3 -4
  232. nautobot/extras/context_managers.py +1 -1
  233. nautobot/extras/datasources/__init__.py +1 -1
  234. nautobot/extras/datasources/git.py +6 -6
  235. nautobot/extras/datasources/utils.py +0 -1
  236. nautobot/extras/factory.py +1 -1
  237. nautobot/extras/filters/__init__.py +2 -3
  238. nautobot/extras/filters/customfields.py +0 -1
  239. nautobot/extras/filters/mixins.py +1 -1
  240. nautobot/extras/forms/__init__.py +3 -4
  241. nautobot/extras/forms/base.py +1 -1
  242. nautobot/extras/forms/forms.py +3 -3
  243. nautobot/extras/forms/mixins.py +1 -1
  244. nautobot/extras/graphql/types.py +2 -2
  245. nautobot/extras/health_checks.py +1 -1
  246. nautobot/extras/jobs.py +1 -2
  247. nautobot/extras/management/__init__.py +0 -1
  248. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -1
  249. nautobot/extras/management/commands/runjob.py +3 -3
  250. nautobot/extras/management/commands/webhook_receiver.py +1 -2
  251. nautobot/extras/migrations/0001_initial_part_1.py +2 -1
  252. nautobot/extras/migrations/0002_initial_part_2.py +2 -1
  253. nautobot/extras/migrations/0003_initial_part_3.py +1 -0
  254. nautobot/extras/migrations/0006_graphqlquery.py +2 -1
  255. nautobot/extras/migrations/0007_configcontextschema.py +3 -1
  256. nautobot/extras/migrations/0009_computedfield.py +3 -1
  257. nautobot/extras/migrations/0011_fileattachment_fileproxy.py +3 -1
  258. nautobot/extras/migrations/0012_healthchecktestmodel.py +2 -1
  259. nautobot/extras/migrations/0014_auto_slug.py +1 -0
  260. nautobot/extras/migrations/0015_scheduled_job.py +3 -1
  261. nautobot/extras/migrations/0016_secret.py +4 -2
  262. nautobot/extras/migrations/0017_joblogentry.py +2 -1
  263. nautobot/extras/migrations/0018_joblog_data_migration.py +2 -1
  264. nautobot/extras/migrations/0021_customfield_changelog_data.py +3 -2
  265. nautobot/extras/migrations/0022_objectchange_object_datav2.py +1 -0
  266. nautobot/extras/migrations/0023_job_model.py +4 -2
  267. nautobot/extras/migrations/0026_job_add_gitrepository_fk.py +1 -0
  268. nautobot/extras/migrations/0029_dynamicgroup.py +3 -1
  269. nautobot/extras/migrations/0031_tag_content_types.py +1 -0
  270. nautobot/extras/migrations/0032_tag_content_types_data_migration.py +1 -0
  271. nautobot/extras/migrations/0040_dynamicgroup__dynamicgroupmembership.py +2 -1
  272. nautobot/extras/migrations/0041_jobresult_job_kwargs.py +1 -0
  273. nautobot/extras/migrations/0043_note.py +3 -1
  274. nautobot/extras/migrations/0044_add_job_hook.py +3 -1
  275. nautobot/extras/migrations/0046_populate_custom_field_slug_label.py +1 -0
  276. nautobot/extras/migrations/0047_enforce_custom_field_slug.py +1 -0
  277. nautobot/extras/migrations/0051_add_job_task_queues.py +1 -0
  278. nautobot/extras/migrations/0055_configcontext_dynamic_groups.py +1 -0
  279. nautobot/extras/migrations/0057_jobbutton.py +3 -1
  280. nautobot/extras/migrations/0065_configcontext_data_migrations.py +1 -0
  281. nautobot/extras/migrations/0067_migrate_job_result_status.py +0 -1
  282. nautobot/extras/migrations/0068_jobresult__add_celery_fields.py +1 -0
  283. nautobot/extras/migrations/0071_replace_related_names.py +1 -0
  284. nautobot/extras/migrations/0077_migrate_custom_field_data.py +1 -0
  285. nautobot/extras/migrations/0078_remove_name_field_and_make_label_field_non_nullable.py +1 -0
  286. nautobot/extras/migrations/0080_tagsfield.py +1 -0
  287. nautobot/extras/migrations/0082_rename_relationship_name_to_label.py +1 -0
  288. nautobot/extras/migrations/0083_ensure_relationship_keys_are_unique.py +1 -0
  289. nautobot/extras/migrations/0090_joblogentry__log_level_data_migration.py +0 -1
  290. nautobot/extras/migrations/0095_ensure_note_timestamps_are_unique.py +4 -5
  291. nautobot/extras/migrations/0097_alter_job_result_remove_result.py +1 -0
  292. nautobot/extras/migrations/0100_fileproxy_job_result.py +1 -0
  293. nautobot/extras/migrations/0101_externalintegration.py +3 -1
  294. nautobot/extras/models/__init__.py +2 -3
  295. nautobot/extras/models/change_logging.py +0 -1
  296. nautobot/extras/models/customfields.py +4 -4
  297. nautobot/extras/models/datasources.py +2 -2
  298. nautobot/extras/models/groups.py +3 -4
  299. nautobot/extras/models/jobs.py +12 -6
  300. nautobot/extras/models/models.py +2 -2
  301. nautobot/extras/models/relationships.py +3 -4
  302. nautobot/extras/models/roles.py +1 -1
  303. nautobot/extras/models/secrets.py +1 -3
  304. nautobot/extras/models/tags.py +0 -1
  305. nautobot/extras/navigation.py +0 -1
  306. nautobot/extras/plugins/__init__.py +6 -7
  307. nautobot/extras/plugins/tables.py +0 -1
  308. nautobot/extras/plugins/utils.py +1 -1
  309. nautobot/extras/plugins/views.py +1 -2
  310. nautobot/extras/querysets.py +3 -3
  311. nautobot/extras/signals.py +6 -7
  312. nautobot/extras/tables.py +4 -4
  313. nautobot/extras/tasks.py +1 -2
  314. nautobot/extras/templates/extras/configcontext_edit.html +1 -1
  315. nautobot/extras/templates/extras/graphqlquery.html +4 -2
  316. nautobot/extras/templates/extras/secretsgroup_edit.html +40 -45
  317. nautobot/extras/templatetags/custom_links.py +2 -3
  318. nautobot/extras/templatetags/job_buttons.py +2 -3
  319. nautobot/extras/templatetags/log_levels.py +0 -1
  320. nautobot/extras/templatetags/plugins.py +1 -1
  321. nautobot/extras/test_jobs/api_test_job.py +1 -2
  322. nautobot/extras/test_jobs/atomic_transaction.py +1 -2
  323. nautobot/extras/test_jobs/dry_run.py +1 -2
  324. nautobot/extras/test_jobs/fail.py +1 -2
  325. nautobot/extras/test_jobs/field_order.py +1 -1
  326. nautobot/extras/test_jobs/file_upload_fail.py +1 -2
  327. nautobot/extras/test_jobs/file_upload_pass.py +1 -2
  328. nautobot/extras/test_jobs/has_sensitive_variables.py +1 -2
  329. nautobot/extras/test_jobs/ipaddress_vars.py +1 -4
  330. nautobot/extras/test_jobs/job_button_receiver.py +1 -2
  331. nautobot/extras/test_jobs/job_hook_receiver.py +1 -2
  332. nautobot/extras/test_jobs/job_variables.py +1 -2
  333. nautobot/extras/test_jobs/location_with_custom_field.py +1 -2
  334. nautobot/extras/test_jobs/log_redaction.py +1 -2
  335. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -2
  336. nautobot/extras/test_jobs/modify_db.py +1 -2
  337. nautobot/extras/test_jobs/object_var_optional.py +1 -2
  338. nautobot/extras/test_jobs/object_var_required.py +1 -2
  339. nautobot/extras/test_jobs/object_vars.py +1 -2
  340. nautobot/extras/test_jobs/pass.py +1 -2
  341. nautobot/extras/test_jobs/profiling.py +1 -2
  342. nautobot/extras/tests/integration/__init__.py +1 -1
  343. nautobot/extras/tests/integration/test_plugins.py +5 -4
  344. nautobot/extras/tests/integration/test_tagfilter.py +1 -1
  345. nautobot/extras/tests/test_api.py +7 -9
  346. nautobot/extras/tests/test_changelog.py +3 -2
  347. nautobot/extras/tests/test_context_managers.py +6 -3
  348. nautobot/extras/tests/test_customfields.py +2 -2
  349. nautobot/extras/tests/test_datasources.py +1 -1
  350. nautobot/extras/tests/test_dynamicgroups.py +2 -3
  351. nautobot/extras/tests/test_filters.py +2 -2
  352. nautobot/extras/tests/test_forms.py +5 -6
  353. nautobot/extras/tests/test_git.py +1 -1
  354. nautobot/extras/tests/test_job_variables.py +0 -1
  355. nautobot/extras/tests/test_jobs.py +5 -5
  356. nautobot/extras/tests/test_models.py +2 -2
  357. nautobot/extras/tests/test_notes.py +0 -1
  358. nautobot/extras/tests/test_plugins.py +8 -9
  359. nautobot/extras/tests/test_relationships.py +3 -3
  360. nautobot/extras/tests/test_tags.py +1 -1
  361. nautobot/extras/tests/test_views.py +8 -9
  362. nautobot/extras/tests/test_webhooks.py +4 -5
  363. nautobot/extras/utils.py +11 -9
  364. nautobot/extras/views.py +3 -3
  365. nautobot/generate_secret_key.py +1 -1
  366. nautobot/ipam/api/serializers.py +1 -2
  367. nautobot/ipam/api/urls.py +1 -1
  368. nautobot/ipam/api/views.py +1 -0
  369. nautobot/ipam/apps.py +2 -1
  370. nautobot/ipam/factory.py +6 -9
  371. nautobot/ipam/fields.py +1 -1
  372. nautobot/ipam/filters.py +4 -3
  373. nautobot/ipam/formfields.py +1 -2
  374. nautobot/ipam/forms.py +4 -3
  375. nautobot/ipam/graphql/types.py +1 -1
  376. nautobot/ipam/homepage.py +0 -1
  377. nautobot/ipam/lookups.py +2 -3
  378. nautobot/ipam/migrations/0002_initial_part_2.py +2 -1
  379. nautobot/ipam/migrations/0003_remove_max_length.py +1 -0
  380. nautobot/ipam/migrations/0004_fixup_p2p_broadcast.py +0 -1
  381. nautobot/ipam/migrations/0005_auto_slug.py +1 -0
  382. nautobot/ipam/migrations/0010_alter_ipam_role_add_new_role.py +1 -0
  383. nautobot/ipam/migrations/0011_migrate_ipam_role_data.py +1 -0
  384. nautobot/ipam/migrations/0020_related_name_changes.py +1 -0
  385. nautobot/ipam/migrations/0022_aggregate_to_prefix_data_migration.py +1 -2
  386. nautobot/ipam/migrations/0024_interface_to_ipaddress_m2m.py +2 -1
  387. nautobot/ipam/migrations/0025_interface_ipaddress_m2m_data_migration.py +1 -0
  388. nautobot/ipam/migrations/0028_tagsfield.py +1 -0
  389. nautobot/ipam/migrations/0030_ipam__namespaces.py +3 -1
  390. nautobot/ipam/migrations/0034_status_nonnullable.py +1 -0
  391. nautobot/ipam/migrations/0037_data_migration_vlan_group_name_uniqueness.py +0 -1
  392. nautobot/ipam/models.py +7 -7
  393. nautobot/ipam/navigation.py +0 -1
  394. nautobot/ipam/querysets.py +2 -2
  395. nautobot/ipam/tables.py +4 -3
  396. nautobot/ipam/tests/test_api.py +2 -2
  397. nautobot/ipam/tests/test_filters.py +7 -7
  398. nautobot/ipam/tests/test_migrations.py +1 -2
  399. nautobot/ipam/tests/test_models.py +2 -2
  400. nautobot/ipam/tests/test_ordering.py +1 -1
  401. nautobot/ipam/tests/test_querysets.py +2 -2
  402. nautobot/ipam/tests/test_views.py +6 -6
  403. nautobot/ipam/urls.py +1 -0
  404. nautobot/ipam/utils/migrations.py +0 -1
  405. nautobot/ipam/views.py +6 -6
  406. nautobot/project-static/docs/404.html +1 -43
  407. nautobot/project-static/docs/apps/index.html +1 -43
  408. nautobot/project-static/docs/apps/nautobot-apps.html +1 -43
  409. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +389 -431
  410. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +12 -54
  411. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +2452 -2486
  412. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +1 -43
  413. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +90 -132
  414. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +1 -43
  415. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +1 -43
  416. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +1 -43
  417. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1 -43
  418. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +26 -68
  419. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +993 -1035
  420. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +170 -212
  421. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +1789 -1831
  422. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +961 -1003
  423. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +1 -43
  424. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +1 -43
  425. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +2 -44
  426. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +6904 -6946
  427. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +974 -1016
  428. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +1 -43
  429. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +1159 -1197
  430. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1796 -1832
  431. nautobot/project-static/docs/development/apps/api/configuration-view.html +1 -43
  432. nautobot/project-static/docs/development/apps/api/database-backend-config.html +1 -43
  433. nautobot/project-static/docs/development/apps/api/models/django-admin.html +1 -43
  434. nautobot/project-static/docs/development/apps/api/models/global-search.html +1 -43
  435. nautobot/project-static/docs/development/apps/api/models/graphql.html +1 -43
  436. nautobot/project-static/docs/development/apps/api/models/index.html +1 -43
  437. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -43
  438. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +1 -43
  439. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +1 -43
  440. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +1 -43
  441. nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -45
  442. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +1 -43
  443. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +1 -43
  444. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +5 -43
  445. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +1 -43
  446. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +1 -43
  447. nautobot/project-static/docs/development/apps/api/prometheus.html +1 -43
  448. nautobot/project-static/docs/development/apps/api/setup.html +1 -43
  449. nautobot/project-static/docs/development/apps/api/testing.html +1 -43
  450. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +1 -43
  451. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +1 -43
  452. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +1 -43
  453. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +1 -43
  454. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +1 -43
  455. nautobot/project-static/docs/development/apps/api/views/base-template.html +1 -43
  456. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +6 -48
  457. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +1 -43
  458. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +1 -43
  459. nautobot/project-static/docs/development/apps/api/views/index.html +1 -43
  460. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -43
  461. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +1 -43
  462. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +1 -43
  463. nautobot/project-static/docs/development/apps/api/views/notes.html +3 -45
  464. nautobot/project-static/docs/development/apps/api/views/rest-api.html +1 -43
  465. nautobot/project-static/docs/development/apps/api/views/urls.html +1 -43
  466. nautobot/project-static/docs/development/apps/api/views/view-overrides.html +13 -5357
  467. nautobot/project-static/docs/development/apps/index.html +1 -43
  468. nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -43
  469. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -43
  470. nautobot/project-static/docs/development/apps/migration/from-v1.html +1 -44
  471. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +1 -43
  472. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +1 -43
  473. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +1 -43
  474. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +1 -43
  475. nautobot/project-static/docs/development/apps/porting-from-netbox.html +1 -43
  476. nautobot/project-static/docs/development/core/application-registry.html +1 -43
  477. nautobot/project-static/docs/development/core/best-practices.html +1 -43
  478. nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -43
  479. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +1 -43
  480. nautobot/project-static/docs/development/core/extending-models.html +1 -43
  481. nautobot/project-static/docs/development/core/generic-views.html +1 -43
  482. nautobot/project-static/docs/development/core/getting-started.html +108 -257
  483. nautobot/project-static/docs/development/core/homepage.html +1 -43
  484. nautobot/project-static/docs/development/core/index.html +1 -43
  485. nautobot/project-static/docs/development/core/model-features.html +1 -43
  486. nautobot/project-static/docs/development/core/natural-keys.html +1 -43
  487. nautobot/project-static/docs/development/core/navigation-menu.html +1 -43
  488. nautobot/project-static/docs/development/core/react-ui.html +13 -5640
  489. nautobot/project-static/docs/development/core/release-checklist.html +4 -52
  490. nautobot/project-static/docs/development/core/role-internals.html +4 -46
  491. nautobot/project-static/docs/development/core/style-guide.html +61 -102
  492. nautobot/project-static/docs/development/core/templates.html +4 -46
  493. nautobot/project-static/docs/development/core/testing.html +1 -43
  494. nautobot/project-static/docs/development/core/user-preferences.html +1 -43
  495. nautobot/project-static/docs/development/index.html +1 -43
  496. nautobot/project-static/docs/development/jobs/index.html +1 -43
  497. nautobot/project-static/docs/development/jobs/migration/from-v1.html +1 -43
  498. nautobot/project-static/docs/development/react-ui.html +3 -3
  499. nautobot/project-static/docs/index.html +2 -47
  500. nautobot/project-static/docs/release-notes/index.html +1 -43
  501. nautobot/project-static/docs/release-notes/version-1.0.html +1 -43
  502. nautobot/project-static/docs/release-notes/version-1.1.html +1 -43
  503. nautobot/project-static/docs/release-notes/version-1.2.html +1 -43
  504. nautobot/project-static/docs/release-notes/version-1.3.html +1 -43
  505. nautobot/project-static/docs/release-notes/version-1.4.html +1 -43
  506. nautobot/project-static/docs/release-notes/version-1.5.html +1 -43
  507. nautobot/project-static/docs/release-notes/version-1.6.html +1 -43
  508. nautobot/project-static/docs/release-notes/version-2.0.html +1 -43
  509. nautobot/project-static/docs/release-notes/version-2.1.html +189 -77
  510. nautobot/project-static/docs/search/search_index.json +1 -1
  511. nautobot/project-static/docs/sitemap.xml +236 -251
  512. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  513. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +1 -43
  514. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
  515. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +1 -43
  516. nautobot/project-static/docs/user-guide/administration/configuration/index.html +1 -43
  517. nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +13 -5389
  518. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1 -65
  519. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +1 -43
  520. nautobot/project-static/docs/user-guide/administration/guides/caching.html +1 -43
  521. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +1 -43
  522. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +1 -43
  523. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +1 -43
  524. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +1 -43
  525. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +1 -43
  526. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +1 -43
  527. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -43
  528. nautobot/project-static/docs/user-guide/administration/installation/docker.html +1 -43
  529. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +1 -43
  530. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +1 -43
  531. nautobot/project-static/docs/user-guide/administration/installation/index.html +1 -64
  532. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +2 -57
  533. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +5 -94
  534. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +1 -43
  535. nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -43
  536. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +1 -43
  537. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +1 -43
  538. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +76 -137
  539. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -43
  540. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +1 -43
  541. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +1 -43
  542. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +1 -43
  543. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +1 -43
  544. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +1 -43
  545. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +1 -43
  546. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +1 -43
  547. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -43
  548. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +1 -43
  549. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +1 -43
  550. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +1 -43
  551. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +1 -43
  552. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +1 -43
  553. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +1 -43
  554. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +1 -43
  555. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +1 -43
  556. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +1 -43
  557. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +1 -43
  558. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +1 -43
  559. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +1 -43
  560. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +1 -43
  561. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +1 -43
  562. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +2 -44
  563. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +1 -43
  564. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +1 -43
  565. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +1 -43
  566. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -43
  567. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +1 -43
  568. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +1 -43
  569. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +1 -43
  570. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +1 -43
  571. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -43
  572. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +1 -43
  573. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +1 -43
  574. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +1 -43
  575. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +1 -43
  576. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +1 -43
  577. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +1 -43
  578. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +1 -43
  579. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +1 -43
  580. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +1 -43
  581. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +1 -43
  582. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +1 -43
  583. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +1 -43
  584. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +1 -43
  585. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +1 -43
  586. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +1 -43
  587. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +1 -43
  588. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +1 -43
  589. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +1 -43
  590. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +1 -43
  591. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +1 -43
  592. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +1 -43
  593. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +1 -43
  594. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +1 -43
  595. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +1 -43
  596. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +1 -43
  597. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +1 -43
  598. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +1 -43
  599. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +1 -43
  600. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +1 -43
  601. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +1 -43
  602. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +1 -43
  603. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +1 -43
  604. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +1 -43
  605. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +1 -43
  606. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -43
  607. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +1 -43
  608. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +1 -43
  609. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +1 -43
  610. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -43
  611. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +1 -43
  612. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -43
  613. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +1 -43
  614. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -43
  615. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +23 -79
  616. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +1 -43
  617. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +1 -43
  618. nautobot/project-static/docs/user-guide/index.html +1 -43
  619. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +1 -43
  620. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +1 -43
  621. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +1 -43
  622. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +1 -43
  623. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -43
  624. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +1 -43
  625. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +1 -43
  626. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +1 -43
  627. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +1 -43
  628. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +1 -43
  629. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +1 -43
  630. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +1 -43
  631. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +1 -43
  632. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +1 -43
  633. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +1 -43
  634. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +1 -43
  635. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +1 -43
  636. nautobot/project-static/docs/user-guide/platform-functionality/note.html +1 -43
  637. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -43
  638. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +1 -43
  639. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +1 -43
  640. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +1 -43
  641. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +1 -43
  642. nautobot/project-static/docs/user-guide/platform-functionality/role.html +1 -43
  643. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +1 -43
  644. nautobot/project-static/docs/user-guide/platform-functionality/status.html +1 -43
  645. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +1 -43
  646. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -43
  647. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +5 -43
  648. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +1 -43
  649. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +1 -43
  650. nautobot/project-static/js/theme.js +0 -5
  651. nautobot/tenancy/api/urls.py +1 -1
  652. nautobot/tenancy/api/views.py +1 -0
  653. nautobot/tenancy/factory.py +2 -2
  654. nautobot/tenancy/filters/__init__.py +1 -2
  655. nautobot/tenancy/forms.py +2 -2
  656. nautobot/tenancy/homepage.py +0 -1
  657. nautobot/tenancy/migrations/0001_initial.py +2 -1
  658. nautobot/tenancy/migrations/0002_auto_slug.py +1 -0
  659. nautobot/tenancy/migrations/0004_change_tree_manager_on_tree_models.py +1 -0
  660. nautobot/tenancy/migrations/0008_tagsfield.py +1 -0
  661. nautobot/tenancy/models.py +0 -1
  662. nautobot/tenancy/navigation.py +0 -1
  663. nautobot/tenancy/tables.py +1 -0
  664. nautobot/tenancy/tests/test_filters.py +5 -5
  665. nautobot/tenancy/urls.py +1 -0
  666. nautobot/tenancy/views.py +2 -2
  667. nautobot/users/admin.py +1 -2
  668. nautobot/users/api/urls.py +1 -1
  669. nautobot/users/api/views.py +6 -4
  670. nautobot/users/factory.py +1 -3
  671. nautobot/users/filters.py +4 -4
  672. nautobot/users/forms.py +1 -0
  673. nautobot/users/migrations/0004_alter_user_managers.py +1 -0
  674. nautobot/users/migrations/0008_make_object_permission_a_changelogged_model.py +22 -0
  675. nautobot/users/models.py +2 -2
  676. nautobot/users/tests/test_api.py +7 -6
  677. nautobot/users/tests/test_filters.py +0 -1
  678. nautobot/users/tests/test_models.py +0 -1
  679. nautobot/users/tests/test_password_ui.py +1 -1
  680. nautobot/users/views.py +2 -2
  681. nautobot/virtualization/api/urls.py +1 -1
  682. nautobot/virtualization/api/views.py +2 -1
  683. nautobot/virtualization/apps.py +1 -1
  684. nautobot/virtualization/choices.py +0 -1
  685. nautobot/virtualization/factory.py +1 -1
  686. nautobot/virtualization/filters.py +1 -1
  687. nautobot/virtualization/forms.py +6 -6
  688. nautobot/virtualization/homepage.py +0 -1
  689. nautobot/virtualization/migrations/0003_vminterface_verbose_name.py +1 -0
  690. nautobot/virtualization/migrations/0004_auto_slug.py +1 -0
  691. nautobot/virtualization/migrations/0005_add_natural_indexing.py +1 -0
  692. nautobot/virtualization/migrations/0006_vminterface_status.py +1 -0
  693. nautobot/virtualization/migrations/0007_vminterface_status_data_migration.py +1 -0
  694. nautobot/virtualization/migrations/0011_alter_vminterface_mac_address.py +1 -0
  695. nautobot/virtualization/migrations/0012_alter_virtualmachine_role_add_new_role.py +1 -0
  696. nautobot/virtualization/migrations/0013_migrate_virtualmachine_role_data.py +1 -0
  697. nautobot/virtualization/migrations/0018_related_name_changes.py +1 -0
  698. nautobot/virtualization/migrations/0021_tagsfield_and_vminterface_to_primarymodel.py +1 -0
  699. nautobot/virtualization/migrations/0025_status_nonnullable.py +1 -0
  700. nautobot/virtualization/models.py +1 -2
  701. nautobot/virtualization/navigation.py +0 -1
  702. nautobot/virtualization/signals.py +0 -1
  703. nautobot/virtualization/tables.py +1 -0
  704. nautobot/virtualization/tests/test_filters.py +3 -3
  705. nautobot/virtualization/tests/test_models.py +1 -1
  706. nautobot/virtualization/tests/test_views.py +2 -2
  707. nautobot/virtualization/urls.py +1 -0
  708. nautobot/virtualization/views.py +1 -1
  709. {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/METADATA +1 -1
  710. {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/RECORD +713 -814
  711. nautobot/core/management/commands/build_ui.py +0 -281
  712. nautobot/core/templates/base_react.html +0 -55
  713. nautobot/core/tests/test_cli.py +0 -25
  714. nautobot/ui/.eslintignore +0 -3
  715. nautobot/ui/.gitignore +0 -7
  716. nautobot/ui/.prettierignore +0 -6
  717. nautobot/ui/.prettierrc +0 -4
  718. nautobot/ui/README.md +0 -27
  719. nautobot/ui/config/env.js +0 -102
  720. nautobot/ui/config/getHttpsConfig.js +0 -68
  721. nautobot/ui/config/jest/babelTransform.js +0 -14
  722. nautobot/ui/config/jest/cssTransform.js +0 -12
  723. nautobot/ui/config/jest/fileTransform.js +0 -38
  724. nautobot/ui/config/modules.js +0 -151
  725. nautobot/ui/config/paths.js +0 -67
  726. nautobot/ui/config/webpack/persistentCache/createEnvironmentHash.js +0 -8
  727. nautobot/ui/config/webpack.config.js +0 -674
  728. nautobot/ui/config/webpackDevServer.config.js +0 -127
  729. nautobot/ui/jest.config.js +0 -35
  730. nautobot/ui/jsconfig.json +0 -4
  731. nautobot/ui/package-lock.json +0 -22947
  732. nautobot/ui/package.json +0 -119
  733. nautobot/ui/public/index.html +0 -47
  734. nautobot/ui/public/logo192.png +0 -0
  735. nautobot/ui/public/logo512.png +0 -0
  736. nautobot/ui/public/manifest.json +0 -25
  737. nautobot/ui/public/nautobot_logo.svg +0 -131
  738. nautobot/ui/public/robots.txt +0 -3
  739. nautobot/ui/scripts/build.js +0 -224
  740. nautobot/ui/scripts/start.js +0 -140
  741. nautobot/ui/scripts/test.js +0 -40
  742. nautobot/ui/src/App.js +0 -79
  743. nautobot/ui/src/components/AppFullWidthComponents.js +0 -8
  744. nautobot/ui/src/components/AppTab.js +0 -40
  745. nautobot/ui/src/components/Apps.js +0 -60
  746. nautobot/ui/src/components/FeedbackModal.js +0 -123
  747. nautobot/ui/src/components/FiltersPanel.js +0 -693
  748. nautobot/ui/src/components/HomeChangelogPanel.js +0 -98
  749. nautobot/ui/src/components/HomePanel.js +0 -58
  750. nautobot/ui/src/components/JobHistoryTable.js +0 -78
  751. nautobot/ui/src/components/Layout.js +0 -76
  752. nautobot/ui/src/components/LoadingWidget.js +0 -14
  753. nautobot/ui/src/components/Navbar.js +0 -204
  754. nautobot/ui/src/components/NotificationPopover.js +0 -27
  755. nautobot/ui/src/components/ObjectTable/ObjectListTable.js +0 -300
  756. nautobot/ui/src/components/ObjectTable/ObjectTable.js +0 -96
  757. nautobot/ui/src/components/ObjectTable/ObjectTableItem.js +0 -70
  758. nautobot/ui/src/components/ObjectTable/index.js +0 -3
  759. nautobot/ui/src/components/Pagination/PageNumberForm.js +0 -228
  760. nautobot/ui/src/components/Pagination/PageSizeForm.js +0 -65
  761. nautobot/ui/src/components/Pagination/Pagination.js +0 -67
  762. nautobot/ui/src/components/Pagination/index.js +0 -3
  763. nautobot/ui/src/components/ReferenceDataTag.js +0 -35
  764. nautobot/ui/src/components/Retrieve/RenderChangeLogsTab.js +0 -58
  765. nautobot/ui/src/components/Retrieve/RenderColumn.js +0 -30
  766. nautobot/ui/src/components/Retrieve/RenderGroup.js +0 -24
  767. nautobot/ui/src/components/Retrieve/RenderHeader.js +0 -125
  768. nautobot/ui/src/components/Retrieve/RenderNotesTab.js +0 -60
  769. nautobot/ui/src/components/Retrieve/RenderTable.js +0 -33
  770. nautobot/ui/src/components/Retrieve/RenderTabs.js +0 -56
  771. nautobot/ui/src/components/Retrieve/index.js +0 -7
  772. nautobot/ui/src/components/RouterButton.js +0 -10
  773. nautobot/ui/src/components/RouterLink.js +0 -10
  774. nautobot/ui/src/components/SidebarNav.js +0 -156
  775. nautobot/ui/src/components/__tests__/AppFullWidthComponents.test.js +0 -16
  776. nautobot/ui/src/components/__tests__/AppTab.test.js +0 -21
  777. nautobot/ui/src/components/__tests__/Apps.test.js +0 -14
  778. nautobot/ui/src/components/__tests__/Layout.test.js +0 -33
  779. nautobot/ui/src/components/__tests__/PageSizeForm.test.js +0 -13
  780. nautobot/ui/src/components/__tests__/Pagination.test.js +0 -43
  781. nautobot/ui/src/components/__tests__/Table.test.js +0 -39
  782. nautobot/ui/src/components/__tests__/TableItem.test.js +0 -39
  783. nautobot/ui/src/components/index.js +0 -4
  784. nautobot/ui/src/constants/apiPath.js +0 -13
  785. nautobot/ui/src/constants/icons.js +0 -15
  786. nautobot/ui/src/constants/size.js +0 -15
  787. nautobot/ui/src/file_templates/app_imports.js.j2 +0 -7
  788. nautobot/ui/src/file_templates/jsconfig-base.json +0 -12
  789. nautobot/ui/src/index.js +0 -65
  790. nautobot/ui/src/reportWebVitals.js +0 -15
  791. nautobot/ui/src/router.js +0 -77
  792. nautobot/ui/src/utils/api.js +0 -160
  793. nautobot/ui/src/utils/app-import.js +0 -15
  794. nautobot/ui/src/utils/color.js +0 -15
  795. nautobot/ui/src/utils/date.js +0 -14
  796. nautobot/ui/src/utils/index.js +0 -15
  797. nautobot/ui/src/utils/navigation.js +0 -48
  798. nautobot/ui/src/utils/session.js +0 -64
  799. nautobot/ui/src/utils/store.js +0 -242
  800. nautobot/ui/src/utils/string.js +0 -6
  801. nautobot/ui/src/utils/url.js +0 -4
  802. nautobot/ui/src/views/Home.js +0 -142
  803. nautobot/ui/src/views/InstalledApps.js +0 -80
  804. nautobot/ui/src/views/Login.js +0 -48
  805. nautobot/ui/src/views/Logout.js +0 -20
  806. nautobot/ui/src/views/__tests__/BSCreateViewTemplate.test.js +0 -11
  807. nautobot/ui/src/views/__tests__/BSListViewTemplate.test.js +0 -107
  808. nautobot/ui/src/views/__tests__/Login.test.js +0 -15
  809. nautobot/ui/src/views/generic/GenericView.js +0 -191
  810. nautobot/ui/src/views/generic/ObjectCreate.js +0 -96
  811. nautobot/ui/src/views/generic/ObjectList.js +0 -137
  812. nautobot/ui/src/views/generic/ObjectRetrieve.js +0 -87
  813. {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/LICENSE.txt +0 -0
  814. {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/WHEEL +0 -0
  815. {nautobot-2.1.0.dist-info → nautobot-2.1.1.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,7 @@
1
- from django.test import TestCase
2
1
  from unittest.mock import patch
3
2
 
3
+ from django.test import TestCase
4
+
4
5
  from nautobot.core.apps import NAV_CONTEXT_NAMES, NavContext, NavGrouping, NavItem, register_new_ui_menu_items
5
6
 
6
7
 
@@ -1,6 +1,5 @@
1
1
  from drf_spectacular.renderers import OpenApiYamlRenderer
2
2
  from drf_spectacular.settings import spectacular_settings
3
-
4
3
  import yaml
5
4
 
6
5
  from nautobot.core.testing import TestCase
@@ -3,13 +3,13 @@
3
3
  from constance.test import override_config
4
4
  from django.conf import settings
5
5
  from django.contrib.auth import get_user_model
6
- from django.test import RequestFactory, override_settings
6
+ from django.test import override_settings, RequestFactory
7
7
  from django.urls import reverse
8
8
 
9
9
  from nautobot.circuits import models as circuits_models
10
- from nautobot.dcim import models as dcim_models
11
10
  from nautobot.core import testing
12
11
  from nautobot.core.views import paginator
12
+ from nautobot.dcim import models as dcim_models
13
13
  from nautobot.extras import models as extras_models
14
14
 
15
15
 
@@ -2,11 +2,11 @@ from io import BytesIO
2
2
  from logging import ERROR
3
3
  from unittest.mock import Mock, patch
4
4
 
5
- import requests
6
5
  from django.conf import settings
7
6
  from django.core.cache import cache
8
- from django.test import SimpleTestCase, override_settings
7
+ from django.test import override_settings, SimpleTestCase
9
8
  from packaging import version
9
+ import requests
10
10
  from requests import Response
11
11
 
12
12
  from nautobot.core.tasks import get_releases
@@ -1,6 +1,6 @@
1
1
  from django.test import TestCase
2
2
 
3
- from nautobot.dcim.tables import ManufacturerTable, DeviceTypeTable, LocationTable, LocationTypeTable, RackGroupTable
3
+ from nautobot.dcim.tables import DeviceTypeTable, LocationTable, LocationTypeTable, ManufacturerTable, RackGroupTable
4
4
 
5
5
 
6
6
  class TableTestCase(TestCase):
@@ -3,13 +3,14 @@ from unittest import skipIf
3
3
  from constance.test import override_config
4
4
  from django.conf import settings
5
5
  from django.templatetags.static import static
6
- from django.test import TestCase, override_settings
7
- from example_plugin.models import AnotherExampleModel, ExampleModel
6
+ from django.test import override_settings, TestCase
8
7
 
9
8
  from nautobot.core.templatetags import helpers
10
9
  from nautobot.dcim import models
11
10
  from nautobot.ipam.models import VLAN
12
11
 
12
+ from example_plugin.models import AnotherExampleModel, ExampleModel
13
+
13
14
 
14
15
  @skipIf(
15
16
  "example_plugin" not in settings.PLUGINS,
@@ -3,7 +3,6 @@ import inspect
3
3
  from django.template import Context, Engine
4
4
  from django.template.exceptions import TemplateSyntaxError
5
5
  from django.test import TestCase
6
-
7
6
  from netutils.utils import jinja2_convenience_function
8
7
 
9
8
 
@@ -47,6 +46,6 @@ class NautobotTemplateTagsNetutilsTest(TestCase):
47
46
  except ConnectionError:
48
47
  # Yes, some netutils functions such as tcp_ping actually make network calls when invoked. Eeek.
49
48
  pass
50
- except Exception:
49
+ except Exception: # noqa: S110 # try-except-pass -- an antipattern in general, but OK here
51
50
  # Catch-all - at least it wasn't a TemplateSyntaxError, so good enough for now.
52
51
  pass
@@ -8,24 +8,20 @@ from django.db.models import Q
8
8
  from django.http import QueryDict
9
9
  from django.test import TestCase
10
10
 
11
- from example_plugin.models import ExampleModel
12
-
13
11
  from nautobot.circuits import models as circuits_models
14
12
  from nautobot.core import exceptions, forms, settings_funcs
15
13
  from nautobot.core.api import utils as api_utils
16
14
  from nautobot.core.models import fields as core_fields, utils as models_utils
17
15
  from nautobot.core.utils import data as data_utils, filtering, lookup, requests
18
16
  from nautobot.core.utils.migrations import update_object_change_ct_for_replaced_models
19
- from nautobot.dcim import filters as dcim_filters
20
- from nautobot.dcim import forms as dcim_forms
21
- from nautobot.dcim import models as dcim_models
22
- from nautobot.dcim import tables
23
- from nautobot.extras import models as extras_models
24
- from nautobot.extras import utils as extras_utils
17
+ from nautobot.dcim import filters as dcim_filters, forms as dcim_forms, models as dcim_models, tables
18
+ from nautobot.extras import models as extras_models, utils as extras_utils
25
19
  from nautobot.extras.choices import ObjectChangeActionChoices, RelationshipTypeChoices
26
20
  from nautobot.extras.models import ObjectChange
27
21
  from nautobot.extras.registry import registry
28
22
 
23
+ from example_plugin.models import ExampleModel
24
+
29
25
 
30
26
  class DictToFilterParamsTest(TestCase):
31
27
  """
@@ -4,7 +4,7 @@ import urllib.parse
4
4
 
5
5
  from django.contrib.contenttypes.models import ContentType
6
6
  from django.core.files.uploadedfile import SimpleUploadedFile
7
- from django.test import RequestFactory, override_settings
7
+ from django.test import override_settings, RequestFactory
8
8
  from django.test.utils import override_script_prefix
9
9
  from django.urls import get_script_prefix, reverse
10
10
  from prometheus_client.parser import text_string_to_metric_families
@@ -41,7 +41,10 @@ class GetReturnURLMixinTestCase(TestCase):
41
41
  self.assertEqual(self.mixin.get_return_url(request=request, obj=None), reverse("home"))
42
42
 
43
43
  def test_get_return_url_explicit_punycode(self):
44
- request = self.factory.get("/", {"return_url": "/dcım/devices/"})
44
+ """
45
+ Replace the 'i' in '/dcim/' with a unicode dotless 'ı' and make sure we're not fooled by it.
46
+ """ # noqa: RUF002 # ambiguous-unicode-character-docstring -- fully intentional here!
47
+ request = self.factory.get("/", {"return_url": "/dcım/devices/"}) # noqa: RUF001 # ambiguous-unicode-character-string -- fully intentional here!
45
48
  self.assertEqual(self.mixin.get_return_url(request=request, obj=None), "/dc%C4%B1m/devices/")
46
49
 
47
50
  def test_get_return_url_default_with_obj(self):
@@ -3,7 +3,6 @@ from django.test import TestCase
3
3
 
4
4
  from nautobot.core.models.querysets import count_related
5
5
  from nautobot.core.views.utils import check_filter_for_display
6
-
7
6
  from nautobot.dcim.filters import DeviceFilterSet
8
7
  from nautobot.dcim.models import Device, DeviceRedundancyGroup, DeviceType, InventoryItem, Location, Manufacturer
9
8
  from nautobot.extras.models import Role, Status
nautobot/core/urls.py CHANGED
@@ -6,20 +6,20 @@ from django.views.static import serve
6
6
 
7
7
  from nautobot.core.views import (
8
8
  CustomGraphQLView,
9
+ get_file_with_authorization,
9
10
  HomeView,
10
- StaticMediaFailureView,
11
+ nautobot_metrics_view,
11
12
  SearchView,
13
+ StaticMediaFailureView,
12
14
  ThemePreviewView,
13
- nautobot_metrics_view,
14
- get_file_with_authorization,
15
15
  )
16
16
  from nautobot.extras.plugins.urls import (
17
17
  plugin_admin_patterns,
18
18
  plugin_patterns,
19
19
  )
20
20
  from nautobot.users.views import LoginView, LogoutView
21
- from .admin import admin_site
22
21
 
22
+ from .admin import admin_site
23
23
 
24
24
  urlpatterns = [
25
25
  # Base views
@@ -5,7 +5,7 @@ def hex_to_rgb(hex_str):
5
5
  """
6
6
  Map a hex string like "00ff00" to individual r, g, b integer values.
7
7
  """
8
- return [int(hex_str[c : c + 2], 16) for c in (0, 2, 4)] # noqa: E203
8
+ return [int(hex_str[c : c + 2], 16) for c in (0, 2, 4)]
9
9
 
10
10
 
11
11
  def rgb_to_hex(r, g, b):
@@ -1,4 +1,4 @@
1
- from collections import OrderedDict, namedtuple
1
+ from collections import namedtuple, OrderedDict
2
2
  from decimal import Decimal
3
3
  import uuid
4
4
 
@@ -7,7 +7,6 @@ from django.template import engines
7
7
 
8
8
  from nautobot.dcim import choices # TODO move dcim.choices.CableLengthUnitChoices into core
9
9
 
10
-
11
10
  # Setup UtilizationData named tuple for use by multiple methods
12
11
  UtilizationData = namedtuple("UtilizationData", ["numerator", "denominator"])
13
12
 
@@ -13,7 +13,6 @@ from django_filters.utils import verbose_lookup_expr
13
13
  from nautobot.core import exceptions
14
14
  from nautobot.core.utils.lookup import get_filterset_for_model
15
15
 
16
-
17
16
  # Check if field name contains a lookup expr
18
17
  # e.g `name__ic` has lookup expr `ic (icontains)` while `name` has no lookup expr
19
18
  CONTAINS_LOOKUP_EXPR_RE = re.compile(r"(?<=__)\w+")
@@ -88,10 +87,6 @@ def get_filterset_parameter_form_field(model, parameter, filterset=None):
88
87
  Return the relevant form field instance for a filterset parameter e.g DynamicModelMultipleChoiceField, forms.IntegerField e.t.c
89
88
  """
90
89
  # Avoid circular import
91
- from nautobot.dcim.models import Device
92
- from nautobot.extras.filters import ContentTypeMultipleChoiceFilter, CustomFieldFilterMixin, StatusFilter
93
- from nautobot.extras.models import ConfigContext, Role, Status, Tag
94
- from nautobot.extras.utils import ChangeLoggedModelsQuery, RoleModelsQuery, TaggableClassesQuery
95
90
  from nautobot.core.filters import MultiValueDecimalFilter, MultiValueFloatFilter
96
91
  from nautobot.core.forms import (
97
92
  BOOLEAN_CHOICES,
@@ -100,6 +95,10 @@ def get_filterset_parameter_form_field(model, parameter, filterset=None):
100
95
  StaticSelect2,
101
96
  StaticSelect2Multiple,
102
97
  )
98
+ from nautobot.dcim.models import Device
99
+ from nautobot.extras.filters import ContentTypeMultipleChoiceFilter, CustomFieldFilterMixin, StatusFilter
100
+ from nautobot.extras.models import ConfigContext, Role, Status, Tag
101
+ from nautobot.extras.utils import ChangeLoggedModelsQuery, RoleModelsQuery, TaggableClassesQuery
103
102
  from nautobot.virtualization.models import VirtualMachine
104
103
 
105
104
  if filterset is None or filterset.Meta.model != model:
@@ -5,6 +5,7 @@ import logging
5
5
  import os
6
6
 
7
7
  from git import Repo
8
+
8
9
  from nautobot.core.utils.logging import sanitize
9
10
 
10
11
  logger = logging.getLogger(__name__)
@@ -121,7 +122,7 @@ class GitRepo:
121
122
  branch_head.set_tracking_branch(self.repo.remotes.origin.refs[branch])
122
123
  except IndexError as git_error:
123
124
  logger.error(
124
- "Branch %s does not exist at %s. %s", branch, list(self.repo.remotes.origin.urls)[0], git_error
125
+ "Branch %s does not exist at %s. %s", branch, next(iter(self.repo.remotes.origin.urls)), git_error
125
126
  )
126
127
  raise BranchDoesNotExist(
127
128
  f"Please create branch '{branch}' in upstream and try again."
@@ -146,7 +147,7 @@ class GitRepo:
146
147
  self.repo.remotes.origin.refs[branch]
147
148
  except IndexError as git_error:
148
149
  logger.error(
149
- "Branch %s does not exist at %s. %s", branch, list(self.repo.remotes.origin.urls)[0], git_error
150
+ "Branch %s does not exist at %s. %s", branch, next(iter(self.repo.remotes.origin.urls)), git_error
150
151
  )
151
152
  raise BranchDoesNotExist(
152
153
  f"Please create branch '{branch}' in upstream and try again."
@@ -17,7 +17,8 @@ def sanitize(string, replacement="(redacted)"):
17
17
  Uses settings.SANITIZER_PATTERNS as the list of (regexp, repl) tuples to apply.
18
18
  """
19
19
  # Don't allow regex match groups to be referenced in the replacement string!
20
- assert not re.search(r"\\\d|\\g<\d+>", replacement)
20
+ if re.search(r"\\\d|\\g<\d+>", replacement):
21
+ raise RuntimeError("Invalid replacement string! Must not contain regex match group references.")
21
22
 
22
23
  for sanitizer, repl in settings.SANITIZER_PATTERNS:
23
24
  try:
@@ -1,4 +1,5 @@
1
1
  import sys
2
+
2
3
  from django.db import models
3
4
 
4
5
 
@@ -58,12 +58,10 @@ def permission_is_exempt(name):
58
58
  if action == "view":
59
59
  if (
60
60
  # All models (excluding those in EXEMPT_EXCLUDE_MODELS) are exempt from view permission enforcement
61
- "*" in settings.EXEMPT_VIEW_PERMISSIONS
62
- and (app_label, model_name) not in settings.EXEMPT_EXCLUDE_MODELS
61
+ "*" in settings.EXEMPT_VIEW_PERMISSIONS and (app_label, model_name) not in settings.EXEMPT_EXCLUDE_MODELS
63
62
  ) or (
64
63
  # This specific model is exempt from view permission enforcement
65
- f"{app_label}.{model_name}"
66
- in settings.EXEMPT_VIEW_PERMISSIONS
64
+ f"{app_label}.{model_name}" in settings.EXEMPT_VIEW_PERMISSIONS
67
65
  ):
68
66
  return True
69
67
 
@@ -5,22 +5,22 @@ import time
5
5
 
6
6
  from db_file_storage.views import get_file
7
7
  from django.apps import apps
8
- import prometheus_client
9
8
  from django.conf import settings
10
9
  from django.contrib.auth.decorators import permission_required
11
10
  from django.contrib.auth.mixins import AccessMixin, LoginRequiredMixin
12
11
  from django.contrib.contenttypes.models import ContentType
13
- from django.http import HttpResponseServerError, JsonResponse, HttpResponseForbidden, HttpResponse
12
+ from django.http import HttpResponse, HttpResponseForbidden, HttpResponseServerError, JsonResponse
14
13
  from django.shortcuts import get_object_or_404, redirect, render
15
14
  from django.template import loader, RequestContext, Template
16
15
  from django.template.exceptions import TemplateDoesNotExist
17
16
  from django.urls import resolve, reverse
17
+ from django.views.csrf import csrf_failure as _csrf_failure
18
18
  from django.views.decorators.csrf import requires_csrf_token
19
19
  from django.views.defaults import ERROR_500_TEMPLATE_NAME, page_not_found
20
- from django.views.csrf import csrf_failure as _csrf_failure
21
20
  from django.views.generic import TemplateView, View
22
- from packaging import version
23
21
  from graphene_django.views import GraphQLView
22
+ from packaging import version
23
+ import prometheus_client
24
24
  from prometheus_client import multiprocess
25
25
  from prometheus_client.metrics_core import GaugeMetricFamily
26
26
  from prometheus_client.registry import Collector
@@ -30,9 +30,9 @@ from nautobot.core.forms import SearchForm
30
30
  from nautobot.core.releases import get_latest_release
31
31
  from nautobot.core.utils.lookup import get_route_for_model
32
32
  from nautobot.core.utils.permissions import get_permission_for_model
33
+ from nautobot.extras.forms import GraphQLQueryForm
33
34
  from nautobot.extras.models import FileProxy, GraphQLQuery, Status
34
35
  from nautobot.extras.registry import registry
35
- from nautobot.extras.forms import GraphQLQueryForm
36
36
 
37
37
 
38
38
  class HomeView(AccessMixin, TemplateView):
@@ -11,7 +11,7 @@ from django.core.exceptions import (
11
11
  ObjectDoesNotExist,
12
12
  ValidationError,
13
13
  )
14
- from django.db import transaction, IntegrityError
14
+ from django.db import IntegrityError, transaction
15
15
  from django.db.models import ManyToManyField, ProtectedError
16
16
  from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput
17
17
  from django.http import HttpResponse, JsonResponse
@@ -25,7 +25,6 @@ from rest_framework.exceptions import ParseError
25
25
 
26
26
  from nautobot.core.api.parsers import NautobotCSVParser
27
27
  from nautobot.core.api.utils import get_serializer_for_model
28
- from nautobot.core.forms import SearchForm
29
28
  from nautobot.core.exceptions import AbortTransaction
30
29
  from nautobot.core.forms import (
31
30
  BootstrapMixin,
@@ -34,8 +33,9 @@ from nautobot.core.forms import (
34
33
  CSVDataField,
35
34
  CSVFileField,
36
35
  ImportForm,
37
- TableConfigForm,
38
36
  restrict_form_fields,
37
+ SearchForm,
38
+ TableConfigForm,
39
39
  )
40
40
  from nautobot.core.forms.forms import DynamicFilterFormSet
41
41
  from nautobot.core.templatetags.helpers import bettertitle, validated_viewname
@@ -47,8 +47,8 @@ from nautobot.core.utils.requests import (
47
47
  get_filterable_params_from_filter_params,
48
48
  normalize_querydict,
49
49
  )
50
- from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
51
50
  from nautobot.core.views.mixins import GetReturnURLMixin, ObjectPermissionRequiredMixin
51
+ from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
52
52
  from nautobot.core.views.utils import (
53
53
  check_filter_for_display,
54
54
  get_csv_form_fields_from_serializer_class,
@@ -2,8 +2,8 @@ from io import BytesIO
2
2
  import logging
3
3
 
4
4
  from django.contrib import messages
5
- from django.contrib.contenttypes.models import ContentType
6
5
  from django.contrib.auth.mixins import AccessMixin
6
+ from django.contrib.contenttypes.models import ContentType
7
7
  from django.core.exceptions import (
8
8
  FieldDoesNotExist,
9
9
  ImproperlyConfigured,
@@ -19,18 +19,16 @@ from django.template.loader import select_template, TemplateDoesNotExist
19
19
  from django.urls import reverse
20
20
  from django.urls.exceptions import NoReverseMatch
21
21
  from django.utils.encoding import iri_to_uri
22
- from django.utils.http import url_has_allowed_host_and_scheme
23
22
  from django.utils.html import format_html
23
+ from django.utils.http import url_has_allowed_host_and_scheme
24
24
  from django.views.generic.edit import FormView
25
-
26
- from rest_framework import mixins, exceptions
25
+ from drf_spectacular.utils import extend_schema
26
+ from rest_framework import exceptions, mixins
27
27
  from rest_framework.decorators import action as drf_action
28
28
  from rest_framework.parsers import FormParser, MultiPartParser
29
29
  from rest_framework.response import Response
30
30
  from rest_framework.viewsets import GenericViewSet
31
31
 
32
- from drf_spectacular.utils import extend_schema
33
-
34
32
  from nautobot.core.api.parsers import NautobotCSVParser
35
33
  from nautobot.core.api.views import BulkDestroyModelMixin, BulkUpdateModelMixin
36
34
  from nautobot.core.forms import (
@@ -41,16 +39,16 @@ from nautobot.core.forms import (
41
39
  restrict_form_fields,
42
40
  )
43
41
  from nautobot.core.utils import lookup, permissions
44
- from nautobot.core.views.renderers import NautobotHTMLRenderer
45
42
  from nautobot.core.utils.requests import get_filterable_params_from_filter_params
43
+ from nautobot.core.views.renderers import NautobotHTMLRenderer
46
44
  from nautobot.core.views.utils import (
47
45
  get_csv_form_fields_from_serializer_class,
48
46
  handle_protectederror,
49
47
  prepare_cloned_fields,
50
48
  )
51
- from nautobot.extras.models import ExportTemplate
52
49
  from nautobot.extras.forms import NoteForm
53
- from nautobot.extras.tables import ObjectChangeTable, NoteTable
50
+ from nautobot.extras.models import ExportTemplate
51
+ from nautobot.extras.tables import NoteTable, ObjectChangeTable
54
52
  from nautobot.extras.utils import remove_prefix_from_cf_key
55
53
 
56
54
  PERMISSIONS_ACTION_MAP = {
@@ -305,9 +303,10 @@ class NautobotViewSetMixin(GenericViewSet, AccessMixin, GetReturnURLMixin, FormV
305
303
  elif self.action == "changelog":
306
304
  return ObjectChangeTable
307
305
 
308
- assert (
309
- self.table_class is not None
310
- ), f"'{self.__class__.__name__}' should include a `table_class` attribute for bulk operations"
306
+ if self.table_class is None:
307
+ raise NotImplementedError(
308
+ f"'{self.__class__.__name__}' should include a `table_class` attribute for bulk operations"
309
+ )
311
310
 
312
311
  return self.table_class
313
312
 
@@ -7,9 +7,9 @@ from django_tables2 import RequestConfig
7
7
  from rest_framework import renderers
8
8
 
9
9
  from nautobot.core.forms import (
10
+ restrict_form_fields,
10
11
  SearchForm,
11
12
  TableConfigForm,
12
- restrict_form_fields,
13
13
  )
14
14
  from nautobot.core.forms.forms import DynamicFilterFormSet
15
15
  from nautobot.core.templatetags.helpers import bettertitle, validated_viewname
@@ -5,7 +5,6 @@ from django.core.exceptions import FieldError
5
5
  from django.db.models import ForeignKey
6
6
  from django.utils.html import format_html, format_html_join
7
7
  from django.utils.safestring import mark_safe
8
-
9
8
  from rest_framework import serializers
10
9
 
11
10
  from nautobot.core.api.fields import ChoiceField, ContentTypeField, TimeZoneSerializerField
@@ -97,6 +96,8 @@ def get_csv_form_fields_from_serializer_class(serializer_class):
97
96
  """From the given serializer class, build a list of field dicts suitable for rendering in the CSV import form."""
98
97
  serializer = serializer_class(context={"request": None, "depth": 0})
99
98
  fields = []
99
+ # Note lots of "noqa: S308" in this function. That's `suspicious-mark-safe-usage`, but in all of the below cases
100
+ # we control the input string and it's known to be safe, so mark_safe() is being used correctly here.
100
101
  for field_name, field in serializer.fields.items():
101
102
  if field.read_only:
102
103
  continue
nautobot/dcim/api/urls.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from nautobot.core.api.routers import OrderedDefaultRouter
2
- from . import views
3
2
 
3
+ from . import views
4
4
 
5
5
  router = OrderedDefaultRouter()
6
6
  router.APIRootView = views.DCIMRootView
@@ -1,10 +1,10 @@
1
- import socket
2
1
  from collections import OrderedDict
2
+ import socket
3
3
 
4
4
  from django.conf import settings
5
5
  from django.core.exceptions import ObjectDoesNotExist
6
6
  from django.db.models import F
7
- from django.http import HttpResponseForbidden, HttpResponse
7
+ from django.http import HttpResponse, HttpResponseForbidden
8
8
  from django.shortcuts import get_object_or_404
9
9
  from django.views.decorators.clickjacking import xframe_options_sameorigin
10
10
  from drf_spectacular.types import OpenApiTypes
@@ -39,10 +39,10 @@ from nautobot.dcim.models import (
39
39
  InterfaceRedundancyGroup,
40
40
  InterfaceRedundancyGroupAssociation,
41
41
  InterfaceTemplate,
42
+ InventoryItem,
42
43
  Location,
43
44
  LocationType,
44
45
  Manufacturer,
45
- InventoryItem,
46
46
  Platform,
47
47
  PowerFeed,
48
48
  PowerOutlet,
@@ -65,6 +65,7 @@ from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupS
65
65
  from nautobot.extras.secrets.exceptions import SecretError
66
66
  from nautobot.ipam.models import Prefix, VLAN
67
67
  from nautobot.virtualization.models import VirtualMachine
68
+
68
69
  from . import serializers
69
70
  from .exceptions import MissingFilterException
70
71
 
@@ -468,9 +469,9 @@ class DeviceViewSet(ConfigContextQuerySetMixin, NautobotModelViewSet):
468
469
  # Get NAPALM enable-secret from the device if present
469
470
  if device.secrets_group:
470
471
  # Work around inconsistent enable password arg in NAPALM drivers
471
- enable_password_arg = "secret"
472
+ enable_password_arg = "secret" # noqa: S105 # hardcoded-password-string -- false positive
472
473
  if device.platform.napalm_driver.lower() == "eos":
473
- enable_password_arg = "enable_password"
474
+ enable_password_arg = "enable_password" # noqa: S105 # hardcoded-password-string -- false positive
474
475
  try:
475
476
  optional_args[enable_password_arg] = device.secrets_group.get_secret_value(
476
477
  SecretsGroupAccessTypeChoices.TYPE_GENERIC,
nautobot/dcim/apps.py CHANGED
@@ -17,4 +17,4 @@ class DCIMConfig(NautobotConfig):
17
17
 
18
18
  def ready(self):
19
19
  super().ready()
20
- import nautobot.dcim.signals # noqa: F401
20
+ import nautobot.dcim.signals # noqa: F401 # unused-import -- but this import installs the signals
nautobot/dcim/choices.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from nautobot.core.choices import ChoiceSet
2
2
 
3
-
4
3
  #
5
4
  # Locations
6
5
  #
@@ -2,7 +2,6 @@ from django.db.models import Q
2
2
 
3
3
  from .choices import InterfaceTypeChoices
4
4
 
5
-
6
5
  #
7
6
  # Racks
8
7
  #
@@ -1,8 +1,7 @@
1
- import svgwrite
2
-
3
1
  from django.conf import settings
4
2
  from django.urls import reverse
5
3
  from django.utils.http import urlencode
4
+ import svgwrite
6
5
 
7
6
  from .choices import DeviceFaceChoices
8
7
  from .constants import RACK_ELEVATION_BORDER_WIDTH
nautobot/dcim/factory.py CHANGED
@@ -1,22 +1,20 @@
1
- import factory
2
1
  import logging
3
- import pytz
4
- import random
5
-
6
- from faker import Faker
7
2
 
8
3
  from django.contrib.auth import get_user_model
9
4
  from django.contrib.contenttypes.models import ContentType
10
5
  from django.db.models import Q
6
+ import factory
7
+ from faker import Faker
8
+ import pytz
11
9
 
10
+ from nautobot.circuits.models import CircuitTermination
12
11
  from nautobot.core.factory import (
13
12
  NautobotBoolIterator,
14
13
  OrganizationalModelFactory,
15
14
  PrimaryModelFactory,
16
- UniqueFaker,
17
15
  random_instance,
16
+ UniqueFaker,
18
17
  )
19
- from nautobot.circuits.models import CircuitTermination
20
18
  from nautobot.dcim.choices import (
21
19
  DeviceRedundancyGroupFailoverStrategyChoices,
22
20
  RackDimensionUnitChoices,
@@ -28,14 +26,14 @@ from nautobot.dcim.models import (
28
26
  Device,
29
27
  DeviceRedundancyGroup,
30
28
  DeviceType,
31
- Manufacturer,
32
- Platform,
33
29
  Location,
34
30
  LocationType,
31
+ Manufacturer,
32
+ Platform,
33
+ PowerPanel,
35
34
  Rack,
36
35
  RackGroup,
37
36
  RackReservation,
38
- PowerPanel,
39
37
  )
40
38
  from nautobot.extras.models import Role, Status
41
39
  from nautobot.extras.utils import FeatureQuery
@@ -43,7 +41,6 @@ from nautobot.ipam.models import Prefix, VLAN, VLANGroup
43
41
  from nautobot.tenancy.models import Tenant
44
42
  from nautobot.virtualization.models import Cluster
45
43
 
46
-
47
44
  logger = logging.getLogger(__name__)
48
45
 
49
46
  User = get_user_model()
@@ -298,7 +295,7 @@ class PlatformFactory(OrganizationalModelFactory):
298
295
  # If it has a manufacturer, it *might* have a napalm_driver.
299
296
  napalm_driver = factory.Maybe(
300
297
  "has_manufacturer",
301
- factory.LazyAttribute(lambda o: random.choice(NAPALM_DRIVERS.get(o.manufacturer.name, [""]))),
298
+ factory.LazyAttribute(lambda o: factory.random.randgen.choice(NAPALM_DRIVERS.get(o.manufacturer.name, [""]))),
302
299
  "",
303
300
  )
304
301
 
@@ -310,7 +307,7 @@ class PlatformFactory(OrganizationalModelFactory):
310
307
  has_description = NautobotBoolIterator()
311
308
  network_driver = factory.Maybe(
312
309
  "has_manufacturer",
313
- factory.LazyAttribute(lambda o: random.choice(NETWORK_DRIVERS.get(o.manufacturer.name, [""]))),
310
+ factory.LazyAttribute(lambda o: factory.random.randgen.choice(NETWORK_DRIVERS.get(o.manufacturer.name, [""]))),
314
311
  "",
315
312
  )
316
313
 
nautobot/dcim/fields.py CHANGED
@@ -3,6 +3,7 @@ from django.db import models
3
3
 
4
4
  from nautobot.core.models.fields import JSONArrayField
5
5
  from nautobot.ipam.constants import BGP_ASN_MAX, BGP_ASN_MIN
6
+
6
7
  from .lookups import PathContains
7
8
 
8
9