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
@@ -16,6 +16,7 @@ from rest_framework.response import Response
16
16
  from rest_framework.viewsets import GenericViewSet, ViewSet
17
17
 
18
18
  from nautobot.circuits.models import Circuit
19
+ from nautobot.cloud.models import CloudAccount
19
20
  from nautobot.core.api.exceptions import ServiceUnavailable
20
21
  from nautobot.core.api.utils import get_serializer_for_model
21
22
  from nautobot.core.api.views import ModelViewSet
@@ -47,6 +48,10 @@ from nautobot.dcim.models import (
47
48
  Location,
48
49
  LocationType,
49
50
  Manufacturer,
51
+ Module,
52
+ ModuleBay,
53
+ ModuleBayTemplate,
54
+ ModuleType,
50
55
  Platform,
51
56
  PowerFeed,
52
57
  PowerOutlet,
@@ -258,6 +263,7 @@ class RackReservationViewSet(NautobotModelViewSet):
258
263
 
259
264
  class ManufacturerViewSet(NautobotModelViewSet):
260
265
  queryset = Manufacturer.objects.annotate(
266
+ cloud_account_count=count_related(CloudAccount, "provider"),
261
267
  device_type_count=count_related(DeviceType, "manufacturer"),
262
268
  inventory_item_count=count_related(InventoryItem, "manufacturer"),
263
269
  platform_count=count_related(Platform, "manufacturer"),
@@ -300,43 +306,45 @@ class DeviceTypeViewSet(NautobotModelViewSet):
300
306
 
301
307
 
302
308
  class ConsolePortTemplateViewSet(NautobotModelViewSet):
303
- queryset = ConsolePortTemplate.objects.select_related("device_type__manufacturer")
309
+ queryset = ConsolePortTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
304
310
  serializer_class = serializers.ConsolePortTemplateSerializer
305
311
  filterset_class = filters.ConsolePortTemplateFilterSet
306
312
 
307
313
 
308
314
  class ConsoleServerPortTemplateViewSet(NautobotModelViewSet):
309
- queryset = ConsoleServerPortTemplate.objects.select_related("device_type__manufacturer")
315
+ queryset = ConsoleServerPortTemplate.objects.select_related(
316
+ "device_type__manufacturer", "module_type__manufacturer"
317
+ )
310
318
  serializer_class = serializers.ConsoleServerPortTemplateSerializer
311
319
  filterset_class = filters.ConsoleServerPortTemplateFilterSet
312
320
 
313
321
 
314
322
  class PowerPortTemplateViewSet(NautobotModelViewSet):
315
- queryset = PowerPortTemplate.objects.select_related("device_type__manufacturer")
323
+ queryset = PowerPortTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
316
324
  serializer_class = serializers.PowerPortTemplateSerializer
317
325
  filterset_class = filters.PowerPortTemplateFilterSet
318
326
 
319
327
 
320
328
  class PowerOutletTemplateViewSet(NautobotModelViewSet):
321
- queryset = PowerOutletTemplate.objects.select_related("device_type__manufacturer")
329
+ queryset = PowerOutletTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
322
330
  serializer_class = serializers.PowerOutletTemplateSerializer
323
331
  filterset_class = filters.PowerOutletTemplateFilterSet
324
332
 
325
333
 
326
334
  class InterfaceTemplateViewSet(NautobotModelViewSet):
327
- queryset = InterfaceTemplate.objects.select_related("device_type__manufacturer")
335
+ queryset = InterfaceTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
328
336
  serializer_class = serializers.InterfaceTemplateSerializer
329
337
  filterset_class = filters.InterfaceTemplateFilterSet
330
338
 
331
339
 
332
340
  class FrontPortTemplateViewSet(NautobotModelViewSet):
333
- queryset = FrontPortTemplate.objects.select_related("device_type__manufacturer")
341
+ queryset = FrontPortTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
334
342
  serializer_class = serializers.FrontPortTemplateSerializer
335
343
  filterset_class = filters.FrontPortTemplateFilterSet
336
344
 
337
345
 
338
346
  class RearPortTemplateViewSet(NautobotModelViewSet):
339
- queryset = RearPortTemplate.objects.select_related("device_type__manufacturer")
347
+ queryset = RearPortTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
340
348
  serializer_class = serializers.RearPortTemplateSerializer
341
349
  filterset_class = filters.RearPortTemplateFilterSet
342
350
 
@@ -347,6 +355,12 @@ class DeviceBayTemplateViewSet(NautobotModelViewSet):
347
355
  filterset_class = filters.DeviceBayTemplateFilterSet
348
356
 
349
357
 
358
+ class ModuleBayTemplateViewSet(NautobotModelViewSet):
359
+ queryset = ModuleBayTemplate.objects.select_related("device_type__manufacturer", "module_type__manufacturer")
360
+ serializer_class = serializers.ModuleBayTemplateSerializer
361
+ filterset_class = filters.ModuleBayTemplateFilterSet
362
+
363
+
350
364
  #
351
365
  # Platforms
352
366
  #
@@ -619,6 +633,14 @@ class InventoryItemViewSet(NautobotModelViewSet):
619
633
  filterset_class = filters.InventoryItemFilterSet
620
634
 
621
635
 
636
+ class ModuleBayViewSet(NautobotModelViewSet):
637
+ queryset = ModuleBay.objects.select_related(
638
+ "parent_device__tenant", "parent_device__location", "parent_module"
639
+ ).prefetch_related("installed_module", "tags")
640
+ serializer_class = serializers.ModuleBaySerializer
641
+ filterset_class = filters.ModuleBayFilterSet
642
+
643
+
622
644
  #
623
645
  # Connections
624
646
  # TODO: remove these in favor of using the ConsolePort/PowerPort/Interface API endpoints and/or Cable endpoint.
@@ -837,3 +859,27 @@ class ControllerManagedDeviceGroupViewSet(NautobotModelViewSet):
837
859
 
838
860
  serializer_class = serializers.ControllerManagedDeviceGroupSerializer
839
861
  filterset_class = filters.ControllerManagedDeviceGroupFilterSet
862
+
863
+
864
+ #
865
+ # Modules
866
+ #
867
+
868
+
869
+ class ModuleViewSet(NautobotModelViewSet):
870
+ queryset = Module.objects.select_related(
871
+ "parent_module_bay__parent_device__location",
872
+ "parent_module_bay__parent_device__tenant",
873
+ "module_type__manufacturer",
874
+ "tenant",
875
+ "role",
876
+ "location",
877
+ ).prefetch_related("module_bays", "tags")
878
+ serializer_class = serializers.ModuleSerializer
879
+ filterset_class = filters.ModuleFilterSet
880
+
881
+
882
+ class ModuleTypeViewSet(NautobotModelViewSet):
883
+ queryset = ModuleType.objects.select_related("manufacturer").prefetch_related("tags", "modules")
884
+ serializer_class = serializers.ModuleTypeSerializer
885
+ filterset_class = filters.ModuleTypeFilterSet
nautobot/dcim/apps.py CHANGED
@@ -2,6 +2,7 @@ from nautobot.core.apps import NautobotConfig
2
2
 
3
3
 
4
4
  class DCIMConfig(NautobotConfig):
5
+ default = True
5
6
  name = "nautobot.dcim"
6
7
  verbose_name = "DCIM"
7
8
  searchable_models = [
@@ -12,6 +13,8 @@ class DCIMConfig(NautobotConfig):
12
13
  "deviceredundancygroup",
13
14
  "devicetype",
14
15
  "location",
16
+ "module",
17
+ "moduletype",
15
18
  "powerfeed",
16
19
  "rack",
17
20
  "rackgroup",
nautobot/dcim/choices.py CHANGED
@@ -1536,3 +1536,28 @@ class SoftwareVersionStatusChoices(ChoiceSet):
1536
1536
  (STATUS_EXTENDED_SUPPORT, "Extended Support"),
1537
1537
  (STATUS_END_OF_LIFE, "End-of-Life"),
1538
1538
  )
1539
+
1540
+
1541
+ #
1542
+ # Modules
1543
+ #
1544
+
1545
+
1546
+ class ModuleStatusChoices(ChoiceSet):
1547
+ STATUS_OFFLINE = "offline"
1548
+ STATUS_ACTIVE = "active"
1549
+ STATUS_PLANNED = "planned"
1550
+ STATUS_STAGED = "staged"
1551
+ STATUS_FAILED = "failed"
1552
+ STATUS_INVENTORY = "inventory"
1553
+ STATUS_DECOMMISSIONING = "decommissioning"
1554
+
1555
+ CHOICES = (
1556
+ (STATUS_OFFLINE, "Offline"),
1557
+ (STATUS_ACTIVE, "Active"),
1558
+ (STATUS_PLANNED, "Planned"),
1559
+ (STATUS_STAGED, "Staged"),
1560
+ (STATUS_FAILED, "Failed"),
1561
+ (STATUS_INVENTORY, "Inventory"),
1562
+ (STATUS_DECOMMISSIONING, "Decommissioning"),
1563
+ )
@@ -118,3 +118,10 @@ NETUTILS_NETWORK_DRIVER_MAPPING_NAMES = {
118
118
  "pyntc",
119
119
  "scrapli",
120
120
  }
121
+
122
+ #
123
+ # Modules
124
+ #
125
+
126
+ # Limit of 4 allows recursion depth of Device->ModuleBay->Module->ModuleBay->Module->ModuleBay->Module->ModuleBay->Module
127
+ MODULE_RECURSION_DEPTH_LIMIT = 4
nautobot/dcim/factory.py CHANGED
@@ -5,10 +5,11 @@ from django.contrib.contenttypes.models import ContentType
5
5
  from django.db.models import Q
6
6
  import factory
7
7
  from faker import Faker
8
- import pytz
8
+ from timezone_field import TimeZoneFormField
9
9
 
10
10
  from nautobot.circuits.models import CircuitTermination
11
11
  from nautobot.core.factory import (
12
+ BaseModelFactory,
12
13
  get_random_instances,
13
14
  NautobotBoolIterator,
14
15
  OrganizationalModelFactory,
@@ -17,7 +18,12 @@ from nautobot.core.factory import (
17
18
  UniqueFaker,
18
19
  )
19
20
  from nautobot.dcim.choices import (
21
+ ConsolePortTypeChoices,
20
22
  DeviceRedundancyGroupFailoverStrategyChoices,
23
+ InterfaceTypeChoices,
24
+ PortTypeChoices,
25
+ PowerOutletTypeChoices,
26
+ PowerPortTypeChoices,
21
27
  RackDimensionUnitChoices,
22
28
  RackTypeChoices,
23
29
  RackWidthChoices,
@@ -25,20 +31,31 @@ from nautobot.dcim.choices import (
25
31
  SubdeviceRoleChoices,
26
32
  )
27
33
  from nautobot.dcim.models import (
34
+ ConsolePortTemplate,
35
+ ConsoleServerPortTemplate,
28
36
  Controller,
29
37
  ControllerManagedDeviceGroup,
30
38
  Device,
31
39
  DeviceFamily,
32
40
  DeviceRedundancyGroup,
33
41
  DeviceType,
42
+ FrontPortTemplate,
43
+ InterfaceTemplate,
34
44
  Location,
35
45
  LocationType,
36
46
  Manufacturer,
47
+ Module,
48
+ ModuleBay,
49
+ ModuleBayTemplate,
50
+ ModuleType,
37
51
  Platform,
52
+ PowerOutletTemplate,
38
53
  PowerPanel,
54
+ PowerPortTemplate,
39
55
  Rack,
40
56
  RackGroup,
41
57
  RackReservation,
58
+ RearPortTemplate,
42
59
  SoftwareImageFile,
43
60
  SoftwareVersion,
44
61
  )
@@ -93,6 +110,8 @@ NETWORK_DRIVERS = {
93
110
  "Palo Alto": ["paloalto_panos"],
94
111
  }
95
112
 
113
+ TIME_ZONES = {timezone for timezone, _ in TimeZoneFormField().choices}
114
+
96
115
 
97
116
  # Retrieve correct rack reservation units
98
117
  def get_rack_reservation_units(obj):
@@ -122,8 +141,6 @@ class DeviceFactory(PrimaryModelFactory):
122
141
  "has_device_redundancy_group",
123
142
  "has_platform",
124
143
  "has_serial",
125
- "has_software_image_files",
126
- "has_software_version",
127
144
  "has_tenant",
128
145
  )
129
146
 
@@ -140,7 +157,7 @@ class DeviceFactory(PrimaryModelFactory):
140
157
  lambda: Location.objects.filter(location_type__content_types=ContentType.objects.get_for_model(Device)),
141
158
  allow_null=False,
142
159
  )
143
- name = factory.LazyAttributeSequence(lambda o, n: f"{o.device_type.model} Device - {o.location} - {n + 1}")
160
+ name = factory.LazyAttributeSequence(lambda o, n: f"{o.device_type.model}-{n + 1}")
144
161
 
145
162
  has_tenant = NautobotBoolIterator()
146
163
  tenant = factory.Maybe("has_tenant", random_instance(Tenant))
@@ -172,12 +189,7 @@ class DeviceFactory(PrimaryModelFactory):
172
189
  has_comments = NautobotBoolIterator()
173
190
  comments = factory.Maybe("has_comments", factory.Faker("bs"))
174
191
 
175
- has_software_version = NautobotBoolIterator()
176
- software_version = factory.Maybe(
177
- "has_software_version",
178
- factory.LazyAttribute(lambda o: get_random_software_version_for_device_type(o.device_type)),
179
- None,
180
- )
192
+ software_version = factory.LazyAttribute(lambda o: get_random_software_version_for_device_type(o.device_type))
181
193
 
182
194
  @factory.post_generation
183
195
  def software_image_files(self, create, extracted, **kwargs):
@@ -243,6 +255,18 @@ class DeviceFactory(PrimaryModelFactory):
243
255
  # )
244
256
 
245
257
 
258
+ device_types = (
259
+ "Router",
260
+ "Switch",
261
+ "Firewall",
262
+ "Load Balancer",
263
+ "WLAN Controller",
264
+ "Access Point",
265
+ "SAN Fabric",
266
+ "Console Server",
267
+ )
268
+
269
+
246
270
  class DeviceTypeFactory(PrimaryModelFactory):
247
271
  class Meta:
248
272
  model = DeviceType
@@ -250,7 +274,6 @@ class DeviceTypeFactory(PrimaryModelFactory):
250
274
  "has_comments",
251
275
  "has_device_family",
252
276
  "has_part_number",
253
- "has_software_image_files",
254
277
  "is_subdevice_child",
255
278
  )
256
279
 
@@ -259,7 +282,21 @@ class DeviceTypeFactory(PrimaryModelFactory):
259
282
 
260
283
  manufacturer = random_instance(Manufacturer)
261
284
 
262
- model = factory.LazyAttributeSequence(lambda o, n: f"{o.manufacturer.name} DeviceType {n + 1}")
285
+ @factory.lazy_attribute
286
+ def model(self):
287
+ """
288
+ Use a random unused-for-this-manufacturer element from `device_types` if any.
289
+
290
+ If all are already used, append " 2" to all device-type strings and try again, and so forth.
291
+ """
292
+ possible_device_types = set(device_types)
293
+ count = 2
294
+ current_models = set(DeviceType.objects.filter(manufacturer=self.manufacturer).values_list("model", flat=True))
295
+ unused_models = possible_device_types.difference(current_models)
296
+ while not unused_models:
297
+ unused_models = {f"{device_type} {count}" for device_type in device_types}.difference(current_models)
298
+ count += 1
299
+ return factory.random.randgen.choice(list(unused_models))
263
300
 
264
301
  has_part_number = NautobotBoolIterator()
265
302
  part_number = factory.Maybe("has_part_number", factory.Faker("ean", length=8), "")
@@ -280,16 +317,14 @@ class DeviceTypeFactory(PrimaryModelFactory):
280
317
  has_comments = NautobotBoolIterator()
281
318
  comments = factory.Maybe("has_comments", factory.Faker("paragraph"), "")
282
319
 
283
- has_software_image_files = NautobotBoolIterator()
284
-
285
320
  @factory.post_generation
286
321
  def software_image_files(self, create, extracted, **kwargs):
287
- if not create or not DeviceTypeFactory.has_software_image_files.evaluate(None, None, None):
322
+ if not create:
288
323
  return
289
324
  if extracted:
290
325
  self.software_image_files.set(extracted)
291
326
  else:
292
- self.software_image_files.set(get_random_instances(SoftwareImageFile, minimum=1))
327
+ self.software_image_files.set(get_random_instances(SoftwareImageFile))
293
328
 
294
329
 
295
330
  class DeviceRedundancyGroupFactory(PrimaryModelFactory):
@@ -401,6 +436,7 @@ class LocationTypeFactory(OrganizationalModelFactory):
401
436
  def content_types(self, create, extract, **kwargs):
402
437
  """Assign some contenttypes to a location after generation"""
403
438
  if self.name in ["Root", "Campus", "Building"]:
439
+ # All appropriate content-types
404
440
  self.content_types.set(ContentType.objects.filter(FeatureQuery("locations").get_query()))
405
441
  elif self.name in ["Floor"]:
406
442
  self.content_types.set(
@@ -438,6 +474,7 @@ class LocationTypeFactory(OrganizationalModelFactory):
438
474
  ContentType.objects.get_for_model(Controller),
439
475
  ContentType.objects.get_for_model(CircuitTermination),
440
476
  ContentType.objects.get_for_model(Device),
477
+ ContentType.objects.get_for_model(Module),
441
478
  ContentType.objects.get_for_model(PowerPanel),
442
479
  ContentType.objects.get_for_model(Rack),
443
480
  ContentType.objects.get_for_model(RackGroup),
@@ -478,7 +515,7 @@ class LocationFactory(PrimaryModelFactory):
478
515
  facility = factory.Maybe("has_facility", factory.Faker("building_number"), "")
479
516
 
480
517
  has_time_zone = NautobotBoolIterator()
481
- time_zone = factory.Maybe("has_time_zone", factory.Faker("random_element", elements=pytz.common_timezones))
518
+ time_zone = factory.Maybe("has_time_zone", factory.Faker("random_element", elements=TIME_ZONES))
482
519
 
483
520
  has_physical_address = NautobotBoolIterator()
484
521
  physical_address = factory.Maybe("has_physical_address", factory.Faker("address"))
@@ -641,7 +678,7 @@ class SoftwareImageFileFactory(PrimaryModelFactory):
641
678
  allow_null=False,
642
679
  )
643
680
  software_version = random_instance(SoftwareVersion, allow_null=False)
644
- image_file_name = factory.Faker("file_name", extension="bin")
681
+ image_file_name = UniqueFaker("file_name", extension="bin")
645
682
  image_file_checksum = factory.Maybe("has_image_file_checksum", factory.Faker("md5"), "")
646
683
  hashing_algorithm = factory.Maybe(
647
684
  "has_hashing_algorithm",
@@ -711,3 +748,197 @@ class ControllerManagedDeviceGroupFactory(PrimaryModelFactory):
711
748
  lambda o: o.parent.controller if o.parent else factory.random.randgen.choice(Controller.objects.all())
712
749
  )
713
750
  weight = factory.Faker("pyint", min_value=1, max_value=1000)
751
+
752
+
753
+ module_types = (
754
+ "Supervisor",
755
+ "Line Card",
756
+ "Fabric",
757
+ )
758
+
759
+
760
+ class ModuleTypeFactory(PrimaryModelFactory):
761
+ class Meta:
762
+ model = ModuleType
763
+ exclude = ("has_part_number",)
764
+
765
+ manufacturer = random_instance(Manufacturer, allow_null=False)
766
+
767
+ has_part_number = NautobotBoolIterator()
768
+ part_number = factory.Maybe("has_part_number", factory.Faker("ean", length=8), "")
769
+
770
+ @factory.lazy_attribute
771
+ def model(self):
772
+ """
773
+ Use a random unused-for-this-manufacturer element from `module_types` if any.
774
+
775
+ If all are already used, append " 2" to all module-type strings and try again, and so forth.
776
+ """
777
+ possible_module_types = set(module_types)
778
+ count = 2
779
+ current_models = set(ModuleType.objects.filter(manufacturer=self.manufacturer).values_list("model", flat=True))
780
+ unused_models = possible_module_types.difference(current_models)
781
+ while not unused_models:
782
+ unused_models = {f"{module_type} {count}" for module_type in module_types}.difference(current_models)
783
+ count += 1
784
+ return factory.random.randgen.choice(list(unused_models))
785
+
786
+
787
+ class ModuleFactory(PrimaryModelFactory):
788
+ class Meta:
789
+ model = Module
790
+ exclude = (
791
+ "has_asset_tag",
792
+ "has_parent_module_bay",
793
+ "has_role",
794
+ "has_serial",
795
+ "has_tenant",
796
+ )
797
+
798
+ module_type = random_instance(ModuleType, allow_null=False)
799
+ status = random_instance(
800
+ lambda: Status.objects.get_for_model(Module),
801
+ allow_null=False,
802
+ )
803
+ has_parent_module_bay = NautobotBoolIterator()
804
+ parent_module_bay = factory.Maybe(
805
+ "has_parent_module_bay",
806
+ random_instance(lambda: ModuleBay.objects.filter(installed_module__isnull=True), allow_null=False),
807
+ None,
808
+ )
809
+ location = factory.Maybe(
810
+ "has_parent_module_bay",
811
+ None,
812
+ random_instance(
813
+ lambda: Location.objects.filter(location_type__content_types=ContentType.objects.get_for_model(Module)),
814
+ allow_null=False,
815
+ ),
816
+ )
817
+ has_role = NautobotBoolIterator()
818
+ role = factory.Maybe(
819
+ "has_role",
820
+ random_instance(lambda: Role.objects.get_for_model(Module)),
821
+ None,
822
+ )
823
+ has_asset_tag = NautobotBoolIterator()
824
+ asset_tag = factory.Maybe("has_asset_tag", UniqueFaker("uuid4"), None)
825
+ has_serial = NautobotBoolIterator()
826
+ serial = factory.Maybe("has_serial", factory.Faker("ean", length=8), "")
827
+ has_tenant = NautobotBoolIterator()
828
+ tenant = factory.Maybe("has_tenant", random_instance(Tenant, allow_null=False), None)
829
+
830
+
831
+ class DeviceComponentTemplateFactory(BaseModelFactory):
832
+ class Params:
833
+ has_label = NautobotBoolIterator()
834
+ has_description = NautobotBoolIterator()
835
+
836
+ device_type = random_instance(DeviceType.objects.all(), allow_null=False)
837
+ label = factory.Maybe(
838
+ "has_label",
839
+ factory.Faker("word"),
840
+ "",
841
+ )
842
+ description = factory.Maybe(
843
+ "has_description",
844
+ factory.Faker("sentence"),
845
+ "",
846
+ )
847
+
848
+
849
+ class ModularDeviceComponentTemplateFactory(DeviceComponentTemplateFactory):
850
+ class Params:
851
+ has_device_type = NautobotBoolIterator()
852
+
853
+ device_type = factory.Maybe("has_device_type", random_instance(DeviceType, allow_null=False), None)
854
+ module_type = factory.Maybe("has_device_type", None, random_instance(ModuleType, allow_null=False))
855
+
856
+
857
+ class ConsolePortTemplateFactory(ModularDeviceComponentTemplateFactory):
858
+ class Meta:
859
+ model = ConsolePortTemplate
860
+
861
+ type = factory.Faker("random_element", elements=ConsolePortTypeChoices.values())
862
+ name = factory.Sequence(lambda n: f"ConsolePort {n}")
863
+
864
+
865
+ class ConsoleServerPortTemplateFactory(ModularDeviceComponentTemplateFactory):
866
+ class Meta:
867
+ model = ConsoleServerPortTemplate
868
+
869
+ type = factory.Faker("random_element", elements=ConsolePortTypeChoices.values())
870
+ name = factory.Sequence(lambda n: f"ConsoleServerPort {n}")
871
+
872
+
873
+ class PowerPortTemplateFactory(ModularDeviceComponentTemplateFactory):
874
+ class Meta:
875
+ model = PowerPortTemplate
876
+
877
+ type = factory.Faker("random_element", elements=PowerPortTypeChoices.values())
878
+ name = factory.Sequence(lambda n: f"PowerPort {n}")
879
+
880
+
881
+ class PowerOutletTemplateFactory(ModularDeviceComponentTemplateFactory):
882
+ class Meta:
883
+ model = PowerOutletTemplate
884
+
885
+ type = factory.Faker("random_element", elements=PowerOutletTypeChoices.values())
886
+ name = factory.Sequence(lambda n: f"PowerOutlet {n}")
887
+
888
+
889
+ class InterfaceTemplateFactory(ModularDeviceComponentTemplateFactory):
890
+ class Meta:
891
+ model = InterfaceTemplate
892
+
893
+ type = factory.Faker("random_element", elements=InterfaceTypeChoices.values())
894
+ name = factory.Sequence(lambda n: f"Interface {n}")
895
+
896
+
897
+ class FrontPortTemplateFactory(ModularDeviceComponentTemplateFactory):
898
+ class Meta:
899
+ model = FrontPortTemplate
900
+
901
+ device_type = factory.Maybe(
902
+ "has_device_type",
903
+ random_instance(DeviceType.objects.filter(rear_port_templates__isnull=False), allow_null=False),
904
+ None,
905
+ )
906
+ module_type = factory.Maybe(
907
+ "has_device_type",
908
+ None,
909
+ random_instance(ModuleType.objects.filter(rear_port_templates__isnull=False), allow_null=False),
910
+ )
911
+ type = factory.Faker("random_element", elements=PortTypeChoices.values())
912
+ name = factory.Sequence(lambda n: f"FrontPort {n}")
913
+
914
+ @factory.lazy_attribute
915
+ def rear_port_template(self):
916
+ if self.module_type:
917
+ return factory.random.randgen.choice(self.module_type.rear_port_templates.all())
918
+ else:
919
+ return factory.random.randgen.choice(self.device_type.rear_port_templates.all())
920
+
921
+ @factory.lazy_attribute
922
+ def rear_port_position(self):
923
+ return self.rear_port_template.front_port_templates.count() + 1
924
+
925
+
926
+ class RearPortTemplateFactory(ModularDeviceComponentTemplateFactory):
927
+ class Meta:
928
+ model = RearPortTemplate
929
+
930
+ type = factory.Faker("random_element", elements=PortTypeChoices.values())
931
+ name = factory.Sequence(lambda n: f"RearPort {n}")
932
+ positions = factory.Sequence(lambda n: n + 100)
933
+
934
+
935
+ class ModuleBayTemplateFactory(ModularDeviceComponentTemplateFactory):
936
+ class Meta:
937
+ model = ModuleBayTemplate
938
+
939
+ name = factory.Sequence(lambda n: f"ModuleBay {n}")
940
+ position = factory.Maybe(
941
+ "has_device_type",
942
+ factory.LazyAttribute(lambda o: o.device_type.module_bay_templates.count() + 1),
943
+ factory.LazyAttribute(lambda o: o.module_type.module_bay_templates.count() + 1),
944
+ )