nautobot 2.2.9__py3-none-any.whl → 2.3.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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 +111 -0
  26. nautobot/cloud/filters.py +184 -0
  27. nautobot/cloud/forms.py +333 -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 +247 -0
  32. nautobot/cloud/navigation.py +85 -0
  33. nautobot/cloud/tables.py +173 -0
  34. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
  35. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +128 -0
  36. nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
  37. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +100 -0
  38. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +65 -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 +113 -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 +96 -28
  57. nautobot/core/forms/fields.py +10 -4
  58. nautobot/core/forms/forms.py +1 -1
  59. nautobot/core/forms/widgets.py +18 -1
  60. nautobot/core/graphql/generators.py +2 -2
  61. nautobot/core/graphql/schema.py +34 -4
  62. nautobot/core/jobs/__init__.py +17 -6
  63. nautobot/core/jobs/cleanup.py +100 -0
  64. nautobot/core/jobs/groups.py +38 -0
  65. nautobot/core/management/commands/generate_test_data.py +116 -3
  66. nautobot/core/models/__init__.py +34 -9
  67. nautobot/core/models/generics.py +19 -3
  68. nautobot/core/models/name_color_content_types.py +7 -28
  69. nautobot/core/models/querysets.py +4 -3
  70. nautobot/core/models/tree_queries.py +1 -1
  71. nautobot/core/models/utils.py +21 -5
  72. nautobot/core/settings.py +4 -30
  73. nautobot/core/settings.yaml +34 -27
  74. nautobot/core/settings_funcs.py +103 -0
  75. nautobot/core/tables.py +127 -56
  76. nautobot/core/templates/admin/search_form.html +1 -1
  77. nautobot/core/templates/buttons/add.html +11 -3
  78. nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +13 -0
  79. nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +13 -0
  80. nautobot/core/templates/buttons/export.html +101 -53
  81. nautobot/core/templates/buttons/job_import.html +11 -3
  82. nautobot/core/templates/generic/object_bulk_destroy.html +3 -1
  83. nautobot/core/templates/generic/object_bulk_update.html +3 -1
  84. nautobot/core/templates/generic/object_changelog.html +0 -9
  85. nautobot/core/templates/generic/object_list.html +156 -17
  86. nautobot/core/templates/generic/object_retrieve.html +80 -16
  87. nautobot/core/templates/inc/extras_features_edit_form_fields.html +8 -0
  88. nautobot/core/templates/inc/javascript.html +2 -0
  89. nautobot/core/templates/inc/media.html +2 -2
  90. nautobot/core/templates/inc/nav_menu.html +1 -0
  91. nautobot/core/templates/inc/paginator.html +7 -7
  92. nautobot/core/templates/inc/search_panel.html +2 -2
  93. nautobot/core/templates/inc/table.html +2 -2
  94. nautobot/core/templates/nautobot_config.py.j2 +13 -23
  95. nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +37 -0
  96. nautobot/core/templates/utilities/templatetags/filter_form_modal.html +2 -2
  97. nautobot/core/templates/utilities/templatetags/saved_view_modal.html +38 -0
  98. nautobot/core/templates/utilities/theme_preview.html +25 -8
  99. nautobot/core/templates/utilities/worker_status.html +152 -0
  100. nautobot/core/templatetags/buttons.py +335 -38
  101. nautobot/core/templatetags/form_helpers.py +1 -1
  102. nautobot/core/templatetags/helpers.py +181 -11
  103. nautobot/core/testing/api.py +5 -4
  104. nautobot/core/testing/filters.py +51 -13
  105. nautobot/core/testing/mixins.py +46 -0
  106. nautobot/core/testing/models.py +22 -0
  107. nautobot/core/testing/schema.py +4 -8
  108. nautobot/core/testing/views.py +31 -14
  109. nautobot/core/tests/integration/test_general_functionality.py +1 -1
  110. nautobot/core/tests/integration/test_import_objects_ui.py +1 -0
  111. nautobot/core/tests/integration/test_swagger.py +1 -1
  112. nautobot/core/tests/nautobot_config.py +0 -1
  113. nautobot/core/tests/runner.py +2 -2
  114. nautobot/core/tests/test_api.py +1 -0
  115. nautobot/core/tests/test_authentication.py +7 -2
  116. nautobot/core/tests/test_filters.py +11 -9
  117. nautobot/core/tests/test_forms.py +9 -0
  118. nautobot/core/tests/test_graphql.py +27 -16
  119. nautobot/core/tests/test_jobs.py +123 -74
  120. nautobot/core/tests/test_tables.py +3 -1
  121. nautobot/core/tests/test_templatetags_helpers.py +12 -5
  122. nautobot/core/tests/test_utils.py +31 -20
  123. nautobot/core/tests/test_views.py +6 -6
  124. nautobot/core/urls.py +8 -3
  125. nautobot/core/utils/deprecation.py +29 -0
  126. nautobot/core/utils/filtering.py +12 -9
  127. nautobot/core/utils/lookup.py +37 -2
  128. nautobot/core/utils/requests.py +4 -1
  129. nautobot/core/views/__init__.py +137 -24
  130. nautobot/core/views/generic.py +118 -66
  131. nautobot/core/views/mixins.py +104 -35
  132. nautobot/core/views/paginator.py +9 -3
  133. nautobot/core/views/renderers.py +121 -56
  134. nautobot/core/views/utils.py +79 -1
  135. nautobot/dcim/__init__.py +0 -1
  136. nautobot/dcim/api/serializers.py +180 -44
  137. nautobot/dcim/api/urls.py +7 -3
  138. nautobot/dcim/api/views.py +53 -7
  139. nautobot/dcim/apps.py +3 -0
  140. nautobot/dcim/choices.py +25 -0
  141. nautobot/dcim/constants.py +7 -0
  142. nautobot/dcim/factory.py +249 -18
  143. nautobot/dcim/filters/__init__.py +369 -193
  144. nautobot/dcim/filters/mixins.py +274 -1
  145. nautobot/dcim/forms.py +817 -109
  146. nautobot/dcim/graphql/types.py +2 -2
  147. nautobot/dcim/homepage.py +1 -1
  148. nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
  149. nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
  150. nautobot/dcim/migrations/0061_module_models.py +861 -0
  151. nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
  152. nautobot/dcim/models/__init__.py +8 -0
  153. nautobot/dcim/models/cables.py +15 -0
  154. nautobot/dcim/models/device_component_templates.py +207 -53
  155. nautobot/dcim/models/device_components.py +275 -106
  156. nautobot/dcim/models/devices.py +466 -13
  157. nautobot/dcim/navigation.py +47 -0
  158. nautobot/dcim/signals.py +3 -3
  159. nautobot/dcim/tables/__init__.py +35 -23
  160. nautobot/dcim/tables/devices.py +231 -59
  161. nautobot/dcim/tables/devicetypes.py +65 -9
  162. nautobot/dcim/tables/racks.py +5 -1
  163. nautobot/dcim/tables/template_code.py +46 -26
  164. nautobot/dcim/templates/dcim/cable_connect.html +76 -3
  165. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
  166. nautobot/dcim/templates/dcim/device/base.html +15 -7
  167. nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
  168. nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
  169. nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
  170. nautobot/dcim/templates/dcim/device/frontports.html +2 -3
  171. nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
  172. nautobot/dcim/templates/dcim/device/inventory.html +2 -3
  173. nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
  174. nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
  175. nautobot/dcim/templates/dcim/device/powerports.html +2 -3
  176. nautobot/dcim/templates/dcim/device/rearports.html +2 -3
  177. nautobot/dcim/templates/dcim/device.html +45 -1
  178. nautobot/dcim/templates/dcim/device_component.html +13 -5
  179. nautobot/dcim/templates/dcim/device_list.html +2 -1
  180. nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +0 -6
  181. nautobot/dcim/templates/dcim/devicetype.html +99 -98
  182. nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
  183. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
  184. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
  185. nautobot/dcim/templates/dcim/interface.html +17 -2
  186. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
  187. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  188. nautobot/dcim/templates/dcim/manufacturer.html +24 -0
  189. nautobot/dcim/templates/dcim/module/base.html +97 -0
  190. nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
  191. nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
  192. nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
  193. nautobot/dcim/templates/dcim/module_destroy.html +5 -0
  194. nautobot/dcim/templates/dcim/module_frontports.html +53 -0
  195. nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
  196. nautobot/dcim/templates/dcim/module_list.html +20 -0
  197. nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
  198. nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
  199. nautobot/dcim/templates/dcim/module_powerports.html +53 -0
  200. nautobot/dcim/templates/dcim/module_rearports.html +53 -0
  201. nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
  202. nautobot/dcim/templates/dcim/module_update.html +71 -0
  203. nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
  204. nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
  205. nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
  206. nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
  207. nautobot/dcim/templates/dcim/moduletype_retrieve.html +142 -0
  208. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
  209. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
  210. nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
  211. nautobot/dcim/tests/test_api.py +691 -208
  212. nautobot/dcim/tests/test_filters.py +836 -217
  213. nautobot/dcim/tests/test_models.py +1072 -39
  214. nautobot/dcim/tests/test_views.py +1488 -358
  215. nautobot/dcim/urls.py +17 -2
  216. nautobot/dcim/utils.py +2 -3
  217. nautobot/dcim/views.py +1107 -120
  218. nautobot/extras/__init__.py +0 -1
  219. nautobot/extras/api/serializers.py +115 -3
  220. nautobot/extras/api/urls.py +12 -0
  221. nautobot/extras/api/views.py +125 -7
  222. nautobot/extras/apps.py +2 -2
  223. nautobot/extras/choices.py +43 -0
  224. nautobot/extras/context_managers.py +13 -8
  225. nautobot/extras/datasources/git.py +2 -0
  226. nautobot/extras/factory.py +422 -9
  227. nautobot/extras/filters/__init__.py +174 -3
  228. nautobot/extras/filters/mixins.py +46 -43
  229. nautobot/extras/forms/base.py +17 -4
  230. nautobot/extras/forms/forms.py +227 -8
  231. nautobot/extras/forms/mixins.py +93 -0
  232. nautobot/extras/graphql/types.py +23 -10
  233. nautobot/extras/homepage.py +16 -13
  234. nautobot/extras/jobs.py +2 -2
  235. nautobot/extras/management/__init__.py +1 -0
  236. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
  237. nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
  238. nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
  239. nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
  240. nautobot/extras/migrations/0111_metadata.py +162 -0
  241. nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
  242. nautobot/extras/migrations/0113_saved_views.py +77 -0
  243. nautobot/extras/models/__init__.py +15 -1
  244. nautobot/extras/models/change_logging.py +3 -3
  245. nautobot/extras/models/contacts.py +4 -0
  246. nautobot/extras/models/customfields.py +18 -3
  247. nautobot/extras/models/groups.py +389 -225
  248. nautobot/extras/models/jobs.py +4 -84
  249. nautobot/extras/models/metadata.py +441 -0
  250. nautobot/extras/models/mixins.py +72 -62
  251. nautobot/extras/models/models.py +116 -9
  252. nautobot/extras/models/relationships.py +9 -2
  253. nautobot/extras/models/tags.py +13 -2
  254. nautobot/extras/navigation.py +57 -0
  255. nautobot/extras/plugins/__init__.py +3 -1
  256. nautobot/extras/querysets.py +30 -66
  257. nautobot/extras/signals.py +96 -114
  258. nautobot/extras/tables.py +171 -47
  259. nautobot/extras/templates/extras/dynamicgroup.html +44 -15
  260. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
  261. nautobot/extras/templates/extras/job.html +1 -1
  262. nautobot/extras/templates/extras/job_detail.html +0 -11
  263. nautobot/extras/templates/extras/jobresult.html +61 -74
  264. nautobot/extras/templates/extras/metadatatype_create.html +89 -0
  265. nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
  266. nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
  267. nautobot/extras/templates/extras/objectchange_list.html +0 -12
  268. nautobot/extras/templates/extras/plugins_list.html +1 -3
  269. nautobot/extras/templates/extras/role_retrieve.html +48 -0
  270. nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
  271. nautobot/extras/tests/integration/test_customfields.py +1 -0
  272. nautobot/extras/tests/test_api.py +501 -22
  273. nautobot/extras/tests/test_changelog.py +20 -9
  274. nautobot/extras/tests/test_context_managers.py +22 -15
  275. nautobot/extras/tests/test_datasources.py +13 -1
  276. nautobot/extras/tests/test_dynamicgroups.py +201 -171
  277. nautobot/extras/tests/test_filters.py +211 -12
  278. nautobot/extras/tests/test_jobs.py +4 -4
  279. nautobot/extras/tests/test_models.py +499 -4
  280. nautobot/extras/tests/test_relationships.py +1 -0
  281. nautobot/extras/tests/test_views.py +565 -28
  282. nautobot/extras/tests/test_webhooks.py +1 -1
  283. nautobot/extras/urls.py +5 -0
  284. nautobot/extras/utils.py +56 -45
  285. nautobot/extras/views.py +585 -96
  286. nautobot/ipam/__init__.py +0 -1
  287. nautobot/ipam/apps.py +1 -0
  288. nautobot/ipam/factory.py +17 -19
  289. nautobot/ipam/filters.py +14 -1
  290. nautobot/ipam/forms.py +9 -5
  291. nautobot/ipam/graphql/types.py +2 -2
  292. nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
  293. nautobot/ipam/models.py +23 -9
  294. nautobot/ipam/querysets.py +1 -1
  295. nautobot/ipam/signals.py +4 -2
  296. nautobot/ipam/tables.py +1 -0
  297. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
  298. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
  299. nautobot/ipam/templates/ipam/prefix.html +1 -0
  300. nautobot/ipam/tests/test_api.py +37 -18
  301. nautobot/ipam/tests/test_filters.py +26 -2
  302. nautobot/ipam/tests/test_models.py +8 -3
  303. nautobot/ipam/tests/test_querysets.py +1 -1
  304. nautobot/ipam/tests/test_views.py +3 -2
  305. nautobot/ipam/urls.py +2 -2
  306. nautobot/ipam/views.py +25 -28
  307. nautobot/project-static/css/base.css +20 -1
  308. nautobot/project-static/css/dark.css +11 -0
  309. nautobot/project-static/docs/404.html +884 -80
  310. nautobot/project-static/docs/apps/index.html +884 -80
  311. nautobot/project-static/docs/apps/nautobot-apps.html +884 -80
  312. nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
  313. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +911 -112
  314. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +896 -93
  315. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1457 -790
  316. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +927 -136
  317. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +969 -180
  318. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +893 -91
  319. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +889 -85
  320. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +983 -185
  321. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +938 -143
  322. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1064 -274
  323. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1190 -346
  324. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1663 -865
  325. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1156 -373
  326. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2200 -1502
  327. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2229 -1421
  328. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +904 -103
  329. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +955 -155
  330. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1002 -215
  331. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1911 -1275
  332. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1835 -1091
  333. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +896 -93
  334. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2323 -1693
  335. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1785 -1023
  336. nautobot/project-static/docs/development/apps/api/configuration-view.html +884 -80
  337. nautobot/project-static/docs/development/apps/api/database-backend-config.html +884 -80
  338. nautobot/project-static/docs/development/apps/api/models/django-admin.html +884 -80
  339. nautobot/project-static/docs/development/apps/api/models/global-search.html +884 -80
  340. nautobot/project-static/docs/development/apps/api/models/graphql.html +884 -80
  341. nautobot/project-static/docs/development/apps/api/models/index.html +922 -81
  342. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +884 -80
  343. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +884 -80
  344. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +884 -80
  345. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +884 -80
  346. nautobot/project-static/docs/development/apps/api/platform-features/index.html +884 -80
  347. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +884 -80
  348. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +884 -80
  349. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +884 -80
  350. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +884 -80
  351. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +884 -80
  352. nautobot/project-static/docs/development/apps/api/prometheus.html +884 -80
  353. nautobot/project-static/docs/development/apps/api/setup.html +884 -80
  354. nautobot/project-static/docs/development/apps/api/testing.html +884 -80
  355. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +884 -80
  356. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +884 -80
  357. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +884 -80
  358. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +884 -80
  359. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +884 -80
  360. nautobot/project-static/docs/development/apps/api/views/base-template.html +884 -80
  361. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +884 -80
  362. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +884 -80
  363. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +884 -80
  364. nautobot/project-static/docs/development/apps/api/views/index.html +884 -80
  365. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +884 -80
  366. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +884 -80
  367. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +884 -80
  368. nautobot/project-static/docs/development/apps/api/views/notes.html +884 -80
  369. nautobot/project-static/docs/development/apps/api/views/rest-api.html +884 -80
  370. nautobot/project-static/docs/development/apps/api/views/urls.html +884 -80
  371. nautobot/project-static/docs/development/apps/index.html +884 -80
  372. nautobot/project-static/docs/development/apps/migration/code-updates.html +884 -80
  373. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +884 -80
  374. nautobot/project-static/docs/development/apps/migration/from-v1.html +884 -80
  375. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +884 -80
  376. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +884 -80
  377. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +884 -80
  378. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +884 -80
  379. nautobot/project-static/docs/development/apps/porting-from-netbox.html +884 -80
  380. nautobot/project-static/docs/development/core/application-registry.html +884 -80
  381. nautobot/project-static/docs/development/core/best-practices.html +885 -80
  382. nautobot/project-static/docs/development/core/bootstrap-ui.html +884 -80
  383. nautobot/project-static/docs/development/core/caching.html +884 -80
  384. nautobot/project-static/docs/development/core/controllers.html +884 -80
  385. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +884 -80
  386. nautobot/project-static/docs/development/core/generic-views.html +884 -80
  387. nautobot/project-static/docs/development/core/getting-started.html +884 -80
  388. nautobot/project-static/docs/development/core/homepage.html +884 -80
  389. nautobot/project-static/docs/development/core/index.html +884 -91
  390. nautobot/project-static/docs/development/core/model-checklist.html +887 -81
  391. nautobot/project-static/docs/development/core/model-features.html +884 -80
  392. nautobot/project-static/docs/development/core/natural-keys.html +884 -80
  393. nautobot/project-static/docs/development/core/navigation-menu.html +884 -80
  394. nautobot/project-static/docs/development/core/release-checklist.html +887 -83
  395. nautobot/project-static/docs/development/core/role-internals.html +884 -80
  396. nautobot/project-static/docs/development/core/settings.html +884 -80
  397. nautobot/project-static/docs/development/core/style-guide.html +885 -81
  398. nautobot/project-static/docs/development/core/templates.html +896 -81
  399. nautobot/project-static/docs/development/core/testing.html +884 -80
  400. nautobot/project-static/docs/development/core/user-preferences.html +884 -80
  401. nautobot/project-static/docs/development/index.html +884 -80
  402. nautobot/project-static/docs/development/jobs/index.html +1247 -457
  403. nautobot/project-static/docs/development/jobs/migration/from-v1.html +884 -80
  404. nautobot/project-static/docs/index.html +13 -8228
  405. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
  406. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
  407. nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
  408. nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
  409. nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
  410. nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
  411. nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
  412. nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
  413. nautobot/project-static/docs/models/dcim/module.html +15 -0
  414. nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
  415. nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
  416. nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
  417. nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
  418. nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
  419. nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
  420. nautobot/project-static/docs/models/extras/role.html +15 -0
  421. nautobot/project-static/docs/models/extras/savedview.html +15 -0
  422. nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
  423. nautobot/project-static/docs/models/extras/status.html +15 -0
  424. nautobot/project-static/docs/objects.inv +0 -0
  425. nautobot/project-static/docs/overview/application_stack.html +892 -81
  426. nautobot/project-static/docs/overview/design_philosophy.html +886 -82
  427. nautobot/project-static/docs/overview/index.html +9032 -13
  428. nautobot/project-static/docs/release-notes/index.html +887 -83
  429. nautobot/project-static/docs/release-notes/version-1.0.html +884 -80
  430. nautobot/project-static/docs/release-notes/version-1.1.html +884 -80
  431. nautobot/project-static/docs/release-notes/version-1.2.html +884 -80
  432. nautobot/project-static/docs/release-notes/version-1.3.html +884 -80
  433. nautobot/project-static/docs/release-notes/version-1.4.html +884 -80
  434. nautobot/project-static/docs/release-notes/version-1.5.html +885 -81
  435. nautobot/project-static/docs/release-notes/version-1.6.html +885 -81
  436. nautobot/project-static/docs/release-notes/version-2.0.html +884 -80
  437. nautobot/project-static/docs/release-notes/version-2.1.html +884 -80
  438. nautobot/project-static/docs/release-notes/version-2.2.html +990 -323
  439. nautobot/project-static/docs/release-notes/version-2.3.html +9524 -0
  440. nautobot/project-static/docs/requirements.txt +4 -4
  441. nautobot/project-static/docs/search/search_index.json +1 -1
  442. nautobot/project-static/docs/sitemap.xml +335 -260
  443. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  444. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +884 -80
  445. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +884 -80
  446. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +884 -80
  447. nautobot/project-static/docs/user-guide/administration/configuration/index.html +884 -80
  448. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +983 -197
  449. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +884 -80
  450. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +884 -80
  451. nautobot/project-static/docs/user-guide/administration/guides/caching.html +884 -80
  452. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +888 -84
  453. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +884 -80
  454. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +884 -80
  455. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +884 -80
  456. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +884 -80
  457. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +884 -80
  458. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +884 -80
  459. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +884 -80
  460. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +884 -80
  461. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +884 -80
  462. nautobot/project-static/docs/user-guide/administration/installation/index.html +888 -80
  463. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +884 -80
  464. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +884 -80
  465. nautobot/project-static/docs/user-guide/administration/installation/services.html +888 -80
  466. nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +900 -91
  467. nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +884 -80
  468. nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +884 -80
  469. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +884 -80
  470. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +884 -80
  471. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +915 -163
  472. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +884 -80
  473. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +884 -80
  474. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +884 -80
  475. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +884 -80
  476. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +884 -80
  477. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +884 -80
  478. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +884 -80
  479. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +884 -80
  480. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +884 -80
  481. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +884 -80
  482. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +884 -80
  483. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +885 -81
  484. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +884 -80
  485. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +888 -80
  486. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +887 -83
  487. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
  488. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
  489. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
  490. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
  491. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
  492. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
  493. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
  494. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +898 -94
  495. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +915 -97
  496. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +915 -97
  497. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +910 -92
  498. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +915 -97
  499. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +898 -94
  500. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +898 -94
  501. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +905 -97
  502. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +912 -108
  503. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +913 -109
  504. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +910 -106
  505. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +898 -94
  506. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +906 -97
  507. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +918 -100
  508. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +928 -110
  509. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +920 -98
  510. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +898 -94
  511. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +929 -111
  512. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +920 -102
  513. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +910 -106
  514. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +913 -109
  515. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +914 -106
  516. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
  517. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
  518. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
  519. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
  520. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +908 -104
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +898 -94
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +932 -75
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +916 -98
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +898 -94
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +935 -78
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +913 -95
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +921 -117
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +910 -106
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +898 -94
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +914 -96
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +916 -98
  532. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +898 -94
  533. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +898 -94
  534. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +898 -94
  535. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +884 -80
  536. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +884 -80
  537. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +889 -81
  538. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +889 -81
  539. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +884 -80
  540. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +884 -80
  541. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +884 -80
  542. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +884 -80
  543. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +884 -80
  544. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +884 -80
  545. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +884 -80
  546. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +884 -80
  547. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +884 -80
  548. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +884 -80
  549. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +893 -88
  550. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +884 -80
  551. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +884 -80
  552. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +884 -80
  553. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +884 -80
  554. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +884 -80
  555. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +889 -81
  556. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +884 -80
  557. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +884 -80
  558. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +884 -80
  559. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +884 -80
  560. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +884 -80
  561. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +884 -80
  562. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +884 -80
  563. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +884 -80
  564. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +884 -80
  565. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +884 -80
  566. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +884 -80
  567. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +884 -80
  568. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +884 -80
  569. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
  570. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
  571. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
  572. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
  587. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
  589. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
  590. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
  591. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
  592. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
  593. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
  594. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +884 -80
  595. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +884 -80
  596. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +884 -80
  597. nautobot/project-static/docs/user-guide/index.html +884 -80
  598. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +884 -80
  599. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +884 -80
  600. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +884 -80
  601. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +884 -80
  602. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1250 -777
  603. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +887 -83
  604. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +884 -80
  605. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +884 -80
  606. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +884 -80
  607. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +884 -80
  608. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +884 -80
  609. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +884 -80
  610. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +887 -83
  611. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +884 -80
  612. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +884 -80
  613. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +888 -80
  614. nautobot/project-static/docs/user-guide/platform-functionality/metadata.html +8948 -0
  615. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +887 -83
  616. nautobot/project-static/docs/user-guide/platform-functionality/note.html +884 -80
  617. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +884 -80
  618. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +884 -80
  619. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +884 -80
  620. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +884 -80
  621. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +884 -80
  622. nautobot/project-static/docs/user-guide/platform-functionality/role.html +887 -83
  623. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
  624. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +887 -83
  625. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
  626. nautobot/project-static/docs/user-guide/platform-functionality/status.html +884 -80
  627. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +884 -80
  628. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +942 -113
  629. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +884 -80
  630. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +884 -80
  631. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +884 -80
  632. nautobot/project-static/js/forms.js +71 -0
  633. nautobot/project-static/js/table_sorting_indicator.js +46 -0
  634. nautobot/project-static/js/tableconfig.js +6 -1
  635. nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
  636. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
  637. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
  638. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
  639. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
  640. nautobot/tenancy/__init__.py +0 -1
  641. nautobot/tenancy/apps.py +1 -0
  642. nautobot/tenancy/factory.py +3 -2
  643. nautobot/tenancy/filters/__init__.py +1 -0
  644. nautobot/tenancy/forms.py +1 -1
  645. nautobot/tenancy/templates/tenancy/tenant.html +22 -18
  646. nautobot/tenancy/views.py +11 -10
  647. nautobot/users/__init__.py +0 -1
  648. nautobot/users/api/serializers.py +1 -1
  649. nautobot/users/api/views.py +4 -2
  650. nautobot/users/apps.py +3 -2
  651. nautobot/users/factory.py +3 -3
  652. nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
  653. nautobot/users/models.py +12 -0
  654. nautobot/users/tests/test_filters.py +6 -3
  655. nautobot/users/urls.py +8 -0
  656. nautobot/virtualization/__init__.py +0 -1
  657. nautobot/virtualization/apps.py +1 -0
  658. nautobot/virtualization/filters.py +6 -1
  659. nautobot/virtualization/forms.py +11 -3
  660. nautobot/virtualization/graphql/types.py +2 -2
  661. nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
  662. nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
  663. nautobot/virtualization/tables.py +15 -5
  664. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
  665. nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
  666. nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
  667. nautobot/virtualization/tests/test_api.py +9 -4
  668. nautobot/virtualization/tests/test_filters.py +22 -0
  669. nautobot/virtualization/tests/test_models.py +7 -3
  670. nautobot/virtualization/tests/test_views.py +19 -3
  671. nautobot/virtualization/urls.py +2 -2
  672. nautobot/virtualization/views.py +10 -32
  673. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/METADATA +21 -19
  674. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/RECORD +679 -559
  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.0b1.dist-info}/LICENSE.txt +0 -0
  695. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/NOTICE +0 -0
  696. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/WHEEL +0 -0
  697. {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/entry_points.txt +0 -0
@@ -2,6 +2,7 @@ import hashlib
2
2
  import json
3
3
  import os
4
4
 
5
+ from django.contrib.contenttypes.models import ContentType
5
6
  from django.core.management import call_command
6
7
  from django.core.management.base import BaseCommand, CommandError
7
8
  from django.core.serializers.json import DjangoJSONEncoder
@@ -68,30 +69,56 @@ class Command(BaseCommand):
68
69
  ProviderFactory,
69
70
  ProviderNetworkFactory,
70
71
  )
