nautobot 2.2.9__py3-none-any.whl → 2.3.0__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.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (697) hide show
  1. nautobot/apps/forms.py +4 -0
  2. nautobot/apps/models.py +10 -1
  3. nautobot/circuits/__init__.py +0 -1
  4. nautobot/circuits/apps.py +1 -0
  5. nautobot/circuits/factory.py +15 -3
  6. nautobot/circuits/filters.py +13 -0
  7. nautobot/circuits/forms.py +13 -0
  8. nautobot/circuits/migrations/0021_alter_circuit_status_alter_circuittermination__path.py +32 -0
  9. nautobot/circuits/migrations/0022_circuittermination_cloud_network.py +25 -0
  10. nautobot/circuits/models.py +16 -3
  11. nautobot/circuits/tables.py +16 -2
  12. nautobot/circuits/templates/circuits/circuittermination_create.html +10 -2
  13. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +6 -0
  14. nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -1
  15. nautobot/circuits/tests/test_api.py +7 -5
  16. nautobot/circuits/tests/test_filters.py +12 -5
  17. nautobot/circuits/tests/test_models.py +33 -2
  18. nautobot/circuits/views.py +2 -3
  19. nautobot/cloud/__init__.py +0 -0
  20. nautobot/cloud/api/__init__.py +0 -0
  21. nautobot/cloud/api/serializers.py +54 -0
  22. nautobot/cloud/api/urls.py +16 -0
  23. nautobot/cloud/api/views.py +48 -0
  24. nautobot/cloud/apps.py +13 -0
  25. nautobot/cloud/factory.py +113 -0
  26. nautobot/cloud/filters.py +187 -0
  27. nautobot/cloud/forms.py +339 -0
  28. nautobot/cloud/homepage.py +43 -0
  29. nautobot/cloud/migrations/0001_initial.py +304 -0
  30. nautobot/cloud/migrations/__init__.py +0 -0
  31. nautobot/cloud/models.py +246 -0
  32. nautobot/cloud/navigation.py +85 -0
  33. nautobot/cloud/tables.py +157 -0
  34. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
  35. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +122 -0
  36. nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
  37. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +111 -0
  38. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +69 -0
  39. nautobot/cloud/templates/cloud/cloudservice_update.html +25 -0
  40. nautobot/cloud/tests/__init__.py +0 -0
  41. nautobot/cloud/tests/test_api.py +248 -0
  42. nautobot/cloud/tests/test_filters.py +125 -0
  43. nautobot/cloud/tests/test_models.py +43 -0
  44. nautobot/cloud/tests/test_views.py +153 -0
  45. nautobot/cloud/urls.py +14 -0
  46. nautobot/cloud/views.py +181 -0
  47. nautobot/core/__init__.py +0 -3
  48. nautobot/core/api/metadata.py +1 -0
  49. nautobot/core/api/parsers.py +7 -1
  50. nautobot/core/api/urls.py +1 -0
  51. nautobot/core/api/utils.py +1 -0
  52. nautobot/core/api/views.py +4 -0
  53. nautobot/core/apps/__init__.py +6 -3
  54. nautobot/core/constants.py +8 -0
  55. nautobot/core/factory.py +32 -1
  56. nautobot/core/filters.py +95 -13
  57. nautobot/core/forms/fields.py +10 -4
  58. nautobot/core/forms/forms.py +11 -3
  59. nautobot/core/forms/widgets.py +18 -1
  60. nautobot/core/graphql/schema.py +26 -4
  61. nautobot/core/jobs/__init__.py +16 -2
  62. nautobot/core/jobs/cleanup.py +100 -0
  63. nautobot/core/jobs/groups.py +38 -0
  64. nautobot/core/management/commands/generate_test_data.py +116 -3
  65. nautobot/core/models/__init__.py +34 -9
  66. nautobot/core/models/generics.py +19 -3
  67. nautobot/core/models/name_color_content_types.py +7 -28
  68. nautobot/core/models/querysets.py +4 -3
  69. nautobot/core/models/tree_queries.py +1 -1
  70. nautobot/core/models/utils.py +21 -5
  71. nautobot/core/settings.py +2 -17
  72. nautobot/core/settings.yaml +34 -13
  73. nautobot/core/settings_funcs.py +103 -0
  74. nautobot/core/tables.py +130 -56
  75. nautobot/core/templates/admin/search_form.html +1 -1
  76. nautobot/core/templates/buttons/add.html +11 -3
  77. nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +13 -0
  78. nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +13 -0
  79. nautobot/core/templates/buttons/export.html +101 -53
  80. nautobot/core/templates/buttons/job_import.html +11 -3
  81. nautobot/core/templates/generic/object_bulk_destroy.html +3 -1
  82. nautobot/core/templates/generic/object_bulk_update.html +3 -1
  83. nautobot/core/templates/generic/object_changelog.html +0 -9
  84. nautobot/core/templates/generic/object_list.html +156 -17
  85. nautobot/core/templates/generic/object_retrieve.html +80 -16
  86. nautobot/core/templates/inc/extras_features_edit_form_fields.html +8 -0
  87. nautobot/core/templates/inc/javascript.html +2 -0
  88. nautobot/core/templates/inc/media.html +2 -2
  89. nautobot/core/templates/inc/nav_menu.html +1 -0
  90. nautobot/core/templates/inc/paginator.html +7 -7
  91. nautobot/core/templates/inc/search_panel.html +2 -2
  92. nautobot/core/templates/inc/table.html +2 -2
  93. nautobot/core/templates/nautobot_config.py.j2 +13 -8
  94. nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +37 -0
  95. nautobot/core/templates/utilities/templatetags/filter_form_modal.html +2 -2
  96. nautobot/core/templates/utilities/templatetags/saved_view_modal.html +38 -0
  97. nautobot/core/templates/utilities/theme_preview.html +25 -8
  98. nautobot/core/templates/utilities/worker_status.html +152 -0
  99. nautobot/core/templatetags/buttons.py +335 -38
  100. nautobot/core/templatetags/form_helpers.py +1 -1
  101. nautobot/core/templatetags/helpers.py +181 -11
  102. nautobot/core/testing/api.py +5 -4
  103. nautobot/core/testing/filters.py +63 -14
  104. nautobot/core/testing/mixins.py +46 -0
  105. nautobot/core/testing/models.py +22 -0
  106. nautobot/core/testing/schema.py +4 -8
  107. nautobot/core/testing/views.py +31 -14
  108. nautobot/core/tests/integration/test_import_objects_ui.py +1 -0
  109. nautobot/core/tests/integration/test_swagger.py +1 -1
  110. nautobot/core/tests/nautobot_config.py +0 -1
  111. nautobot/core/tests/runner.py +2 -2
  112. nautobot/core/tests/test_api.py +1 -0
  113. nautobot/core/tests/test_authentication.py +7 -2
  114. nautobot/core/tests/test_filters.py +11 -9
  115. nautobot/core/tests/test_forms.py +9 -0
  116. nautobot/core/tests/test_graphql.py +27 -16
  117. nautobot/core/tests/test_jobs.py +122 -0
  118. nautobot/core/tests/test_tables.py +3 -1
  119. nautobot/core/tests/test_templatetags_helpers.py +12 -5
  120. nautobot/core/tests/test_utils.py +31 -20
  121. nautobot/core/tests/test_views.py +6 -6
  122. nautobot/core/urls.py +8 -3
  123. nautobot/core/utils/deprecation.py +29 -0
  124. nautobot/core/utils/filtering.py +12 -9
  125. nautobot/core/utils/lookup.py +37 -2
  126. nautobot/core/utils/requests.py +4 -1
  127. nautobot/core/views/__init__.py +137 -24
  128. nautobot/core/views/generic.py +119 -67
  129. nautobot/core/views/mixins.py +105 -36
  130. nautobot/core/views/paginator.py +9 -3
  131. nautobot/core/views/renderers.py +121 -56
  132. nautobot/core/views/utils.py +81 -1
  133. nautobot/dcim/__init__.py +0 -1
  134. nautobot/dcim/api/serializers.py +180 -44
  135. nautobot/dcim/api/urls.py +7 -3
  136. nautobot/dcim/api/views.py +53 -7
  137. nautobot/dcim/apps.py +3 -0
  138. nautobot/dcim/choices.py +25 -0
  139. nautobot/dcim/constants.py +7 -0
  140. nautobot/dcim/factory.py +252 -18
  141. nautobot/dcim/filters/__init__.py +373 -193
  142. nautobot/dcim/filters/mixins.py +274 -1
  143. nautobot/dcim/forms.py +834 -121
  144. nautobot/dcim/graphql/types.py +2 -2
  145. nautobot/dcim/homepage.py +1 -1
  146. nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
  147. nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
  148. nautobot/dcim/migrations/0061_module_models.py +862 -0
  149. nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
  150. nautobot/dcim/models/__init__.py +8 -0
  151. nautobot/dcim/models/cables.py +15 -0
  152. nautobot/dcim/models/device_component_templates.py +207 -53
  153. nautobot/dcim/models/device_components.py +275 -99
  154. nautobot/dcim/models/devices.py +468 -13
  155. nautobot/dcim/models/racks.py +0 -1
  156. nautobot/dcim/navigation.py +47 -0
  157. nautobot/dcim/signals.py +3 -3
  158. nautobot/dcim/tables/__init__.py +35 -23
  159. nautobot/dcim/tables/devices.py +229 -43
  160. nautobot/dcim/tables/devicetypes.py +65 -9
  161. nautobot/dcim/tables/racks.py +5 -1
  162. nautobot/dcim/tables/template_code.py +46 -26
  163. nautobot/dcim/templates/dcim/cable_connect.html +76 -3
  164. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
  165. nautobot/dcim/templates/dcim/device/base.html +14 -6
  166. nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
  167. nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
  168. nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
  169. nautobot/dcim/templates/dcim/device/frontports.html +2 -3
  170. nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
  171. nautobot/dcim/templates/dcim/device/inventory.html +2 -3
  172. nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
  173. nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
  174. nautobot/dcim/templates/dcim/device/powerports.html +2 -3
  175. nautobot/dcim/templates/dcim/device/rearports.html +2 -3
  176. nautobot/dcim/templates/dcim/device.html +45 -1
  177. nautobot/dcim/templates/dcim/device_component.html +13 -5
  178. nautobot/dcim/templates/dcim/device_list.html +2 -1
  179. nautobot/dcim/templates/dcim/devicetype.html +99 -98
  180. nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
  181. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
  182. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
  183. nautobot/dcim/templates/dcim/interface.html +17 -2
  184. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
  185. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  186. nautobot/dcim/templates/dcim/manufacturer.html +24 -0
  187. nautobot/dcim/templates/dcim/module/base.html +97 -0
  188. nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
  189. nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
  190. nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
  191. nautobot/dcim/templates/dcim/module_destroy.html +5 -0
  192. nautobot/dcim/templates/dcim/module_frontports.html +53 -0
  193. nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
  194. nautobot/dcim/templates/dcim/module_list.html +20 -0
  195. nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
  196. nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
  197. nautobot/dcim/templates/dcim/module_powerports.html +53 -0
  198. nautobot/dcim/templates/dcim/module_rearports.html +53 -0
  199. nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
  200. nautobot/dcim/templates/dcim/module_update.html +71 -0
  201. nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
  202. nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
  203. nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
  204. nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
  205. nautobot/dcim/templates/dcim/moduletype_retrieve.html +159 -0
  206. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
  207. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
  208. nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
  209. nautobot/dcim/tests/test_api.py +693 -208
  210. nautobot/dcim/tests/test_filters.py +843 -217
  211. nautobot/dcim/tests/test_models.py +1072 -8
  212. nautobot/dcim/tests/test_views.py +1510 -341
  213. nautobot/dcim/urls.py +17 -2
  214. nautobot/dcim/utils.py +2 -3
  215. nautobot/dcim/views.py +1106 -116
  216. nautobot/extras/__init__.py +0 -1
  217. nautobot/extras/api/serializers.py +115 -3
  218. nautobot/extras/api/urls.py +12 -0
  219. nautobot/extras/api/views.py +66 -0
  220. nautobot/extras/apps.py +2 -2
  221. nautobot/extras/choices.py +43 -0
  222. nautobot/extras/context_managers.py +13 -8
  223. nautobot/extras/datasources/git.py +2 -0
  224. nautobot/extras/factory.py +460 -9
  225. nautobot/extras/filters/__init__.py +174 -3
  226. nautobot/extras/filters/mixins.py +46 -43
  227. nautobot/extras/forms/base.py +24 -5
  228. nautobot/extras/forms/forms.py +227 -8
  229. nautobot/extras/forms/mixins.py +93 -0
  230. nautobot/extras/graphql/types.py +23 -10
  231. nautobot/extras/homepage.py +14 -1
  232. nautobot/extras/management/__init__.py +1 -0
  233. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
  234. nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
  235. nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
  236. nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
  237. nautobot/extras/migrations/0111_metadata.py +162 -0
  238. nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
  239. nautobot/extras/migrations/0113_saved_views.py +77 -0
  240. nautobot/extras/models/__init__.py +15 -1
  241. nautobot/extras/models/change_logging.py +3 -3
  242. nautobot/extras/models/contacts.py +4 -0
  243. nautobot/extras/models/customfields.py +18 -3
  244. nautobot/extras/models/groups.py +389 -225
  245. nautobot/extras/models/jobs.py +6 -3
  246. nautobot/extras/models/metadata.py +441 -0
  247. nautobot/extras/models/mixins.py +72 -62
  248. nautobot/extras/models/models.py +118 -9
  249. nautobot/extras/models/relationships.py +9 -2
  250. nautobot/extras/models/tags.py +13 -2
  251. nautobot/extras/navigation.py +57 -0
  252. nautobot/extras/plugins/__init__.py +3 -1
  253. nautobot/extras/querysets.py +30 -66
  254. nautobot/extras/signals.py +95 -100
  255. nautobot/extras/tables.py +165 -12
  256. nautobot/extras/templates/extras/dynamicgroup.html +44 -15
  257. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
  258. nautobot/extras/templates/extras/job.html +1 -1
  259. nautobot/extras/templates/extras/jobresult.html +61 -74
  260. nautobot/extras/templates/extras/metadatatype_create.html +89 -0
  261. nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
  262. nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
  263. nautobot/extras/templates/extras/objectchange_list.html +0 -12
  264. nautobot/extras/templates/extras/plugins_list.html +1 -3
  265. nautobot/extras/templates/extras/role_retrieve.html +48 -0
  266. nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
  267. nautobot/extras/tests/integration/test_customfields.py +1 -0
  268. nautobot/extras/tests/test_api.py +509 -23
  269. nautobot/extras/tests/test_changelog.py +20 -9
  270. nautobot/extras/tests/test_context_managers.py +22 -15
  271. nautobot/extras/tests/test_datasources.py +13 -1
  272. nautobot/extras/tests/test_dynamicgroups.py +201 -171
  273. nautobot/extras/tests/test_filters.py +211 -12
  274. nautobot/extras/tests/test_jobs.py +6 -6
  275. nautobot/extras/tests/test_models.py +501 -4
  276. nautobot/extras/tests/test_relationships.py +1 -0
  277. nautobot/extras/tests/test_views.py +565 -8
  278. nautobot/extras/tests/test_webhooks.py +1 -1
  279. nautobot/extras/urls.py +5 -0
  280. nautobot/extras/utils.py +51 -11
  281. nautobot/extras/views.py +542 -76
  282. nautobot/ipam/__init__.py +0 -1
  283. nautobot/ipam/apps.py +1 -0
  284. nautobot/ipam/factory.py +17 -19
  285. nautobot/ipam/filters.py +13 -0
  286. nautobot/ipam/forms.py +8 -4
  287. nautobot/ipam/graphql/types.py +2 -2
  288. nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
  289. nautobot/ipam/models.py +11 -8
  290. nautobot/ipam/querysets.py +1 -1
  291. nautobot/ipam/signals.py +4 -2
  292. nautobot/ipam/tables.py +5 -0
  293. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
  294. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
  295. nautobot/ipam/templates/ipam/prefix.html +1 -0
  296. nautobot/ipam/tests/test_api.py +37 -18
  297. nautobot/ipam/tests/test_filters.py +26 -2
  298. nautobot/ipam/tests/test_models.py +6 -0
  299. nautobot/ipam/tests/test_querysets.py +1 -1
  300. nautobot/ipam/tests/test_views.py +3 -2
  301. nautobot/ipam/urls.py +2 -2
  302. nautobot/ipam/views.py +18 -26
  303. nautobot/project-static/css/base.css +20 -0
  304. nautobot/project-static/css/dark.css +11 -0
  305. nautobot/project-static/docs/404.html +892 -88
  306. nautobot/project-static/docs/apps/index.html +892 -88
  307. nautobot/project-static/docs/apps/nautobot-apps.html +892 -88
  308. nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
  309. nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css +1 -0
  310. nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css.map +1 -0
  311. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +919 -120
  312. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +904 -101
  313. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1618 -903
  314. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +935 -144
  315. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +977 -188
  316. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +901 -99
  317. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +897 -93
  318. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +991 -193
  319. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +974 -131
  320. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1078 -272
  321. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1242 -334
  322. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1727 -875
  323. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1164 -381
  324. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2088 -1374
  325. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2246 -1422
  326. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +912 -111
  327. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +963 -163
  328. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1010 -223
  329. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1913 -1277
  330. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1846 -1102
  331. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +904 -101
  332. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2331 -1699
  333. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1802 -1024
  334. nautobot/project-static/docs/development/apps/api/configuration-view.html +892 -88
  335. nautobot/project-static/docs/development/apps/api/database-backend-config.html +892 -88
  336. nautobot/project-static/docs/development/apps/api/models/django-admin.html +892 -88
  337. nautobot/project-static/docs/development/apps/api/models/global-search.html +892 -88
  338. nautobot/project-static/docs/development/apps/api/models/graphql.html +892 -88
  339. nautobot/project-static/docs/development/apps/api/models/index.html +942 -90
  340. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +892 -88
  341. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +892 -88
  342. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +892 -88
  343. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +892 -88
  344. nautobot/project-static/docs/development/apps/api/platform-features/index.html +892 -88
  345. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +892 -88
  346. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +892 -88
  347. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +892 -88
  348. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +892 -88
  349. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +892 -88
  350. nautobot/project-static/docs/development/apps/api/prometheus.html +892 -88
  351. nautobot/project-static/docs/development/apps/api/setup.html +892 -88
  352. nautobot/project-static/docs/development/apps/api/testing.html +892 -88
  353. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +892 -88
  354. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +892 -88
  355. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +892 -88
  356. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +892 -88
  357. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +892 -88
  358. nautobot/project-static/docs/development/apps/api/views/base-template.html +892 -88
  359. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +892 -88
  360. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +892 -88
  361. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +892 -88
  362. nautobot/project-static/docs/development/apps/api/views/index.html +892 -88
  363. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +892 -88
  364. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +892 -88
  365. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +892 -88
  366. nautobot/project-static/docs/development/apps/api/views/notes.html +892 -88
  367. nautobot/project-static/docs/development/apps/api/views/rest-api.html +892 -88
  368. nautobot/project-static/docs/development/apps/api/views/urls.html +892 -88
  369. nautobot/project-static/docs/development/apps/index.html +892 -88
  370. nautobot/project-static/docs/development/apps/migration/code-updates.html +892 -88
  371. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +892 -88
  372. nautobot/project-static/docs/development/apps/migration/from-v1.html +892 -88
  373. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +892 -88
  374. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +892 -88
  375. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +892 -88
  376. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +892 -88
  377. nautobot/project-static/docs/development/apps/porting-from-netbox.html +892 -88
  378. nautobot/project-static/docs/development/core/application-registry.html +892 -88
  379. nautobot/project-static/docs/development/core/best-practices.html +893 -88
  380. nautobot/project-static/docs/development/core/bootstrap-ui.html +892 -88
  381. nautobot/project-static/docs/development/core/caching.html +892 -88
  382. nautobot/project-static/docs/development/core/controllers.html +892 -88
  383. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +892 -88
  384. nautobot/project-static/docs/development/core/generic-views.html +892 -88
  385. nautobot/project-static/docs/development/core/getting-started.html +892 -88
  386. nautobot/project-static/docs/development/core/homepage.html +892 -88
  387. nautobot/project-static/docs/development/core/index.html +892 -88
  388. nautobot/project-static/docs/development/core/model-checklist.html +901 -89
  389. nautobot/project-static/docs/development/core/model-features.html +892 -88
  390. nautobot/project-static/docs/development/core/natural-keys.html +892 -88
  391. nautobot/project-static/docs/development/core/navigation-menu.html +892 -88
  392. nautobot/project-static/docs/development/core/release-checklist.html +895 -91
  393. nautobot/project-static/docs/development/core/role-internals.html +892 -88
  394. nautobot/project-static/docs/development/core/settings.html +892 -88
  395. nautobot/project-static/docs/development/core/style-guide.html +893 -89
  396. nautobot/project-static/docs/development/core/templates.html +904 -89
  397. nautobot/project-static/docs/development/core/testing.html +892 -88
  398. nautobot/project-static/docs/development/core/user-preferences.html +892 -88
  399. nautobot/project-static/docs/development/index.html +892 -88
  400. nautobot/project-static/docs/development/jobs/index.html +893 -89
  401. nautobot/project-static/docs/development/jobs/migration/from-v1.html +892 -88
  402. nautobot/project-static/docs/index.html +892 -88
  403. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
  404. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
  405. nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
  406. nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
  407. nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
  408. nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
  409. nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
  410. nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
  411. nautobot/project-static/docs/models/dcim/module.html +15 -0
  412. nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
  413. nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
  414. nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
  415. nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
  416. nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
  417. nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
  418. nautobot/project-static/docs/models/extras/role.html +15 -0
  419. nautobot/project-static/docs/models/extras/savedview.html +15 -0
  420. nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
  421. nautobot/project-static/docs/models/extras/status.html +15 -0
  422. nautobot/project-static/docs/objects.inv +0 -0
  423. nautobot/project-static/docs/overview/application_stack.html +900 -89
  424. nautobot/project-static/docs/overview/design_philosophy.html +892 -88
  425. nautobot/project-static/docs/release-notes/index.html +1129 -92
  426. nautobot/project-static/docs/release-notes/version-1.0.html +892 -88
  427. nautobot/project-static/docs/release-notes/version-1.1.html +892 -88
  428. nautobot/project-static/docs/release-notes/version-1.2.html +892 -88
  429. nautobot/project-static/docs/release-notes/version-1.3.html +892 -88
  430. nautobot/project-static/docs/release-notes/version-1.4.html +892 -88
  431. nautobot/project-static/docs/release-notes/version-1.5.html +893 -89
  432. nautobot/project-static/docs/release-notes/version-1.6.html +893 -89
  433. nautobot/project-static/docs/release-notes/version-2.0.html +892 -88
  434. nautobot/project-static/docs/release-notes/version-2.1.html +892 -88
  435. nautobot/project-static/docs/release-notes/version-2.2.html +895 -91
  436. nautobot/project-static/docs/release-notes/version-2.3.html +9954 -0
  437. nautobot/project-static/docs/requirements.txt +5 -5
  438. nautobot/project-static/docs/search/search_index.json +1 -1
  439. nautobot/project-static/docs/sitemap.xml +331 -256
  440. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  441. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +892 -88
  442. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +892 -88
  443. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +892 -88
  444. nautobot/project-static/docs/user-guide/administration/configuration/index.html +892 -88
  445. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +992 -174
  446. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +892 -88
  447. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +892 -88
  448. nautobot/project-static/docs/user-guide/administration/guides/caching.html +892 -88
  449. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +896 -88
  450. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +892 -88
  451. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +892 -88
  452. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +892 -88
  453. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +892 -88
  454. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +892 -88
  455. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +892 -88
  456. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +892 -88
  457. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +892 -88
  458. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +944 -153
  459. nautobot/project-static/docs/user-guide/administration/installation/index.html +901 -93
  460. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +934 -122
  461. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +954 -157
  462. nautobot/project-static/docs/user-guide/administration/installation/services.html +913 -112
  463. nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +908 -99
  464. nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +892 -88
  465. nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +892 -88
  466. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +892 -88
  467. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +892 -88
  468. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +893 -89
  469. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +892 -88
  470. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +892 -88
  471. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +892 -88
  472. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +892 -88
  473. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +892 -88
  474. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +892 -88
  475. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +892 -88
  476. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +892 -88
  477. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +892 -88
  478. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +892 -88
  479. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +892 -88
  480. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +893 -89
  481. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +892 -88
  482. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +896 -88
  483. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +895 -91
  484. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
  485. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
  486. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
  487. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
  488. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
  489. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
  490. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
  491. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +906 -102
  492. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +923 -105
  493. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +923 -105
  494. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +918 -100
  495. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +923 -105
  496. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +906 -102
  497. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +906 -102
  498. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +913 -105
  499. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +920 -116
  500. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +921 -117
  501. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +918 -114
  502. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +906 -102
  503. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +914 -105
  504. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +926 -108
  505. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +936 -118
  506. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +928 -106
  507. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +906 -102
  508. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +937 -119
  509. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +928 -110
  510. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +918 -114
  511. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +921 -117
  512. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +923 -115
  513. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
  514. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
  515. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
  516. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
  517. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +916 -112
  518. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +906 -102
  519. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +940 -83
  520. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +924 -106
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +906 -102
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +943 -86
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +921 -103
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +929 -125
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +918 -114
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +906 -102
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +922 -104
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +924 -106
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +906 -102
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +906 -102
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +906 -102
  532. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +936 -88
  533. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +892 -88
  534. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +897 -89
  535. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +897 -89
  536. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +892 -88
  537. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +892 -88
  538. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +892 -88
  539. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +892 -88
  540. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +892 -88
  541. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +892 -88
  542. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +892 -88
  543. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +892 -88
  544. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +892 -88
  545. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +892 -88
  546. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +901 -96
  547. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +892 -88
  548. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +892 -88
  549. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +892 -88
  550. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +892 -88
  551. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +892 -88
  552. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +897 -89
  553. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +892 -88
  554. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +892 -88
  555. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +892 -88
  556. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +892 -88
  557. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +892 -88
  558. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +892 -88
  559. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +892 -88
  560. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +892 -88
  561. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +892 -88
  562. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +892 -88
  563. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +892 -88
  564. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +892 -88
  565. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +892 -88
  566. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
  567. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
  568. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
  569. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
  570. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
  571. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
  572. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
  587. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
  589. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
  590. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
  591. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +892 -88
  592. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +892 -88
  593. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +892 -88
  594. nautobot/project-static/docs/user-guide/index.html +892 -88
  595. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +892 -88
  596. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +892 -88
  597. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +892 -88
  598. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +892 -88
  599. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1258 -785
  600. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +895 -91
  601. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +892 -88
  602. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +892 -88
  603. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +892 -88
  604. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +892 -88
  605. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +892 -88
  606. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +892 -88
  607. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +892 -88
  608. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +892 -88
  609. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +892 -88
  610. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +896 -88
  611. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +892 -88
  612. nautobot/project-static/docs/user-guide/platform-functionality/note.html +895 -91
  613. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +9061 -0
  614. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +895 -91
  615. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +892 -88
  616. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +892 -88
  617. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +892 -88
  618. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +892 -88
  619. nautobot/project-static/docs/user-guide/platform-functionality/role.html +895 -91
  620. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
  621. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +895 -91
  622. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
  623. nautobot/project-static/docs/user-guide/platform-functionality/status.html +892 -88
  624. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +892 -88
  625. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +950 -121
  626. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +892 -88
  627. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +892 -88
  628. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +892 -88
  629. nautobot/project-static/js/forms.js +71 -0
  630. nautobot/project-static/js/table_sorting_indicator.js +46 -0
  631. nautobot/project-static/js/tableconfig.js +6 -1
  632. nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
  633. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
  634. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
  635. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
  636. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
  637. nautobot/tenancy/__init__.py +0 -1
  638. nautobot/tenancy/apps.py +1 -0
  639. nautobot/tenancy/factory.py +3 -2
  640. nautobot/tenancy/filters/__init__.py +1 -0
  641. nautobot/tenancy/forms.py +1 -1
  642. nautobot/tenancy/templates/tenancy/tenant.html +24 -20
  643. nautobot/tenancy/views.py +11 -10
  644. nautobot/users/__init__.py +0 -1
  645. nautobot/users/api/serializers.py +1 -1
  646. nautobot/users/api/views.py +4 -2
  647. nautobot/users/apps.py +3 -2
  648. nautobot/users/factory.py +3 -3
  649. nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
  650. nautobot/users/models.py +12 -0
  651. nautobot/users/tests/test_filters.py +6 -3
  652. nautobot/users/urls.py +8 -0
  653. nautobot/virtualization/__init__.py +0 -1
  654. nautobot/virtualization/apps.py +1 -0
  655. nautobot/virtualization/filters.py +6 -1
  656. nautobot/virtualization/forms.py +11 -3
  657. nautobot/virtualization/graphql/types.py +2 -2
  658. nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
  659. nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
  660. nautobot/virtualization/models.py +0 -2
  661. nautobot/virtualization/tables.py +10 -3
  662. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
  663. nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
  664. nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
  665. nautobot/virtualization/tests/test_api.py +9 -4
  666. nautobot/virtualization/tests/test_filters.py +22 -0
  667. nautobot/virtualization/tests/test_models.py +7 -3
  668. nautobot/virtualization/tests/test_views.py +19 -3
  669. nautobot/virtualization/urls.py +2 -2
  670. nautobot/virtualization/views.py +10 -32
  671. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/METADATA +20 -18
  672. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/RECORD +677 -557
  673. nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css +0 -1
  674. nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css.map +0 -1
  675. nautobot/project-static/materialdesignicons-6.5.95/.github/ISSUE_TEMPLATE.md +0 -3
  676. nautobot/project-static/materialdesignicons-6.5.95/README.md +0 -25
  677. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css +0 -26654
  678. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css.map +0 -16
  679. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css +0 -3
  680. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css.map +0 -16
  681. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff +0 -0
  682. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff2 +0 -0
  683. nautobot/project-static/materialdesignicons-6.5.95/package.json +0 -28
  684. nautobot/project-static/materialdesignicons-6.5.95/preview.html +0 -717
  685. nautobot/project-static/materialdesignicons-6.5.95/scss/_animated.scss +0 -27
  686. nautobot/project-static/materialdesignicons-6.5.95/scss/_core.scss +0 -10
  687. nautobot/project-static/materialdesignicons-6.5.95/scss/_extras.scss +0 -65
  688. nautobot/project-static/materialdesignicons-6.5.95/scss/_functions.scss +0 -20
  689. nautobot/project-static/materialdesignicons-6.5.95/scss/_icons.scss +0 -10
  690. nautobot/project-static/materialdesignicons-6.5.95/scss/_path.scss +0 -10
  691. nautobot/project-static/materialdesignicons-6.5.95/scss/_variables.scss +0 -6606
  692. nautobot/project-static/materialdesignicons-6.5.95/scss/materialdesignicons.scss +0 -8
  693. /nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/LICENSE +0 -0
  694. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/LICENSE.txt +0 -0
  695. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/NOTICE +0 -0
  696. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/WHEEL +0 -0
  697. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/entry_points.txt +0 -0