72
+ from nautobot.cloud.factory import (
73
+ CloudAccountFactory,
74
+ CloudNetworkFactory,
75
+ CloudResourceTypeFactory,
76
+ CloudServiceFactory,
77
+ )
71
78
  from nautobot.dcim.factory import (
79
+ ConsolePortTemplateFactory,
80
+ ConsoleServerPortTemplateFactory,
72
81
  ControllerFactory,
73
82
  ControllerManagedDeviceGroupFactory,
74
83
  DeviceFactory,
75
84
  DeviceFamilyFactory,
76
85
  DeviceRedundancyGroupFactory,
77
86
  DeviceTypeFactory,
87
+ FrontPortTemplateFactory,
88
+ InterfaceTemplateFactory,
78
89
  LocationFactory,
79
90
  LocationTypeFactory,
80
91
  ManufacturerFactory,
92
+ ModuleBayTemplateFactory,
93
+ ModuleFactory,
94
+ ModuleTypeFactory,
81
95
  PlatformFactory,
96
+ PowerOutletTemplateFactory,
97
+ PowerPortTemplateFactory,
98
+ RearPortTemplateFactory,
82
99
  SoftwareImageFileFactory,
83
100
  SoftwareVersionFactory,
84
101
  )
102
+ from nautobot.extras.choices import MetadataTypeDataTypeChoices
85
103
  from nautobot.extras.factory import (
86
104
  ContactFactory,
105
+ DynamicGroupFactory,
87
106
  ExternalIntegrationFactory,
107
+ JobLogEntryFactory,
108
+ JobResultFactory,
109
+ MetadataChoiceFactory,
110
+ MetadataTypeFactory,
111
+ ObjectChangeFactory,
112
+ ObjectMetadataFactory,
88
113
  RoleFactory,
114
+ SavedViewFactory,
89
115
  StatusFactory,
90
116
  TagFactory,
91
117
  TeamFactory,
92
118
  )
93
119
  from nautobot.extras.management import populate_role_choices, populate_status_choices
94
- from nautobot.extras.utils import TaggableClassesQuery
120
+ from nautobot.extras.models import MetadataType
121
+ from nautobot.extras.utils import FeatureQuery, TaggableClassesQuery
95
122
  from nautobot.ipam.choices import PrefixTypeChoices
96
123
  from nautobot.ipam.factory import (
97
124
  NamespaceFactory,
@@ -103,6 +130,7 @@ class Command(BaseCommand):
103
130
  VRFFactory,
104
131
  )
105
132
  from nautobot.tenancy.factory import TenantFactory, TenantGroupFactory
133
+ from nautobot.users.factory import UserFactory
106
134
  except ImportError as err:
107
135
  raise CommandError('Unable to load data factories. Is the "factory-boy" package installed?') from err
108
136
 
@@ -133,6 +161,8 @@ class Command(BaseCommand):
133
161
  )
134
162
  # ...and some tags that apply to a random subset of content-types
135
163
  _create_batch(TagFactory, 15, description="on some content-types")
164
+ _create_batch(UserFactory, 5)
165
+ _create_batch(SavedViewFactory, 20)
136
166
  _create_batch(ContactFactory, 20)
137
167
  _create_batch(TeamFactory, 20)