@@ -40,7 +40,9 @@ VMINTERFACE_BUTTONS = """
40
40
  class ClusterTypeTable(BaseTable):
41
41
  pk = ToggleColumn()
42
42
  name = tables.LinkColumn()
43
- cluster_count = tables.Column(verbose_name="Clusters")
43
+ cluster_count = LinkedCountColumn(
44
+ viewname="virtualization:cluster_list", url_params={"cluster_type": "pk"}, verbose_name="Clusters"
45
+ )
44
46
  actions = ButtonsColumn(ClusterType)
45
47
 
46
48
  class Meta(BaseTable.Meta):
@@ -57,7 +59,9 @@ class ClusterTypeTable(BaseTable):
57
59
  class ClusterGroupTable(BaseTable):
58
60
  pk = ToggleColumn()
59
61
  name = tables.LinkColumn()
60
- cluster_count = tables.Column(verbose_name="Clusters")
62
+ cluster_count = LinkedCountColumn(
63
+ viewname="virtualization:cluster_list", url_params={"cluster_group": "pk"}, verbose_name="Clusters"
64
+ )
61
65
  actions = ButtonsColumn(ClusterGroup)
62
66
 
63
67
  class Meta(BaseTable.Meta):
@@ -194,6 +198,7 @@ class VMInterfaceTable(StatusTableMixin, BaseInterfaceTable):
194
198
  "virtual_machine",
195
199
  "name",
196
200
  "status",
201
+ "role",
197
202
  "enabled",
198
203
  "mac_address",
199
204
  "mtu",
@@ -204,7 +209,7 @@ class VMInterfaceTable(StatusTableMixin, BaseInterfaceTable):
204
209
  "untagged_vlan",
205
210
  "tagged_vlans",
206
211
  )
207
- default_columns = ("pk", "virtual_machine", "name", "status", "enabled", "description")
212
+ default_columns = ("pk", "virtual_machine", "name", "status", "role", "enabled", "description")
208
213
 
209
214
 
210
215
  class VirtualMachineVMInterfaceTable(VMInterfaceTable):
@@ -222,6 +227,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable):
222
227
  "pk",
223
228
  "name",
224
229
  "status",
230
+ "role",
225
231
  "enabled",
226
232
  "parent_interface",
227
233
  "bridge",
@@ -239,6 +245,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable):
239
245
  "pk",
240
246
  "name",
241
247
  "status",
248
+ "role",
242
249
  "enabled",
243
250
  "parent_interface",
244
251
  "mac_address",
@@ -215,7 +215,7 @@
215
215
  <strong>Interfaces</strong>
216
216
  <div class="pull-right noprint">
217
217
  {% if request.user.is_authenticated %}
218
- <button type="button" class="btn btn-default btn-xs" data-toggle="modal" data-target="#VirtualMachineVMInterfaceTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
218
+ {% table_config_button_small vminterface_table %}
219
219
  {% endif %}
220
220
  </div>
221
221
  <div class="pull-right col-md-2 noprint">
@@ -20,7 +20,13 @@
20
20
  <td>
21
21
  {{ object.status| hyperlinked_object_with_color }}
22
22
  </td>
23
- </tr>
23
+ </tr>
24
+ <tr>
25
+ <td>Role</td>
26
+ <td>
27
+ {{ object.role| hyperlinked_object_with_color }}
28
+ </td>
29
+ </tr>
24
30
  <tr>
25
31
  <td>Enabled</td>
26
32
  <td>{{ object.enabled | render_boolean }}</td>
@@ -9,6 +9,7 @@
9
9
  {% render_field form.virtual_machine %}
10
10
  {% render_field form.name %}
11
11
  {% render_field form.status %}
12
+ {% render_field form.role %}
12
13
  {% render_field form.enabled %}
13
14
  {% render_field form.parent_interface %}
14
15
  {% render_field form.bridge %}
@@ -4,7 +4,7 @@ from rest_framework import status
4
4
  from nautobot.core.testing import APITestCase, APIViewTestCases
5
5
  from nautobot.dcim.choices import InterfaceModeChoices
6
6
  from nautobot.dcim.models import Location, LocationType, SoftwareVersion
7
- from nautobot.extras.models import ConfigContextSchema, Status
7
+ from nautobot.extras.models import ConfigContextSchema, Role, Status
8
8
  from nautobot.ipam.models import VLAN, VLANGroup
9
9
  from nautobot.virtualization.models import (
10
10
  Cluster,
@@ -289,11 +289,15 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase):
289
289
  vm_status = Status.objects.get_for_model(VirtualMachine).first()
290
290
  virtualmachine = VirtualMachine.objects.create(cluster=cluster, name="Test VM 1", status=vm_status)
291
291
  cls.interface_status = Status.objects.get_for_model(VMInterface).first()
292
-
292
+ cls.interface_role = Role.objects.get_for_model(VMInterface).first()
293
293
  interfaces = (
294
- VMInterface.objects.create(virtual_machine=virtualmachine, name="Interface 1", status=cls.interface_status),
294
+ VMInterface.objects.create(
295
+ virtual_machine=virtualmachine, name="Interface 1", status=cls.interface_status, role=cls.interface_role
296
+ ),
295
297
  VMInterface.objects.create(virtual_machine=virtualmachine, name="Interface 2", status=cls.interface_status),
296
- VMInterface.objects.create(virtual_machine=virtualmachine, name="Interface 3", status=cls.interface_status),
298
+ VMInterface.objects.create(
299
+ virtual_machine=virtualmachine, name="Interface 3", status=cls.interface_status, role=cls.interface_role
300
+ ),
297
301
  )
298
302
 
299
303
  vlan_status = Status.objects.get_for_model(VLAN).first()
@@ -380,6 +384,7 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase):
380
384
  name="VMInterface 1",
381
385
  mode=InterfaceModeChoices.MODE_TAGGED,
382
386
  status=self.interface_status,
387
+ role=self.interface_role,
383
388
  )
384
389
  interface.tagged_vlans.add(vlan)
385
390
  payload = {"mode": None, "tagged_vlans": [vlan.pk]}
@@ -346,6 +346,7 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
346
346
  memory=3,
347
347
  disk=3,
348
348
  comments="This is VM 4",
349
+ software_version=None,
349
350
  ),
350
351
  VirtualMachine.objects.create(
351
352
  name="Virtual Machine 5",
@@ -358,6 +359,7 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
358
359
  memory=3,
359
360
  disk=3,
360
361
  comments="This is VM 5",
362
+ software_version=None,
361
363
  ),
362
364
  VirtualMachine.objects.create(
363
365
  name="Virtual Machine 6",
@@ -370,24 +372,28 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
370
372
  memory=3,
371
373
  disk=3,
372
374
  comments="This is VM 6",
375
+ software_version=cls.software_versions[1],
373
376
  ),
374
377
  )
375
378
  vms[0].software_image_files.set(cls.software_versions[1].software_image_files.all())
376
379
  vms[1].software_image_files.set(cls.software_versions[0].software_image_files.all())
377
380
 
378
381
  int_status = Status.objects.get_for_model(VMInterface).first()
382
+ int_role = Role.objects.get_for_model(VMInterface).first()
379
383
  cls.interfaces = (
380
384
  VMInterface.objects.create(
381
385
  virtual_machine=vms[0],
382
386
  name="Interface 1",
383
387
  mac_address="00-00-00-00-00-01",
384
388
  status=int_status,
389
+ role=int_role,
385
390
  ),
386
391
  VMInterface.objects.create(
387
392
  virtual_machine=vms[1],
388
393
  name="Interface 2",
389
394
  mac_address="00-00-00-00-00-02",
390
395
  status=int_status,
396
+ role=int_role,
391
397
  ),
392
398
  VMInterface.objects.create(
393
399
  virtual_machine=vms[2],
@@ -435,6 +441,15 @@ class VirtualMachineTestCase(FilterTestCases.FilterTestCase, FilterTestCases.Ten
435
441
  vms[0].tags.set(Tag.objects.get_for_model(VirtualMachine))
436
442
  vms[1].tags.set(Tag.objects.get_for_model(VirtualMachine)[:3])
437
443
 
444
+ def test_filters_generic(self):
445
+ # Assign more than 2 different software versions to VirtualMachine before we test generic filters
446
+ software_versions = list(SoftwareVersion.objects.all())
447
+ virtual_machines = list(VirtualMachine.objects.all())
448
+ for i in range(4):
449
+ virtual_machines[i].software_version = software_versions[i]
450
+ virtual_machines[i].save()
451
+ return super().test_filters_generic()
452
+
438
453
  def test_name(self):
439
454
  params = {"name": ["Virtual Machine 1", "Virtual Machine 2"]}
440
455
  self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
@@ -594,6 +609,8 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
594
609
  ["mac_address"],
595
610
  ["mtu"],
596
611
  ["name"],
612
+ ("role", "role__id"),
613
+ ("role", "role__name"),
597
614
  ["parent_interface"],
598
615
  ["tagged_vlans", "tagged_vlans__pk"],
599
616
  ["tagged_vlans", "tagged_vlans__vid"],
@@ -625,6 +642,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
625
642
  )
626
643
 
627
644
  statuses = Status.objects.get_for_model(VMInterface)
645
+ roles = Role.objects.get_for_model(VMInterface)
628
646
 
629
647
  vlans = VLAN.objects.filter()[:2]
630
648
  vlans[0].locations.clear()
@@ -640,6 +658,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
640
658
  enabled=True,
641
659
  mtu=100,
642
660
  mac_address="00-00-00-00-00-01",
661
+ role=roles[0],
643
662
  status=statuses[0],
644
663
  description="This is a description of Interface1",
645
664
  mode=InterfaceModeChoices.MODE_ACCESS,
@@ -651,6 +670,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
651
670
  enabled=True,
652
671
  mtu=200,
653
672
  mac_address="00-00-00-00-00-02",
673
+ role=roles[1],
654
674
  status=statuses[0],
655
675
  description="This is a description of Interface2",
656
676
  mode=InterfaceModeChoices.MODE_ACCESS,
@@ -676,6 +696,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
676
696
  enabled=False,
677
697
  mtu=300,
678
698
  mac_address="00-00-00-00-00-04",
699
+ role=roles[0],
679
700
  status=statuses[1],
680
701
  description="This is a description of Interface4",
681
702
  mode=InterfaceModeChoices.MODE_TAGGED,
@@ -688,6 +709,7 @@ class VMInterfaceTestCase(FilterTestCases.FilterTestCase):
688
709
  enabled=False,
689
710
  mtu=300,
690
711
  mac_address="00-00-00-00-00-05",
712
+ role=roles[1],
691
713
  status=statuses[2],
692
714
  description="This is a description of Interface5",
693
715
  mode=InterfaceModeChoices.MODE_TAGGED_ALL,
@@ -3,7 +3,7 @@ from django.core.exceptions import ValidationError
3
3
  from django.test import TestCase
4
4
 
5
5
  from nautobot.dcim.models import Location, LocationType
6
- from nautobot.extras.models import Status
6
+ from nautobot.extras.models import Role, Status
7
7
  from nautobot.ipam.factory import VLANGroupFactory
8
8
  from nautobot.ipam.models import IPAddress, IPAddressToInterface, VLAN
9
9
  from nautobot.tenancy.models import Tenant
@@ -32,6 +32,7 @@ class VirtualMachineTestCase(TestCase): # TODO: change to BaseModelTestCase
32
32
  self.cluster = Cluster.objects.create(name="Test Cluster 1", cluster_type=cluster_type)
33
33
  self.status = statuses[0]
34
34
  self.int_status = Status.objects.get_for_model(VMInterface).first()
35
+ self.int_role = Role.objects.get_for_model(VMInterface).first()
35
36
 
36
37
  def test_vm_duplicate_name_per_cluster(self):
37
38
  vm1 = VirtualMachine(
@@ -73,7 +74,9 @@ class VirtualMachineTestCase(TestCase): # TODO: change to BaseModelTestCase
73
74
  status=self.status,
74
75
  )
75
76
  vm1.save()
76
- vm_interface = VMInterface.objects.create(name="Int1", virtual_machine=vm1, status=self.int_status)
77
+ vm_interface = VMInterface.objects.create(
78
+ name="Int1", virtual_machine=vm1, status=self.int_status, role=self.int_role
79
+ )
77
80
  ips = list(IPAddress.objects.filter(ip_version=4)[:5]) + list(IPAddress.objects.filter(ip_version=6)[:5])
78
81
  vm_interface.add_ip_addresses(ips)
79
82
  vm1.primary_ip4 = vm_interface.ip_addresses.all().filter(ip_version=6).first()
@@ -110,10 +113,11 @@ class VMInterfaceTestCase(TestCase): # TODO: change to BaseModelTestCase
110
113
  vm_status = Status.objects.get_for_model(VirtualMachine).first()
111
114
  cls.virtualmachine = VirtualMachine.objects.create(cluster=cluster, name="Test VM 1", status=vm_status)
112
115
  cls.int_status = Status.objects.get_for_model(VMInterface).first()
116
+ cls.int_role = Role.objects.get_for_model(VMInterface).first()
113
117
 
114
118
  def test_tagged_vlan_raise_error_if_mode_not_set_to_tagged(self):
115
119
  interface = VMInterface.objects.create(
116
- virtual_machine=self.virtualmachine, name="Interface 1", status=self.int_status
120
+ virtual_machine=self.virtualmachine, name="Interface 1", status=self.int_status, role=self.int_role
117
121
  )
118
122
  with self.assertRaises(ValidationError) as err:
119
123
  interface.tagged_vlans.add(self.vlan)
@@ -265,11 +265,15 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
265
265
 
266
266
  statuses = Status.objects.get_for_model(VMInterface)
267
267
  status = statuses.first()
268
-
268
+ role = Role.objects.get_for_model(VMInterface).first()
269
269
  interfaces = (
270
- VMInterface.objects.create(virtual_machine=virtualmachines[0], name="Interface 1", status=status),
270
+ VMInterface.objects.create(
271
+ virtual_machine=virtualmachines[0], name="Interface 1", status=status, role=role
272
+ ),
271
273
  VMInterface.objects.create(virtual_machine=virtualmachines[0], name="Interface 2", status=status),
272
- VMInterface.objects.create(virtual_machine=virtualmachines[0], name="Interface 3", status=status),
274
+ VMInterface.objects.create(
275
+ virtual_machine=virtualmachines[0], name="Interface 3", status=status, role=role
276
+ ),
273
277
  VMInterface.objects.create(virtual_machine=virtualmachines[1], name="BRIDGE", status=status),
274
278
  )
275
279
  # Required by ViewTestCases.DeviceComponentViewTestCase.test_bulk_rename
@@ -332,15 +336,27 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
332
336
  "mode": InterfaceModeChoices.MODE_TAGGED,
333
337
  "custom_field_1": "Custom field data",
334
338
  "tags": [],
339
+ "role": role.pk,
335
340
  }
336
341
 
337
342
  cls.bulk_edit_data = {
338
343
  "enabled": False,
339
344
  "mtu": 2000,
340
345
  "status": status.pk,
346
+ "role": role.pk,
341
347
  "description": "New description",
342
348
  "mode": InterfaceModeChoices.MODE_TAGGED,
343
349
  "untagged_vlan": vlans[0].pk,
344
350
  "tagged_vlans": [v.pk for v in vlans[1:4]],
345
351
  "custom_field_1": "New Custom Field Data",
346
352
  }
353
+
354
+ def _edit_object_test_setup(self):
355
+ test_instance = self._get_queryset().first()
356
+ self.update_data = {
357
+ "name": test_instance.name,
358
+ "virtual_machine": test_instance.virtual_machine.pk,
359
+ "status": test_instance.status.pk,
360
+ "label": "new test label",
361
+ "description": "new test description",
362
+ }
@@ -123,7 +123,7 @@ urlpatterns = [
123
123
  name="cluster_changelog",
124
124
  kwargs={"model": Cluster},
125
125
  ),
126
- path(
126
+ path( # 3.0 TODO: remove, no longer needed/used since 2.3
127
127
  "clusters/<uuid:pk>/dynamic-groups/",
128
128
  ObjectDynamicGroupsView.as_view(),
129
129
  name="cluster_dynamicgroups",
@@ -197,7 +197,7 @@ urlpatterns = [
197
197
  name="virtualmachine_changelog",
198
198
  kwargs={"model": VirtualMachine},
199
199
  ),
200
- path(
200
+ path( # 3.0 TODO: remove, no longer needed/used since 2.3
201
201
  "virtual-machines/<uuid:pk>/dynamic-groups/",
202
202
  ObjectDynamicGroupsView.as_view(),
203
203
  name="virtualmachine_dynamicgroups",
@@ -6,7 +6,6 @@ from django.urls import reverse
6
6
  from django.utils.functional import cached_property
7
7
  from django_tables2 import RequestConfig
8
8
 
9
- from nautobot.core.models.querysets import count_related
10
9
  from nautobot.core.utils.requests import normalize_querydict
11
10
  from nautobot.core.views import generic
12
11
  from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
@@ -25,7 +24,7 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
25
24
 
26
25
 
27
26
  class ClusterTypeListView(generic.ObjectListView):
28
- queryset = ClusterType.objects.annotate(cluster_count=count_related(Cluster, "cluster_type"))
27
+ queryset = ClusterType.objects.all()
29
28
  filterset = filters.ClusterTypeFilterSet
30
29
  filterset_form = forms.ClusterTypeFilterForm
31
30
  table = tables.ClusterTypeTable
@@ -36,14 +35,7 @@ class ClusterTypeView(generic.ObjectView):
36
35
 
37
36
  def get_extra_context(self, request, instance):
38
37
  # Clusters
39
- clusters = (
40
- Cluster.objects.restrict(request.user, "view")
41
- .filter(cluster_type=instance)
42
- .select_related("cluster_group", "location", "tenant")
43
- ).annotate(
44
- device_count=count_related(Device, "cluster"),
45
- vm_count=count_related(VirtualMachine, "cluster"),
46
- )
38
+ clusters = Cluster.objects.restrict(request.user, "view").filter(cluster_type=instance)
47
39
 
48
40
  cluster_table = tables.ClusterTable(clusters)
49
41
  cluster_table.columns.hide("cluster_type")
@@ -72,7 +64,7 @@ class ClusterTypeBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, un
72
64
 
73
65
 
74
66
  class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
75
- queryset = ClusterType.objects.annotate(cluster_count=count_related(Cluster, "cluster_type"))
67
+ queryset = ClusterType.objects.all()
76
68
  table = tables.ClusterTypeTable
77
69
  filterset = filters.ClusterTypeFilterSet
78
70
 
@@ -83,7 +75,7 @@ class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
83
75
 
84
76
 
85
77
  class ClusterGroupListView(generic.ObjectListView):
86
- queryset = ClusterGroup.objects.annotate(cluster_count=count_related(Cluster, "cluster_group"))
78
+ queryset = ClusterGroup.objects.all()
87
79
  filterset = filters.ClusterGroupFilterSet
88
80
  filterset_form = forms.ClusterGroupFilterForm
89
81
  table = tables.ClusterGroupTable
@@ -94,14 +86,7 @@ class ClusterGroupView(generic.ObjectView):
94
86
 
95
87
  def get_extra_context(self, request, instance):
96
88
  # Clusters
97
- clusters = (
98
- Cluster.objects.restrict(request.user, "view")
99
- .filter(cluster_group=instance)
100
- .select_related("cluster_type", "location", "tenant")
101
- ).annotate(
102
- device_count=count_related(Device, "cluster"),
103
- vm_count=count_related(VirtualMachine, "cluster"),
104
- )
89
+ clusters = Cluster.objects.restrict(request.user, "view").filter(cluster_group=instance)
105
90
 
106
91
  cluster_table = tables.ClusterTable(clusters)
107
92
  cluster_table.columns.hide("cluster_group")
@@ -130,7 +115,7 @@ class ClusterGroupBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, u
130
115
 
131
116
 
132
117
  class ClusterGroupBulkDeleteView(generic.BulkDeleteView):
133
- queryset = ClusterGroup.objects.annotate(cluster_count=count_related(Cluster, "cluster_group"))
118
+ queryset = ClusterGroup.objects.all()
134
119
  table = tables.ClusterGroupTable
135
120
  filterset = filters.ClusterGroupFilterSet
136
121
 
@@ -142,10 +127,7 @@ class ClusterGroupBulkDeleteView(generic.BulkDeleteView):
142
127
 
143
128
  class ClusterListView(generic.ObjectListView):
144
129
  permission_required = "virtualization.view_cluster"
145
- queryset = Cluster.objects.annotate(
146
- device_count=count_related(Device, "cluster"),
147
- vm_count=count_related(VirtualMachine, "cluster"),
148
- )
130
+ queryset = Cluster.objects.all()
149
131
  table = tables.ClusterTable
150
132
  filterset = filters.ClusterFilterSet
151
133
  filterset_form = forms.ClusterFilterForm
@@ -155,11 +137,7 @@ class ClusterView(generic.ObjectView):
155
137
  queryset = Cluster.objects.all()
156
138
 
157
139
  def get_extra_context(self, request, instance):
158
- devices = (
159
- Device.objects.restrict(request.user, "view")
160
- .filter(cluster=instance)
161
- .select_related("location", "rack", "tenant", "device_type__manufacturer")
162
- )
140
+ devices = Device.objects.restrict(request.user, "view").filter(cluster=instance)
163
141
  device_table = DeviceTable(list(devices), orderable=False)
164
142
  if request.user.has_perm("virtualization.change_cluster"):
165
143
  device_table.columns.show("pk")
@@ -183,14 +161,14 @@ class ClusterBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, unused
183
161
 
184
162
 
185
163
  class ClusterBulkEditView(generic.BulkEditView):
186
- queryset = Cluster.objects.select_related("cluster_type", "cluster_group", "location")
164
+ queryset = Cluster.objects.all()
187
165
  filterset = filters.ClusterFilterSet
188
166
  table = tables.ClusterTable
189
167
  form = forms.ClusterBulkEditForm
190
168
 
191
169
 
192
170
  class ClusterBulkDeleteView(generic.BulkDeleteView):
193
- queryset = Cluster.objects.select_related("cluster_type", "cluster_group", "location")
171
+ queryset = Cluster.objects.all()
194
172
  filterset = filters.ClusterFilterSet
195
173
  table = tables.ClusterTable
196
174
 
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nautobot
3
- Version: 2.2.9
3
+ Version: 2.3.0
4
4
  Summary: Source of truth and network automation platform.
5
5
  Home-page: https://nautobot.com
6
6
  License: Apache-2.0
7
7
  Keywords: Nautobot
8
8
  Author: Network to Code
9
9
  Author-email: opensource@networktocode.com
10
- Requires-Python: >=3.8,<3.12
10
+ Requires-Python: >=3.8,<3.13
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: Apache Software License
@@ -16,50 +16,52 @@ Classifier: Programming Language :: Python :: 3.8
16
16
  Classifier: Programming Language :: Python :: 3.9
17
17
  Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
19
20
  Provides-Extra: all
20
21
  Provides-Extra: ldap
21
22
  Provides-Extra: mysql
22
23
  Provides-Extra: napalm
23
24
  Provides-Extra: remote-storage
24
25
  Provides-Extra: sso
25
- Requires-Dist: Django (>=3.2.25,<3.3.0)
26
+ Requires-Dist: Django (>=4.2.15,<4.3.0)
26
27
  Requires-Dist: GitPython (>=3.1.43,<3.2.0)
27
28
  Requires-Dist: Jinja2 (>=3.1.4,<3.2.0)
28
- Requires-Dist: Markdown (>=3.5.2,<3.6.0)
29
+ Requires-Dist: Markdown (>=3.6,<3.7)
29
30
  Requires-Dist: MarkupSafe (>=2.1.5,<2.2.0)
30
31
  Requires-Dist: Pillow (>=10.3.0,<10.4.0)
31
32
  Requires-Dist: PyYAML (>=6.0,<6.1)
32
- Requires-Dist: celery (>=5.3.1,<5.4.0)
33
+ Requires-Dist: celery (>=5.3.6,<5.4.0)
33
34
  Requires-Dist: django-ajax-tables (>=1.1.1,<1.2.0)
34
- Requires-Dist: django-auth-ldap (>=4.7.0,<4.8.0) ; extra == "all" or extra == "ldap"
35
+ Requires-Dist: django-auth-ldap (>=4.8.0,<4.9.0) ; extra == "all" or extra == "ldap"
35
36
  Requires-Dist: django-celery-beat (>=2.6.0,<2.7.0)
36
37
  Requires-Dist: django-celery-results (>=2.5.1,<2.6.0)
37
- Requires-Dist: django-constance[database] (>=2.9.1,<2.10.0)
38
- Requires-Dist: django-cors-headers (>=4.3.1,<4.4.0)
39
- Requires-Dist: django-db-file-storage (>=0.5.5,<0.6.0)
38
+ Requires-Dist: django-constance (>=3.1.0,<3.2.0)
39
+ Requires-Dist: django-cors-headers (>=4.4.0,<4.5.0)
40
+ Requires-Dist: django-db-file-storage (>=0.5.6.1,<0.6.0.0)
40
41
  Requires-Dist: django-extensions (>=3.2.3,<3.3.0)
41
- Requires-Dist: django-filter (>=23.5,<23.6)
42
- Requires-Dist: django-health-check (>=3.18.1,<3.19.0)
42
+ Requires-Dist: django-filter (>=24.2,<24.3)
43
+ Requires-Dist: django-health-check (>=3.18.3,<3.19.0)
43
44
  Requires-Dist: django-jinja (>=2.11.0,<2.12.0)
44
45
  Requires-Dist: django-prometheus (>=2.3.1,<2.4.0)
45
46
  Requires-Dist: django-redis (>=5.4.0,<5.5.0)
46
47
  Requires-Dist: django-silk (>=5.1.0,<5.2.0)
47
48
  Requires-Dist: django-storages (==1.14.3) ; extra == "all" or extra == "remote-storage"
49
+ Requires-Dist: django-structlog[all] (>=8.1.0,<9.0.0)
48
50
  Requires-Dist: django-tables2 (>=2.7.0,<2.8.0)
49
- Requires-Dist: django-taggit (>=4.0.0,<4.1.0)
50
- Requires-Dist: django-timezone-field (>=5.1,<5.2)
51
- Requires-Dist: django-tree-queries (>=0.17.0,<0.18.0)
51
+ Requires-Dist: django-taggit (>=5.0.0,<5.1.0)
52
+ Requires-Dist: django-timezone-field (>=7.0,<7.1)
53
+ Requires-Dist: django-tree-queries (>=0.19.0,<0.20.0)
52
54
  Requires-Dist: django-webserver (>=1.2.0,<1.3.0)
53
- Requires-Dist: djangorestframework (>=3.15.1,<3.16.0)
55
+ Requires-Dist: djangorestframework (>=3.15.2,<3.16.0)
54
56
  Requires-Dist: drf-react-template-framework (>=0.0.17,<0.0.18)
55
57
  Requires-Dist: drf-spectacular[sidecar] (>=0.27.2,<0.28.0)
56
- Requires-Dist: emoji (>=2.11.0,<2.12.0)
58
+ Requires-Dist: emoji (>=2.12.1,<2.13.0)
57
59
  Requires-Dist: graphene-django (>=2.16.0,<2.17.0)
58
60
  Requires-Dist: graphene-django-optimizer (>=0.8.0,<0.9.0)
59
61
  Requires-Dist: jsonschema (>=4.7.0,<5.0.0)
60
62
  Requires-Dist: mysqlclient (>=2.2.3,<2.3.0) ; extra == "all" or extra == "mysql"
61
- Requires-Dist: napalm (>=4.1.0,<4.2.0) ; extra == "all" or extra == "napalm"
62
- Requires-Dist: netaddr (>=0.10.1,<0.11.0)
63
+ Requires-Dist: napalm (>=4.1.0,<6.0.0) ; extra == "all" or extra == "napalm"
64
+ Requires-Dist: netaddr (>=1.3.0,<1.4.0)
63
65
  Requires-Dist: netutils (>=1.6.0,<2.0.0)
64
66
  Requires-Dist: nh3 (>=0.2.15,<0.3.0)
65
67
  Requires-Dist: packaging (>=23.1)