138
168
  _create_batch(TenantGroupFactory, 10, description="without parents", has_parent=False)
@@ -176,11 +206,25 @@ class Command(BaseCommand):
176
206
  _create_batch(SoftwareImageFileFactory, 25, description="to be usable by DeviceTypes")
177
207
  _create_batch(ManufacturerFactory, 4, description="without Platforms") # 4 more hard-coded Manufacturers
178
208
  _create_batch(DeviceTypeFactory, 30)
209
+ _create_batch(ModuleTypeFactory, 20)
210
+ _create_batch(ConsolePortTemplateFactory, 30)
211
+ _create_batch(ConsoleServerPortTemplateFactory, 30)
212
+ _create_batch(RearPortTemplateFactory, 30)
213
+ _create_batch(FrontPortTemplateFactory, 30)
214
+ _create_batch(InterfaceTemplateFactory, 30)
215
+ _create_batch(PowerPortTemplateFactory, 30)
216
+ _create_batch(PowerOutletTemplateFactory, 30)
217
+ _create_batch(ModuleBayTemplateFactory, 90)
179
218
  _create_batch(ManufacturerFactory, 2, description="without Platforms or DeviceTypes") # Last 2 hard-coded
180
219
  _create_batch(DeviceRedundancyGroupFactory, 20)
181
220
  _create_batch(DeviceFactory, 20)
221
+ _create_batch(ModuleFactory, 20)
182
222
  _create_batch(SoftwareVersionFactory, 5, description="without Devices")
183
223
  _create_batch(SoftwareImageFileFactory, 5, description="without DeviceTypes")
224
+ _create_batch(CloudAccountFactory, 10)
225
+ _create_batch(CloudResourceTypeFactory, 20)
226
+ _create_batch(CloudNetworkFactory, 20)
227
+ _create_batch(CloudServiceFactory, 20)
184
228
  _create_batch(CircuitTypeFactory, 40)
185
229
  _create_batch(ProviderFactory, 20, description="to be usable by Circuits")
186
230
  _create_batch(ProviderNetworkFactory, 20)
@@ -207,6 +251,38 @@ class Command(BaseCommand):
207
251
  has_location=False,
208
252
  term_side="Z",
209
253
  )
254
+ _create_batch(
255
+ CircuitTerminationFactory,
256
+ 2,
257
+ description="with a cloud network, for side A",
258
+ has_location=False,
259
+ has_cloud_network=True,
260
+ term_side="A",
261
+ )
262
+ _create_batch(
263
+ CircuitTerminationFactory,
264
+ 2,
265
+ description="with a cloud network, for side Z",
266
+ has_location=False,
267
+ has_cloud_network=True,
268
+ term_side="Z",
269
+ )
270
+ _create_batch(
271
+ CircuitTerminationFactory,
272
+ 2,
273
+ description="with a provider network, for side A",
274
+ has_location=False,
275
+ has_cloud_network=False,
276
+ term_side="A",
277
+ )
278
+ _create_batch(
279
+ CircuitTerminationFactory,
280
+ 2,
281
+ description="with a provider network, for side Z",
282
+ has_location=False,
283
+ has_cloud_network=False,
284
+ term_side="Z",
285
+ )
210
286
  _create_batch(
211
287
  CircuitTerminationFactory,
212
288
  2,
@@ -239,6 +315,37 @@ class Command(BaseCommand):
239
315
  # _create_batch(ClusterFactory, 10)
240
316
  # _create_batch(VirtualMachineFactory, 10)
241
317
  # We need to remove them from there and enable them here instead, but that will require many test updates.
318
+ _create_batch(DynamicGroupFactory, 20, description="and StaticGroupAssociations")
319
+ _create_batch(
320
+ MetadataTypeFactory,
321
+ len(MetadataTypeDataTypeChoices.CHOICES),
322
+ description="on all content-types",
323
+ content_types=ContentType.objects.filter(FeatureQuery("metadata").get_query()),
324
+ )
325
+ _create_batch(
326
+ MetadataTypeFactory,
327
+ 2 * len(MetadataTypeDataTypeChoices.CHOICES),
328
+ description="on various content-types",
329
+ )
330
+ _create_batch(MetadataChoiceFactory, 100)
331
+ _create_batch(ObjectChangeFactory, 100)
332
+ _create_batch(ObjectMetadataFactory, 100)
333
+ _create_batch(
334
+ ObjectMetadataFactory,
335
+ 20,
336
+ metadata_type=MetadataType.objects.filter(data_type=MetadataTypeDataTypeChoices.TYPE_CONTACT_TEAM).first(),
337
+ has_contact=True,
338
+ description="with contacts",
339
+ )
340
+ _create_batch(
341
+ ObjectMetadataFactory,
342
+ 20,
343
+ metadata_type=MetadataType.objects.filter(data_type=MetadataTypeDataTypeChoices.TYPE_CONTACT_TEAM).first(),
344
+ has_contact=False,
345
+ description="with teams",
346
+ )
347
+ _create_batch(JobResultFactory, 20)
348
+ _create_batch(JobLogEntryFactory, 100)
242
349
 
243
350
  def handle(self, *args, **options):
244
351
  if options["flush"]:
@@ -259,7 +366,13 @@ Type 'yes' to continue, or 'no' to cancel: """
259
366
  self.stdout.write(
260
367
  self.style.WARNING(f'Flushing all existing data from the database "{options["database"]}"...')
261
368
  )
262
- call_command("flush", "--no-input", "--database", options["database"])
369
+
370
+ # If we already have a fixture file to use, suppress the "post_migrate" signal that "flush" would normally
371
+ # trigger, as that would lead to creation of Job records (etc.) that WILL conflict with the fixture data.
372
+ inhibit_post_migrate = options["cache_test_fixtures"] and os.path.exists(options["fixture_file"])
373
+ call_command(
374
+ "flush", "--no-input", "--database", options["database"], inhibit_post_migrate=inhibit_post_migrate
375
+ )
263
376
 
264
377
  if options["cache_test_fixtures"] and os.path.exists(options["fixture_file"]):
265
378
  self.stdout.write(self.style.WARNING(f"Loading factory data from file {options['fixture_file']}"))
@@ -277,7 +390,7 @@ Type 'yes' to continue, or 'no' to cancel: """
277
390
  "dumpdata",
278
391
  indent=2,
279
392
  format="json",
280
- exclude=["auth.permission", "extras.job", "extras.customfield"],
393
+ exclude=["auth.permission"],
281
394
  output=options["fixture_file"],
282
395
  )
283
396
 
@@ -19,6 +19,7 @@ __all__ = (
19
19
  "BaseManager",
20
20
  "BaseModel",
21
21
  "CompositeKeyQuerySetMixin",
22
+ "ContentTypeRelatedQuerySet",
22
23
  "RestrictedQuerySet",
23
24
  "construct_composite_key",
24
25
  "construct_natural_slug",
@@ -46,16 +47,19 @@ class BaseModel(models.Model):
46
47
 
47
48
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, unique=True, editable=False)
48
49
 
49
- # Reverse relation so that deleting a BaseModel automatically deletes any ContactAssociations related to it.
50
- associated_contacts = GenericRelation(
51
- "extras.ContactAssociation",
52
- content_type_field="associated_object_type",
53
- object_id_field="associated_object_id",
54
- related_query_name="associated_contacts_%(app_label)s_%(class)s", # e.g. 'associated_contacts_dcim_device'
55
- )
56
-
57
50
  objects = BaseManager.from_queryset(RestrictedQuerySet)()
58
- is_contact_associable_model = True
51
+ is_contact_associable_model = False # ContactMixin overrides this to default True
52
+ is_dynamic_group_associable_model = False # DynamicGroupMixin overrides this to default True
53
+ is_metadata_associable_model = True
54
+ is_saved_view_model = False # SavedViewMixin overrides this to default True
55
+ is_cloud_resource_type_model = False # CloudResourceTypeMixin overrides this to default True
56
+
57
+ associated_object_metadatas = GenericRelation(
58
+ "extras.ObjectMetadata",
59
+ content_type_field="assigned_object_type",
60
+ object_id_field="assigned_object_id",
61
+ related_query_name="associated_object_metadatas_%(app_label)s_%(class)s", # e.g. 'associated_object_metadatas_dcim_device'
62
+ )
59
63
 
60
64
  class Meta:
61
65
  abstract = True
@@ -295,3 +299,24 @@ class BaseModel(models.Model):
295
299
  f"expected no more than {len(natural_key_field_lookups)} but got {len(args)}."
296
300
  )
297
301
  return dict(zip(natural_key_field_lookups, args))
302
+
303
+
304
+ class ContentTypeRelatedQuerySet(RestrictedQuerySet):
305
+ def get_for_model(self, model):
306
+ """
307
+ Return all `self.model` instances assigned to the given model.
308
+ """
309
+ content_type = ContentType.objects.get_for_model(model._meta.concrete_model)
310
+ return self.filter(content_types=content_type)
311
+
312
+ # TODO(timizuo): Merge into get_for_model; Cant do this now cause it would require alot
313
+ # of refactoring
314
+ def get_for_models(self, models_):
315
+ """
316
+ Return all `self.model` instances assigned to the given `_models`.
317
+ """
318
+ q = models.Q()
319
+ for model in models_:
320
+ q |= models.Q(app_label=model._meta.app_label, model=model._meta.model_name)
321
+ content_types = ContentType.objects.filter(q)
322
+ return self.filter(content_types__in=content_types)
@@ -4,14 +4,21 @@ from nautobot.core.models import BaseModel
4
4
  from nautobot.core.models.fields import TagsField
5
5
  from nautobot.extras.models.change_logging import ChangeLoggedModel
6
6
  from nautobot.extras.models.customfields import CustomFieldModel
7
- from nautobot.extras.models.mixins import DynamicGroupMixin, NotesMixin
7
+ from nautobot.extras.models.mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin, SavedViewMixin
8
8
  from nautobot.extras.models.relationships import RelationshipModel
9
9
 
10
10
  logger = logging.getLogger(__name__)
11
11
 
12
12
 
13
13
  class OrganizationalModel(
14
- BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, DynamicGroupMixin, NotesMixin
14
+ ChangeLoggedModel,
15
+ ContactMixin,
16
+ CustomFieldModel,
17
+ DynamicGroupsModelMixin,
18
+ NotesMixin,
19
+ RelationshipModel,
20
+ SavedViewMixin,
21
+ BaseModel,
15
22
  ):
16
23
  """
17
24
  Base abstract model for all organizational models.
@@ -27,7 +34,16 @@ class OrganizationalModel(
27
34
  abstract = True
28
35
 
29
36
 
30
- class PrimaryModel(BaseModel, ChangeLoggedModel, CustomFieldModel, RelationshipModel, DynamicGroupMixin, NotesMixin):
37
+ class PrimaryModel(
38
+ ChangeLoggedModel,
39
+ ContactMixin,
40
+ CustomFieldModel,
41
+ DynamicGroupsModelMixin,
42
+ NotesMixin,
43
+ RelationshipModel,
44
+ SavedViewMixin,
45
+ BaseModel,
46
+ ):
31
47
  """
32
48
  Base abstract model for all primary models.
33
49
 
@@ -1,50 +1,29 @@
1
1
  from django.contrib.contenttypes.models import ContentType
2
2
  from django.db import models
3
- from django.db.models import Q
4
3
 
5
4
  from nautobot.core.choices import ColorChoices
6
5
  from nautobot.core.constants import CHARFIELD_MAX_LENGTH
7
- from nautobot.core.models import BaseManager, BaseModel
6
+ from nautobot.core.models import BaseManager, BaseModel, ContentTypeRelatedQuerySet
8
7
  from nautobot.core.models.fields import ColorField
9
- from nautobot.core.models.querysets import RestrictedQuerySet
10
8
  from nautobot.extras.models.change_logging import ChangeLoggedModel
11
9
 
12
10
  # Importing CustomFieldModel, ChangeLoggedModel, RelationshipModel from nautobot.extras.models
13
11
  # caused circular import error
14
12
  from nautobot.extras.models.customfields import CustomFieldModel
15
- from nautobot.extras.models.mixins import DynamicGroupMixin, NotesMixin
13
+ from nautobot.extras.models.mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin, SavedViewMixin
16
14
  from nautobot.extras.models.relationships import RelationshipModel
17
15
 
18
16
 
19
- class ContentTypeRelatedQuerySet(RestrictedQuerySet):
20
- def get_for_model(self, model):
21
- """
22
- Return all `self.model` instances assigned to the given model.
23
- """
24
- content_type = ContentType.objects.get_for_model(model._meta.concrete_model)
25
- return self.filter(content_types=content_type)
26
-
27
- # TODO(timizuo): Merge into get_for_model; Cant do this now cause it would require alot
28
- # of refactoring
29
- def get_for_models(self, models_):
30
- """
31
- Return all `self.model` instances assigned to the given `_models`.
32
- """
33
- q = Q()
34
- for model in models_:
35
- q |= Q(app_label=model._meta.app_label, model=model._meta.model_name)
36
- content_types = ContentType.objects.filter(q)
37
- return self.filter(content_types__in=content_types)
38
-
39
-
40
17
  # TODO(timizuo): Inheriting from OrganizationalModel here causes partial import error
41
18
  class NameColorContentTypesModel(
42
- BaseModel,
43
19
  ChangeLoggedModel,
20
+ ContactMixin,
44
21
  CustomFieldModel,
45
- RelationshipModel,
22
+ DynamicGroupsModelMixin,
46
23
  NotesMixin,
47
- DynamicGroupMixin,
24
+ RelationshipModel,
25
+ SavedViewMixin,
26
+ BaseModel,
48
27
  ):
49
28
  """
50
29
  This abstract base properties model contains fields and functionality that are
@@ -6,7 +6,7 @@ from nautobot.core.utils import permissions
6
6
  from nautobot.core.utils.data import merge_dicts_without_collision
7
7
 
8
8
 
9
- def count_related(model, field, *, filter_dict=None, distinct=False):
9
+ def count_related(model, field, *, filter_dict=None, manager_name="objects", distinct=False):
10
10
  """
11
11
  Return a Subquery suitable for annotating a child object count.
12
12
 
@@ -14,13 +14,14 @@ def count_related(model, field, *, filter_dict=None, distinct=False):
14
14
  model (Model): The related model to aggregate
15
15
  field (str): The field on the related model which points back to the OuterRef model
16
16
  filter_dict (dict): Optional dict of filter key/value pairs to limit the Subquery
17
+ manager_name (str): Name of the manager on the model to use
17
18
  """
18
19
  filters = {field: OuterRef("pk")}
19
20
  if filter_dict:
20
21
  filters.update(filter_dict)
21
22
 
22
- manager = model.objects
23
- if hasattr(model.objects, "without_tree_fields"):
23
+ manager = getattr(model, manager_name)
24
+ if hasattr(manager, "without_tree_fields"):
24
25
  manager = manager.without_tree_fields()
25
26
  qs = manager.filter(**filters).order_by().values(field)
26
27
  if distinct:
@@ -65,7 +65,7 @@ class TreeManager(TreeManager_, BaseManager.from_queryset(TreeQuerySet)):
65
65
  Extend django-tree-queries' TreeManager to incorporate RestrictedQuerySet.
66
66
  """
67
67
 
68
- _with_tree_fields = True
68
+ _with_tree_fields = False
69
69
  use_in_migrations = True
70
70
 
71
71
  @property
@@ -150,29 +150,45 @@ def serialize_object_v2(obj):
150
150
  return data
151
151
 
152
152
 
153
- def find_models_with_matching_fields(app_models, field_names, field_attributes=None):
153
+ def find_models_with_matching_fields(app_models, field_names=None, field_attributes=None, additional_constraints=None):
154
154
  """
155
- Find all models that have fields with the specified names, and return them grouped by app.
155
+ Find all models that have fields with the specified names and satisfy the additional constraints,
156
+ and return them grouped by app.
156
157
 
157
158
  Args:
158
159
  app_models (list[BaseModel]): A list of model classes to search through.
159
160
  field_names (list[str]): A list of names of fields that must be present in order for the model to be considered
160
161
  field_attributes (dict): Optional dictionary of attributes to filter the fields by.
162
+ additional_constraints (dict): Optional dictionary of `{field: value}` to further filter the models by.
161
163
 
162
164
  Return:
163
165
  (dict): A dictionary where the keys are app labels and the values are sets of model names.
164
166
  """
165
167
  registry_items = {}
168
+ field_names = field_names or []
166
169
  field_attributes = field_attributes or {}
170
+ additional_constraints = additional_constraints or {}
167
171
  for model_class in app_models:
168
172
  app_label, model_name = model_class._meta.label_lower.split(".")
173
+ valid_model = True
169
174
  for field_name in field_names:
170
175
  try:
171
176
  field = model_class._meta.get_field(field_name)
172
- if all((getattr(field, item, None) == value for item, value in field_attributes.items())):
173
- registry_items.setdefault(app_label, set()).add(model_name)
177
+ if not all((getattr(field, item, None) == value for item, value in field_attributes.items())):
178
+ valid_model = False
179
+ break
174
180
  except FieldDoesNotExist:
175
- pass
181
+ valid_model = False
182
+ break
183
+ if valid_model:
184
+ if not all(
185
+ getattr(model_class, additional_field, None) == additional_value
186
+ for additional_field, additional_value in additional_constraints.items()
187
+ ):
188
+ valid_model = False
189
+ if valid_model:
190
+ registry_items.setdefault(app_label, set()).add(model_name)
191
+
176
192
  registry_items = {key: sorted(value) for key, value in registry_items.items()}
177
193
  return registry_items
178
194
 
nautobot/core/settings.py CHANGED
@@ -96,13 +96,6 @@ if "NAUTOBOT_DEPLOYMENT_ID" in os.environ and os.environ["NAUTOBOT_DEPLOYMENT_ID
96
96
  if "NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY" in os.environ and os.environ["NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY"] != "":
97
97
  DEVICE_NAME_AS_NATURAL_KEY = is_truthy(os.environ["NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY"])
98
98
 
99
- # The number of seconds to cache the member list of dynamic groups. Set this to `0` to disable caching.
100
- if (
101
- "NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT" in os.environ
102
- and os.environ["NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"] != ""
103
- ):
104
- DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT = int(os.environ["NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"])
105
-
106
99
  # Exclude potentially sensitive models from wildcard view exemption. These may still be exempted
107
100
  # by specifying the model individually in the EXEMPT_VIEW_PERMISSIONS configuration parameter.
108
101
  EXEMPT_EXCLUDE_MODELS = (
@@ -517,6 +510,7 @@ INSTALLED_APPS = [
517
510
  "rest_framework", # Must be after `nautobot.core` for template overrides
518
511
  "db_file_storage",
519
512
  "nautobot.circuits",
513
+ "nautobot.cloud",
520
514
  "nautobot.dcim",
521
515
  "nautobot.ipam",
522
516
  "nautobot.extras",
@@ -533,7 +527,6 @@ INSTALLED_APPS = [
533
527
  # "health_check.contrib.migrations",
534
528
  # "health_check.contrib.redis",
535
529
  "django_extensions",
536
- "constance.backends.database",
537
530
  "django_ajax_tables",
538
531
  "silk",
539
532
  ]
@@ -714,14 +707,6 @@ CONSTANCE_CONFIG = {
714
707
  "Used for sending anonymous installation metrics, when settings.INSTALLATION_METRICS_ENABLED is set to True.",
715
708
  field_type=str,
716
709
  ),
717
- "DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT": ConstanceConfigItem(
718
- default=0,
719
- help_text="Dynamic Group member cache timeout in seconds. This is the amount of time that a Dynamic Group's member list "
720
- "will be cached in Django cache backend. Since retrieving the member list of a Dynamic Group can be a very "
721
- "expensive operation, especially in reverse, this cache is used to speed up the process of retrieving the "
722
- "member list. This cache is invalidated when a Dynamic Group is saved. Set to 0 to disable caching.",
723
- field_type=int,
724
- ),
725
710
  "JOB_CREATE_FILE_MAX_SIZE": ConstanceConfigItem(
726
711
  default=10 << 20,
727
712
  help_text=mark_safe( # noqa: S308 # suspicious-mark-safe-usage, but this is a static string so it's safe
@@ -815,7 +800,7 @@ CONSTANCE_CONFIG_FIELDSETS = {
815
800
  "Installation Metrics": ["DEPLOYMENT_ID"],
816
801
  "Natural Keys": ["DEVICE_NAME_AS_NATURAL_KEY", "LOCATION_NAME_AS_NATURAL_KEY"],
817
802
  "Pagination": ["PAGINATE_COUNT", "MAX_PAGE_SIZE", "PER_PAGE_DEFAULTS"],
818
- "Performance": ["DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT", "JOB_CREATE_FILE_MAX_SIZE"],
803
+ "Performance": ["JOB_CREATE_FILE_MAX_SIZE"],
819
804
  "Rack Elevation Rendering": [
820
805
  "RACK_ELEVATION_DEFAULT_UNIT_HEIGHT",
821
806
  "RACK_ELEVATION_DEFAULT_UNIT_WIDTH",
@@ -907,24 +892,13 @@ CELERY_TASK_TRACK_STARTED = True
907
892
  # If enabled, a `task-sent` event will be sent for every task so tasks can be tracked before they're consumed by a worker.
908
893
  CELERY_TASK_SEND_SENT_EVENT = True
909
894
 
910
- # How many tasks a worker is allowed to reserve for its own consumption and execution.
911
- # If set to zero (not recommended) a single worker can reserve all tasks even if other workers are free.
912
- # For short running tasks (such as webhooks) you may want to set this to a larger number to increase throughput.
913
- # Conversely, for long running tasks (such as SSoT or Golden-Config Jobs at scale) you may want to set this to 1
914
- # so that a worker executing a long-running task will not prefetch other tasks, which would block their execution
915
- # until the long-running task completes.
916
- # https://docs.celeryq.dev/en/stable/userguide/optimizing.html#prefetch-limits
917
- CELERY_WORKER_PREFETCH_MULTIPLIER = int(os.getenv("NAUTOBOT_CELERY_WORKER_PREFETCH_MULTIPLIER", "4"))
918
-
919
895
  # If enabled stdout and stderr of running jobs will be redirected to the task logger.
920
896
  CELERY_WORKER_REDIRECT_STDOUTS = is_truthy(os.getenv("NAUTOBOT_CELERY_WORKER_REDIRECT_STDOUTS", "True"))
921
897
 
922
- # The log level of log messages generated by redirected job stdout and stderr.
923
- # Can be one of `DEBUG`, `INFO`, `WARNING`, `ERROR`, or `CRITICAL`.
898
+ # The log level of log messages generated by redirected job stdout and stderr. Can be one of `DEBUG`, `INFO`, `WARNING`, `ERROR`, or `CRITICAL`.
924
899
  CELERY_WORKER_REDIRECT_STDOUTS_LEVEL = os.getenv("NAUTOBOT_CELERY_WORKER_REDIRECT_STDOUTS_LEVEL", "WARNING")
925
900
 
926
- # Send task-related events so that tasks can be monitored using tools like flower.
927
- # Sets the default value for the workers -E argument.
901
+ # Send task-related events so that tasks can be monitored using tools like flower. Sets the default value for the workers -E argument.
928
902
  CELERY_WORKER_SEND_TASK_EVENTS = True
929
903
 
930
904
  # Default celery queue name that will be used by workers and tasks if no queue is specified
@@ -426,20 +426,6 @@ properties:
426
426
  see_also:
427
427
  "`CELERY_TASK_SOFT_TIME_LIMIT`": "#celery_task_soft_time_limit"
428
428
  type: "integer"
429
- CELERY_WORKER_PREFETCH_MULTIPLIER:
430
- default: 4
431
- description: "How many tasks a worker is allowed to reserve for its own consumption and execution."
432
- details: >-
433
- If set to `0` (not recommended) a single worker can reserve all tasks even if other workers are free.
434
- For short running tasks (such as webhooks) you may want to set this to a larger number to increase throughput.
435
- Conversely, for long-running tasks (such as SSoT or Golden-Config Jobs at scale) you may want to set this to `1`
436
- so that a worker executing a long-running task will not prefetch other tasks, which would block their execution
437
- until the long-running task completes.
438
- environment_variable: "NAUTOBOT_CELERY_WORKER_PREFETCH_MULTIPLIER"
439
- see_also:
440
- "Celery documentation": "https://docs.celeryq.dev/en/stable/userguide/optimizing.html#prefetch-limits"
441
- type: "integer"
442
- version_added: "2.2.9"
443
429
  CELERY_WORKER_PROMETHEUS_PORTS:
444
430
  default: []
445
431
  description: "Ports for Prometheus metric HTTP server running on the celery worker(s)."
@@ -481,6 +467,12 @@ properties:
481
467
  !!! warning
482
468
  If enabling indefinite changelog retention, it is recommended to periodically delete old entries.
483
469
  Otherwise, the database may eventually exceed capacity.
470
+
471
+ +/- 2.2.0
472
+ As of Nautobot 2.2.0, changelog cleanup does not run automatically. Use the `Cleanup of ObjectChange records`
473
+ system Job to handle changelog cleanup; you may schedule this to run automatically like any other Job if
474
+ desired. The `CHANGELOG_RETENTION` setting provides a default age cutoff for the Job but may be overridden
475
+ at runtime if desired.
484
476
  environment_variable: "NAUTOBOT_CHANGELOG_RETENTION"
485
477
  is_constance_config: true
486
478
  type: "integer"
@@ -732,19 +724,6 @@ properties:
732
724
  is_constance_config: true
733
725
  type: "boolean"
734
726
  version_added: "2.0.0"
735
- DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT:
736
- default: 0
737
- description: >-
738
- The number of seconds to cache the member list of dynamic groups. Set this to `0` to disable caching.
739
- details: >-
740
- With large datasets (those in scope of a Dynamic Group and number of Dynamic Groups themselves),
741
- users will encounter a performance penalty using or accessing the membership lists.
742
- This setting allows users to accept a cached list for common use cases (particularly in the UI)
743
- that expires after the configured time."
744
- environment_variable: "NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"
745
- is_constance_config: true
746
- type: "integer"
747
- version_added: "1.6.0"
748
727
  EXEMPT_VIEW_PERMISSIONS:
749
728
  default: []
750
729
  description: "A list of Nautobot models to exempt from the enforcement of view permissions."
@@ -1120,6 +1099,34 @@ properties:
1120
1099
  * `nautobot.core.graphql.*` - [GraphQL](../../platform-functionality/graphql.md) initialization and operation.
1121
1100
  * `nautobot.extras.plugins.*` - App loading and activity
1122
1101
  * `nautobot.core.views.generic.*` - Generic views which handle business logic for the web UI
1102
+
1103
+ #### Structlog Configuration
1104
+
1105
+ As of Nautobot 2.3, [django-structlog](https://django-structlog.readthedocs.io/en/latest/) is added as a core dependency. To use structlog, you can add the following code to your `nautobot_config.py` file:
1106
+
1107
+ ```python
1108
+ from nautobot.core.settings_funcs import setup_structlog_logging
1109
+
1110
+ setup_structlog_logging(
1111
+ LOGGING,
1112
+ INSTALLED_APPS,
1113
+ MIDDLEWARE,
1114
+ log_level="DEBUG" if DEBUG else "INFO",
1115
+ root_level="INFO",
1116
+ plain_format=bool(DEBUG), # Set to True to use human-readable structlog format over JSON
1117
+ debug_db=False, # Set to True to log all database queries
1118
+ )
1119
+ ```
1120
+
1121
+ Calling this function disables logging if running tests, otherwise:
1122
+
1123
+ * Overwrites all `formatters` and `handlers` to avoid logging duplication.
1124
+ It's possible to add custom `formatters` and `handlers` after calling this function.
1125
+ * Updates all `loggers` to use structlog with the specified `log_level`.
1126
+ * Adds or updates the root logger to use structlog with the specified `root_level`.
1127
+ * Uses a human-readable structlog format if `plain_format` is True, otherwise uses JSON.
1128
+ * Adds database query logging if `debug_db` is True.
1129
+ * Adds necessary Django apps and middleware for structlog.
1123
1130
  properties:
1124
1131
  additionalProperties: true
1125
1132
  disable_existing_loggers: