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

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

Potentially problematic release.


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

Files changed (697) hide show
  1. nautobot/apps/forms.py +4 -0
  2. nautobot/apps/models.py +10 -1
  3. nautobot/circuits/__init__.py +0 -1
  4. nautobot/circuits/apps.py +1 -0
  5. nautobot/circuits/factory.py +15 -3
  6. nautobot/circuits/filters.py +13 -0
  7. nautobot/circuits/forms.py +13 -0
  8. nautobot/circuits/migrations/0021_alter_circuit_status_alter_circuittermination__path.py +32 -0
  9. nautobot/circuits/migrations/0022_circuittermination_cloud_network.py +25 -0
  10. nautobot/circuits/models.py +16 -3
  11. nautobot/circuits/tables.py +16 -2
  12. nautobot/circuits/templates/circuits/circuittermination_create.html +10 -2
  13. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +6 -0
  14. nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -1
  15. nautobot/circuits/tests/test_api.py +7 -5
  16. nautobot/circuits/tests/test_filters.py +12 -5
  17. nautobot/circuits/tests/test_models.py +33 -2
  18. nautobot/circuits/views.py +2 -3
  19. nautobot/cloud/__init__.py +0 -0
  20. nautobot/cloud/api/__init__.py +0 -0
  21. nautobot/cloud/api/serializers.py +54 -0
  22. nautobot/cloud/api/urls.py +16 -0
  23. nautobot/cloud/api/views.py +48 -0
  24. nautobot/cloud/apps.py +13 -0
  25. nautobot/cloud/factory.py +113 -0
  26. nautobot/cloud/filters.py +187 -0
  27. nautobot/cloud/forms.py +339 -0
  28. nautobot/cloud/homepage.py +43 -0
  29. nautobot/cloud/migrations/0001_initial.py +304 -0
  30. nautobot/cloud/migrations/__init__.py +0 -0
  31. nautobot/cloud/models.py +246 -0
  32. nautobot/cloud/navigation.py +85 -0
  33. nautobot/cloud/tables.py +157 -0
  34. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
  35. nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +122 -0
  36. nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
  37. nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +111 -0
  38. nautobot/cloud/templates/cloud/cloudservice_retrieve.html +69 -0
  39. nautobot/cloud/templates/cloud/cloudservice_update.html +25 -0
  40. nautobot/cloud/tests/__init__.py +0 -0
  41. nautobot/cloud/tests/test_api.py +248 -0
  42. nautobot/cloud/tests/test_filters.py +125 -0
  43. nautobot/cloud/tests/test_models.py +43 -0
  44. nautobot/cloud/tests/test_views.py +153 -0
  45. nautobot/cloud/urls.py +14 -0
  46. nautobot/cloud/views.py +181 -0
  47. nautobot/core/__init__.py +0 -3
  48. nautobot/core/api/metadata.py +1 -0
  49. nautobot/core/api/parsers.py +7 -1
  50. nautobot/core/api/urls.py +1 -0
  51. nautobot/core/api/utils.py +1 -0
  52. nautobot/core/api/views.py +4 -0
  53. nautobot/core/apps/__init__.py +6 -3
  54. nautobot/core/constants.py +8 -0
  55. nautobot/core/factory.py +32 -1
  56. nautobot/core/filters.py +95 -13
  57. nautobot/core/forms/fields.py +10 -4
  58. nautobot/core/forms/forms.py +11 -3
  59. nautobot/core/forms/widgets.py +18 -1
  60. nautobot/core/graphql/schema.py +26 -4
  61. nautobot/core/jobs/__init__.py +16 -2
  62. nautobot/core/jobs/cleanup.py +100 -0
  63. nautobot/core/jobs/groups.py +38 -0
  64. nautobot/core/management/commands/generate_test_data.py +116 -3
  65. nautobot/core/models/__init__.py +34 -9
  66. nautobot/core/models/generics.py +19 -3
  67. nautobot/core/models/name_color_content_types.py +7 -28
  68. nautobot/core/models/querysets.py +4 -3
  69. nautobot/core/models/tree_queries.py +1 -1
  70. nautobot/core/models/utils.py +21 -5
  71. nautobot/core/settings.py +2 -17
  72. nautobot/core/settings.yaml +34 -13
  73. nautobot/core/settings_funcs.py +103 -0
  74. nautobot/core/tables.py +130 -56
  75. nautobot/core/templates/admin/search_form.html +1 -1
  76. nautobot/core/templates/buttons/add.html +11 -3
  77. nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +13 -0
  78. nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +13 -0
  79. nautobot/core/templates/buttons/export.html +101 -53
  80. nautobot/core/templates/buttons/job_import.html +11 -3
  81. nautobot/core/templates/generic/object_bulk_destroy.html +3 -1
  82. nautobot/core/templates/generic/object_bulk_update.html +3 -1
  83. nautobot/core/templates/generic/object_changelog.html +0 -9
  84. nautobot/core/templates/generic/object_list.html +156 -17
  85. nautobot/core/templates/generic/object_retrieve.html +80 -16
  86. nautobot/core/templates/inc/extras_features_edit_form_fields.html +8 -0
  87. nautobot/core/templates/inc/javascript.html +2 -0
  88. nautobot/core/templates/inc/media.html +2 -2
  89. nautobot/core/templates/inc/nav_menu.html +1 -0
  90. nautobot/core/templates/inc/paginator.html +7 -7
  91. nautobot/core/templates/inc/search_panel.html +2 -2
  92. nautobot/core/templates/inc/table.html +2 -2
  93. nautobot/core/templates/nautobot_config.py.j2 +13 -8
  94. nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +37 -0
  95. nautobot/core/templates/utilities/templatetags/filter_form_modal.html +2 -2
  96. nautobot/core/templates/utilities/templatetags/saved_view_modal.html +38 -0
  97. nautobot/core/templates/utilities/theme_preview.html +25 -8
  98. nautobot/core/templates/utilities/worker_status.html +152 -0
  99. nautobot/core/templatetags/buttons.py +335 -38
  100. nautobot/core/templatetags/form_helpers.py +1 -1
  101. nautobot/core/templatetags/helpers.py +181 -11
  102. nautobot/core/testing/api.py +5 -4
  103. nautobot/core/testing/filters.py +63 -14
  104. nautobot/core/testing/mixins.py +46 -0
  105. nautobot/core/testing/models.py +22 -0
  106. nautobot/core/testing/schema.py +4 -8
  107. nautobot/core/testing/views.py +31 -14
  108. nautobot/core/tests/integration/test_import_objects_ui.py +1 -0
  109. nautobot/core/tests/integration/test_swagger.py +1 -1
  110. nautobot/core/tests/nautobot_config.py +0 -1
  111. nautobot/core/tests/runner.py +2 -2
  112. nautobot/core/tests/test_api.py +1 -0
  113. nautobot/core/tests/test_authentication.py +7 -2
  114. nautobot/core/tests/test_filters.py +11 -9
  115. nautobot/core/tests/test_forms.py +9 -0
  116. nautobot/core/tests/test_graphql.py +27 -16
  117. nautobot/core/tests/test_jobs.py +122 -0
  118. nautobot/core/tests/test_tables.py +3 -1
  119. nautobot/core/tests/test_templatetags_helpers.py +12 -5
  120. nautobot/core/tests/test_utils.py +31 -20
  121. nautobot/core/tests/test_views.py +6 -6
  122. nautobot/core/urls.py +8 -3
  123. nautobot/core/utils/deprecation.py +29 -0
  124. nautobot/core/utils/filtering.py +12 -9
  125. nautobot/core/utils/lookup.py +37 -2
  126. nautobot/core/utils/requests.py +4 -1
  127. nautobot/core/views/__init__.py +137 -24
  128. nautobot/core/views/generic.py +119 -67
  129. nautobot/core/views/mixins.py +105 -36
  130. nautobot/core/views/paginator.py +9 -3
  131. nautobot/core/views/renderers.py +121 -56
  132. nautobot/core/views/utils.py +81 -1
  133. nautobot/dcim/__init__.py +0 -1
  134. nautobot/dcim/api/serializers.py +180 -44
  135. nautobot/dcim/api/urls.py +7 -3
  136. nautobot/dcim/api/views.py +53 -7
  137. nautobot/dcim/apps.py +3 -0
  138. nautobot/dcim/choices.py +25 -0
  139. nautobot/dcim/constants.py +7 -0
  140. nautobot/dcim/factory.py +252 -18
  141. nautobot/dcim/filters/__init__.py +373 -193
  142. nautobot/dcim/filters/mixins.py +274 -1
  143. nautobot/dcim/forms.py +834 -121
  144. nautobot/dcim/graphql/types.py +2 -2
  145. nautobot/dcim/homepage.py +1 -1
  146. nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
  147. nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
  148. nautobot/dcim/migrations/0061_module_models.py +862 -0
  149. nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
  150. nautobot/dcim/models/__init__.py +8 -0
  151. nautobot/dcim/models/cables.py +15 -0
  152. nautobot/dcim/models/device_component_templates.py +207 -53
  153. nautobot/dcim/models/device_components.py +275 -99
  154. nautobot/dcim/models/devices.py +468 -13
  155. nautobot/dcim/models/racks.py +0 -1
  156. nautobot/dcim/navigation.py +47 -0
  157. nautobot/dcim/signals.py +3 -3
  158. nautobot/dcim/tables/__init__.py +35 -23
  159. nautobot/dcim/tables/devices.py +229 -43
  160. nautobot/dcim/tables/devicetypes.py +65 -9
  161. nautobot/dcim/tables/racks.py +5 -1
  162. nautobot/dcim/tables/template_code.py +46 -26
  163. nautobot/dcim/templates/dcim/cable_connect.html +76 -3
  164. nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
  165. nautobot/dcim/templates/dcim/device/base.html +14 -6
  166. nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
  167. nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
  168. nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
  169. nautobot/dcim/templates/dcim/device/frontports.html +2 -3
  170. nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
  171. nautobot/dcim/templates/dcim/device/inventory.html +2 -3
  172. nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
  173. nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
  174. nautobot/dcim/templates/dcim/device/powerports.html +2 -3
  175. nautobot/dcim/templates/dcim/device/rearports.html +2 -3
  176. nautobot/dcim/templates/dcim/device.html +45 -1
  177. nautobot/dcim/templates/dcim/device_component.html +13 -5
  178. nautobot/dcim/templates/dcim/device_list.html +2 -1
  179. nautobot/dcim/templates/dcim/devicetype.html +99 -98
  180. nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
  181. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
  182. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
  183. nautobot/dcim/templates/dcim/interface.html +17 -2
  184. nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
  185. nautobot/dcim/templates/dcim/interface_edit.html +1 -0
  186. nautobot/dcim/templates/dcim/manufacturer.html +24 -0
  187. nautobot/dcim/templates/dcim/module/base.html +97 -0
  188. nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
  189. nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
  190. nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
  191. nautobot/dcim/templates/dcim/module_destroy.html +5 -0
  192. nautobot/dcim/templates/dcim/module_frontports.html +53 -0
  193. nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
  194. nautobot/dcim/templates/dcim/module_list.html +20 -0
  195. nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
  196. nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
  197. nautobot/dcim/templates/dcim/module_powerports.html +53 -0
  198. nautobot/dcim/templates/dcim/module_rearports.html +53 -0
  199. nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
  200. nautobot/dcim/templates/dcim/module_update.html +71 -0
  201. nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
  202. nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
  203. nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
  204. nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
  205. nautobot/dcim/templates/dcim/moduletype_retrieve.html +159 -0
  206. nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
  207. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
  208. nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
  209. nautobot/dcim/tests/test_api.py +693 -208
  210. nautobot/dcim/tests/test_filters.py +843 -217
  211. nautobot/dcim/tests/test_models.py +1072 -8
  212. nautobot/dcim/tests/test_views.py +1510 -341
  213. nautobot/dcim/urls.py +17 -2
  214. nautobot/dcim/utils.py +2 -3
  215. nautobot/dcim/views.py +1106 -116
  216. nautobot/extras/__init__.py +0 -1
  217. nautobot/extras/api/serializers.py +115 -3
  218. nautobot/extras/api/urls.py +12 -0
  219. nautobot/extras/api/views.py +66 -0
  220. nautobot/extras/apps.py +2 -2
  221. nautobot/extras/choices.py +43 -0
  222. nautobot/extras/context_managers.py +13 -8
  223. nautobot/extras/datasources/git.py +2 -0
  224. nautobot/extras/factory.py +460 -9
  225. nautobot/extras/filters/__init__.py +174 -3
  226. nautobot/extras/filters/mixins.py +46 -43
  227. nautobot/extras/forms/base.py +24 -5
  228. nautobot/extras/forms/forms.py +227 -8
  229. nautobot/extras/forms/mixins.py +93 -0
  230. nautobot/extras/graphql/types.py +23 -10
  231. nautobot/extras/homepage.py +14 -1
  232. nautobot/extras/management/__init__.py +1 -0
  233. nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
  234. nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
  235. nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
  236. nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
  237. nautobot/extras/migrations/0111_metadata.py +162 -0
  238. nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
  239. nautobot/extras/migrations/0113_saved_views.py +77 -0
  240. nautobot/extras/models/__init__.py +15 -1
  241. nautobot/extras/models/change_logging.py +3 -3
  242. nautobot/extras/models/contacts.py +4 -0
  243. nautobot/extras/models/customfields.py +18 -3
  244. nautobot/extras/models/groups.py +389 -225
  245. nautobot/extras/models/jobs.py +6 -3
  246. nautobot/extras/models/metadata.py +441 -0
  247. nautobot/extras/models/mixins.py +72 -62
  248. nautobot/extras/models/models.py +118 -9
  249. nautobot/extras/models/relationships.py +9 -2
  250. nautobot/extras/models/tags.py +13 -2
  251. nautobot/extras/navigation.py +57 -0
  252. nautobot/extras/plugins/__init__.py +3 -1
  253. nautobot/extras/querysets.py +30 -66
  254. nautobot/extras/signals.py +95 -100
  255. nautobot/extras/tables.py +165 -12
  256. nautobot/extras/templates/extras/dynamicgroup.html +44 -15
  257. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
  258. nautobot/extras/templates/extras/job.html +1 -1
  259. nautobot/extras/templates/extras/jobresult.html +61 -74
  260. nautobot/extras/templates/extras/metadatatype_create.html +89 -0
  261. nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
  262. nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
  263. nautobot/extras/templates/extras/objectchange_list.html +0 -12
  264. nautobot/extras/templates/extras/plugins_list.html +1 -3
  265. nautobot/extras/templates/extras/role_retrieve.html +48 -0
  266. nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
  267. nautobot/extras/tests/integration/test_customfields.py +1 -0
  268. nautobot/extras/tests/test_api.py +509 -23
  269. nautobot/extras/tests/test_changelog.py +20 -9
  270. nautobot/extras/tests/test_context_managers.py +22 -15
  271. nautobot/extras/tests/test_datasources.py +13 -1
  272. nautobot/extras/tests/test_dynamicgroups.py +201 -171
  273. nautobot/extras/tests/test_filters.py +211 -12
  274. nautobot/extras/tests/test_jobs.py +6 -6
  275. nautobot/extras/tests/test_models.py +501 -4
  276. nautobot/extras/tests/test_relationships.py +1 -0
  277. nautobot/extras/tests/test_views.py +565 -8
  278. nautobot/extras/tests/test_webhooks.py +1 -1
  279. nautobot/extras/urls.py +5 -0
  280. nautobot/extras/utils.py +51 -11
  281. nautobot/extras/views.py +542 -76
  282. nautobot/ipam/__init__.py +0 -1
  283. nautobot/ipam/apps.py +1 -0
  284. nautobot/ipam/factory.py +17 -19
  285. nautobot/ipam/filters.py +13 -0
  286. nautobot/ipam/forms.py +8 -4
  287. nautobot/ipam/graphql/types.py +2 -2
  288. nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
  289. nautobot/ipam/models.py +11 -8
  290. nautobot/ipam/querysets.py +1 -1
  291. nautobot/ipam/signals.py +4 -2
  292. nautobot/ipam/tables.py +5 -0
  293. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
  294. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
  295. nautobot/ipam/templates/ipam/prefix.html +1 -0
  296. nautobot/ipam/tests/test_api.py +37 -18
  297. nautobot/ipam/tests/test_filters.py +26 -2
  298. nautobot/ipam/tests/test_models.py +6 -0
  299. nautobot/ipam/tests/test_querysets.py +1 -1
  300. nautobot/ipam/tests/test_views.py +3 -2
  301. nautobot/ipam/urls.py +2 -2
  302. nautobot/ipam/views.py +18 -26
  303. nautobot/project-static/css/base.css +20 -0
  304. nautobot/project-static/css/dark.css +11 -0
  305. nautobot/project-static/docs/404.html +892 -88
  306. nautobot/project-static/docs/apps/index.html +892 -88
  307. nautobot/project-static/docs/apps/nautobot-apps.html +892 -88
  308. nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
  309. nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css +1 -0
  310. nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css.map +1 -0
  311. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +919 -120
  312. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +904 -101
  313. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1618 -903
  314. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +935 -144
  315. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +977 -188
  316. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +901 -99
  317. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +897 -93
  318. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +991 -193
  319. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +974 -131
  320. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1078 -272
  321. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1242 -334
  322. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1727 -875
  323. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1164 -381
  324. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2088 -1374
  325. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2246 -1422
  326. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +912 -111
  327. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +963 -163
  328. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1010 -223
  329. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1913 -1277
  330. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1846 -1102
  331. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +904 -101
  332. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2331 -1699
  333. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1802 -1024
  334. nautobot/project-static/docs/development/apps/api/configuration-view.html +892 -88
  335. nautobot/project-static/docs/development/apps/api/database-backend-config.html +892 -88
  336. nautobot/project-static/docs/development/apps/api/models/django-admin.html +892 -88
  337. nautobot/project-static/docs/development/apps/api/models/global-search.html +892 -88
  338. nautobot/project-static/docs/development/apps/api/models/graphql.html +892 -88
  339. nautobot/project-static/docs/development/apps/api/models/index.html +942 -90
  340. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +892 -88
  341. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +892 -88
  342. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +892 -88
  343. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +892 -88
  344. nautobot/project-static/docs/development/apps/api/platform-features/index.html +892 -88
  345. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +892 -88
  346. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +892 -88
  347. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +892 -88
  348. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +892 -88
  349. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +892 -88
  350. nautobot/project-static/docs/development/apps/api/prometheus.html +892 -88
  351. nautobot/project-static/docs/development/apps/api/setup.html +892 -88
  352. nautobot/project-static/docs/development/apps/api/testing.html +892 -88
  353. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +892 -88
  354. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +892 -88
  355. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +892 -88
  356. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +892 -88
  357. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +892 -88
  358. nautobot/project-static/docs/development/apps/api/views/base-template.html +892 -88
  359. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +892 -88
  360. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +892 -88
  361. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +892 -88
  362. nautobot/project-static/docs/development/apps/api/views/index.html +892 -88
  363. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +892 -88
  364. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +892 -88
  365. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +892 -88
  366. nautobot/project-static/docs/development/apps/api/views/notes.html +892 -88
  367. nautobot/project-static/docs/development/apps/api/views/rest-api.html +892 -88
  368. nautobot/project-static/docs/development/apps/api/views/urls.html +892 -88
  369. nautobot/project-static/docs/development/apps/index.html +892 -88
  370. nautobot/project-static/docs/development/apps/migration/code-updates.html +892 -88
  371. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +892 -88
  372. nautobot/project-static/docs/development/apps/migration/from-v1.html +892 -88
  373. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +892 -88
  374. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +892 -88
  375. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +892 -88
  376. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +892 -88
  377. nautobot/project-static/docs/development/apps/porting-from-netbox.html +892 -88
  378. nautobot/project-static/docs/development/core/application-registry.html +892 -88
  379. nautobot/project-static/docs/development/core/best-practices.html +893 -88
  380. nautobot/project-static/docs/development/core/bootstrap-ui.html +892 -88
  381. nautobot/project-static/docs/development/core/caching.html +892 -88
  382. nautobot/project-static/docs/development/core/controllers.html +892 -88
  383. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +892 -88
  384. nautobot/project-static/docs/development/core/generic-views.html +892 -88
  385. nautobot/project-static/docs/development/core/getting-started.html +892 -88
  386. nautobot/project-static/docs/development/core/homepage.html +892 -88
  387. nautobot/project-static/docs/development/core/index.html +892 -88
  388. nautobot/project-static/docs/development/core/model-checklist.html +901 -89
  389. nautobot/project-static/docs/development/core/model-features.html +892 -88
  390. nautobot/project-static/docs/development/core/natural-keys.html +892 -88
  391. nautobot/project-static/docs/development/core/navigation-menu.html +892 -88
  392. nautobot/project-static/docs/development/core/release-checklist.html +895 -91
  393. nautobot/project-static/docs/development/core/role-internals.html +892 -88
  394. nautobot/project-static/docs/development/core/settings.html +892 -88
  395. nautobot/project-static/docs/development/core/style-guide.html +893 -89
  396. nautobot/project-static/docs/development/core/templates.html +904 -89
  397. nautobot/project-static/docs/development/core/testing.html +892 -88
  398. nautobot/project-static/docs/development/core/user-preferences.html +892 -88
  399. nautobot/project-static/docs/development/index.html +892 -88
  400. nautobot/project-static/docs/development/jobs/index.html +893 -89
  401. nautobot/project-static/docs/development/jobs/migration/from-v1.html +892 -88
  402. nautobot/project-static/docs/index.html +892 -88
  403. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
  404. nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
  405. nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
  406. nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
  407. nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
  408. nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
  409. nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
  410. nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
  411. nautobot/project-static/docs/models/dcim/module.html +15 -0
  412. nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
  413. nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
  414. nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
  415. nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
  416. nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
  417. nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
  418. nautobot/project-static/docs/models/extras/role.html +15 -0
  419. nautobot/project-static/docs/models/extras/savedview.html +15 -0
  420. nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
  421. nautobot/project-static/docs/models/extras/status.html +15 -0
  422. nautobot/project-static/docs/objects.inv +0 -0
  423. nautobot/project-static/docs/overview/application_stack.html +900 -89
  424. nautobot/project-static/docs/overview/design_philosophy.html +892 -88
  425. nautobot/project-static/docs/release-notes/index.html +1129 -92
  426. nautobot/project-static/docs/release-notes/version-1.0.html +892 -88
  427. nautobot/project-static/docs/release-notes/version-1.1.html +892 -88
  428. nautobot/project-static/docs/release-notes/version-1.2.html +892 -88
  429. nautobot/project-static/docs/release-notes/version-1.3.html +892 -88
  430. nautobot/project-static/docs/release-notes/version-1.4.html +892 -88
  431. nautobot/project-static/docs/release-notes/version-1.5.html +893 -89
  432. nautobot/project-static/docs/release-notes/version-1.6.html +893 -89
  433. nautobot/project-static/docs/release-notes/version-2.0.html +892 -88
  434. nautobot/project-static/docs/release-notes/version-2.1.html +892 -88
  435. nautobot/project-static/docs/release-notes/version-2.2.html +895 -91
  436. nautobot/project-static/docs/release-notes/version-2.3.html +9954 -0
  437. nautobot/project-static/docs/requirements.txt +5 -5
  438. nautobot/project-static/docs/search/search_index.json +1 -1
  439. nautobot/project-static/docs/sitemap.xml +331 -256
  440. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  441. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +892 -88
  442. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +892 -88
  443. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +892 -88
  444. nautobot/project-static/docs/user-guide/administration/configuration/index.html +892 -88
  445. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +992 -174
  446. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +892 -88
  447. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +892 -88
  448. nautobot/project-static/docs/user-guide/administration/guides/caching.html +892 -88
  449. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +896 -88
  450. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +892 -88
  451. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +892 -88
  452. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +892 -88
  453. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +892 -88
  454. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +892 -88
  455. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +892 -88
  456. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +892 -88
  457. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +892 -88
  458. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +944 -153
  459. nautobot/project-static/docs/user-guide/administration/installation/index.html +901 -93
  460. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +934 -122
  461. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +954 -157
  462. nautobot/project-static/docs/user-guide/administration/installation/services.html +913 -112
  463. nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +908 -99
  464. nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +892 -88
  465. nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +892 -88
  466. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +892 -88
  467. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +892 -88
  468. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +893 -89
  469. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +892 -88
  470. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +892 -88
  471. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +892 -88
  472. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +892 -88
  473. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +892 -88
  474. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +892 -88
  475. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +892 -88
  476. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +892 -88
  477. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +892 -88
  478. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +892 -88
  479. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +892 -88
  480. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +893 -89
  481. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +892 -88
  482. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +896 -88
  483. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +895 -91
  484. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
  485. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
  486. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
  487. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
  488. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
  489. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
  490. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
  491. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +906 -102
  492. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +923 -105
  493. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +923 -105
  494. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +918 -100
  495. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +923 -105
  496. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +906 -102
  497. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +906 -102
  498. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +913 -105
  499. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +920 -116
  500. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +921 -117
  501. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +918 -114
  502. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +906 -102
  503. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +914 -105
  504. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +926 -108
  505. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +936 -118
  506. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +928 -106
  507. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +906 -102
  508. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +937 -119
  509. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +928 -110
  510. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +918 -114
  511. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +921 -117
  512. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +923 -115
  513. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
  514. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
  515. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
  516. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
  517. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +916 -112
  518. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +906 -102
  519. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +940 -83
  520. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +924 -106
  521. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +906 -102
  522. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +943 -86
  523. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +921 -103
  524. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +929 -125
  525. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +918 -114
  526. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +906 -102
  527. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +922 -104
  528. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +924 -106
  529. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +906 -102
  530. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +906 -102
  531. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +906 -102
  532. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +936 -88
  533. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +892 -88
  534. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +897 -89
  535. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +897 -89
  536. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +892 -88
  537. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +892 -88
  538. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +892 -88
  539. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +892 -88
  540. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +892 -88
  541. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +892 -88
  542. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +892 -88
  543. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +892 -88
  544. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +892 -88
  545. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +892 -88
  546. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +901 -96
  547. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +892 -88
  548. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +892 -88
  549. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +892 -88
  550. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +892 -88
  551. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +892 -88
  552. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +897 -89
  553. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +892 -88
  554. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +892 -88
  555. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +892 -88
  556. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +892 -88
  557. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +892 -88
  558. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +892 -88
  559. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +892 -88
  560. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +892 -88
  561. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +892 -88
  562. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +892 -88
  563. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +892 -88
  564. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +892 -88
  565. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +892 -88
  566. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
  567. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
  568. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
  569. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
  570. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
  571. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
  572. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
  587. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
  588. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
  589. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
  590. nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
  591. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +892 -88
  592. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +892 -88
  593. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +892 -88
  594. nautobot/project-static/docs/user-guide/index.html +892 -88
  595. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +892 -88
  596. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +892 -88
  597. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +892 -88
  598. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +892 -88
  599. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1258 -785
  600. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +895 -91
  601. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +892 -88
  602. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +892 -88
  603. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +892 -88
  604. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +892 -88
  605. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +892 -88
  606. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +892 -88
  607. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +892 -88
  608. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +892 -88
  609. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +892 -88
  610. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +896 -88
  611. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +892 -88
  612. nautobot/project-static/docs/user-guide/platform-functionality/note.html +895 -91
  613. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +9061 -0
  614. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +895 -91
  615. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +892 -88
  616. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +892 -88
  617. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +892 -88
  618. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +892 -88
  619. nautobot/project-static/docs/user-guide/platform-functionality/role.html +895 -91
  620. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
  621. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +895 -91
  622. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
  623. nautobot/project-static/docs/user-guide/platform-functionality/status.html +892 -88
  624. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +892 -88
  625. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +950 -121
  626. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +892 -88
  627. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +892 -88
  628. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +892 -88
  629. nautobot/project-static/js/forms.js +71 -0
  630. nautobot/project-static/js/table_sorting_indicator.js +46 -0
  631. nautobot/project-static/js/tableconfig.js +6 -1
  632. nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
  633. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
  634. nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
  635. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
  636. nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
  637. nautobot/tenancy/__init__.py +0 -1
  638. nautobot/tenancy/apps.py +1 -0
  639. nautobot/tenancy/factory.py +3 -2
  640. nautobot/tenancy/filters/__init__.py +1 -0
  641. nautobot/tenancy/forms.py +1 -1
  642. nautobot/tenancy/templates/tenancy/tenant.html +24 -20
  643. nautobot/tenancy/views.py +11 -10
  644. nautobot/users/__init__.py +0 -1
  645. nautobot/users/api/serializers.py +1 -1
  646. nautobot/users/api/views.py +4 -2
  647. nautobot/users/apps.py +3 -2
  648. nautobot/users/factory.py +3 -3
  649. nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
  650. nautobot/users/models.py +12 -0
  651. nautobot/users/tests/test_filters.py +6 -3
  652. nautobot/users/urls.py +8 -0
  653. nautobot/virtualization/__init__.py +0 -1
  654. nautobot/virtualization/apps.py +1 -0
  655. nautobot/virtualization/filters.py +6 -1
  656. nautobot/virtualization/forms.py +11 -3
  657. nautobot/virtualization/graphql/types.py +2 -2
  658. nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
  659. nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
  660. nautobot/virtualization/models.py +0 -2
  661. nautobot/virtualization/tables.py +10 -3
  662. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
  663. nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
  664. nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
  665. nautobot/virtualization/tests/test_api.py +9 -4
  666. nautobot/virtualization/tests/test_filters.py +22 -0
  667. nautobot/virtualization/tests/test_models.py +7 -3
  668. nautobot/virtualization/tests/test_views.py +19 -3
  669. nautobot/virtualization/urls.py +2 -2
  670. nautobot/virtualization/views.py +10 -32
  671. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/METADATA +20 -18
  672. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/RECORD +677 -557
  673. nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css +0 -1
  674. nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css.map +0 -1
  675. nautobot/project-static/materialdesignicons-6.5.95/.github/ISSUE_TEMPLATE.md +0 -3
  676. nautobot/project-static/materialdesignicons-6.5.95/README.md +0 -25
  677. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css +0 -26654
  678. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css.map +0 -16
  679. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css +0 -3
  680. nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css.map +0 -16
  681. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff +0 -0
  682. nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff2 +0 -0
  683. nautobot/project-static/materialdesignicons-6.5.95/package.json +0 -28
  684. nautobot/project-static/materialdesignicons-6.5.95/preview.html +0 -717
  685. nautobot/project-static/materialdesignicons-6.5.95/scss/_animated.scss +0 -27
  686. nautobot/project-static/materialdesignicons-6.5.95/scss/_core.scss +0 -10
  687. nautobot/project-static/materialdesignicons-6.5.95/scss/_extras.scss +0 -65
  688. nautobot/project-static/materialdesignicons-6.5.95/scss/_functions.scss +0 -20
  689. nautobot/project-static/materialdesignicons-6.5.95/scss/_icons.scss +0 -10
  690. nautobot/project-static/materialdesignicons-6.5.95/scss/_path.scss +0 -10
  691. nautobot/project-static/materialdesignicons-6.5.95/scss/_variables.scss +0 -6606
  692. nautobot/project-static/materialdesignicons-6.5.95/scss/materialdesignicons.scss +0 -8
  693. /nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/LICENSE +0 -0
  694. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/LICENSE.txt +0 -0
  695. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/NOTICE +0 -0
  696. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/WHEEL +0 -0
  697. {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/entry_points.txt +0 -0
@@ -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,200 @@ 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", "has_comments")
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
+ has_comments = NautobotBoolIterator()
771
+ comments = factory.Maybe("has_comments", factory.Faker("bs"))
772
+
773
+ @factory.lazy_attribute
774
+ def model(self):
775
+ """
776
+ Use a random unused-for-this-manufacturer element from `module_types` if any.
777
+
778
+ If all are already used, append " 2" to all module-type strings and try again, and so forth.
779
+ """
780
+ possible_module_types = set(module_types)
781
+ count = 2
782
+ current_models = set(ModuleType.objects.filter(manufacturer=self.manufacturer).values_list("model", flat=True))
783
+ unused_models = possible_module_types.difference(current_models)
784
+ while not unused_models:
785
+ unused_models = {f"{module_type} {count}" for module_type in module_types}.difference(current_models)
786
+ count += 1
787
+ return factory.random.randgen.choice(list(unused_models))
788
+
789
+
790
+ class ModuleFactory(PrimaryModelFactory):
791
+ class Meta:
792
+ model = Module
793
+ exclude = (
794
+ "has_asset_tag",
795
+ "has_parent_module_bay",
796
+ "has_role",
797
+ "has_serial",
798
+ "has_tenant",
799
+ )
800
+
801
+ module_type = random_instance(ModuleType, allow_null=False)
802
+ status = random_instance(
803
+ lambda: Status.objects.get_for_model(Module),
804
+ allow_null=False,
805
+ )
806
+ has_parent_module_bay = NautobotBoolIterator()
807
+ parent_module_bay = factory.Maybe(
808
+ "has_parent_module_bay",
809
+ random_instance(lambda: ModuleBay.objects.filter(installed_module__isnull=True), allow_null=False),
810
+ None,
811
+ )
812
+ location = factory.Maybe(
813
+ "has_parent_module_bay",
814
+ None,
815
+ random_instance(
816
+ lambda: Location.objects.filter(location_type__content_types=ContentType.objects.get_for_model(Module)),
817
+ allow_null=False,
818
+ ),
819
+ )
820
+ has_role = NautobotBoolIterator()
821
+ role = factory.Maybe(
822
+ "has_role",
823
+ random_instance(lambda: Role.objects.get_for_model(Module)),
824
+ None,
825
+ )
826
+ has_asset_tag = NautobotBoolIterator()
827
+ asset_tag = factory.Maybe("has_asset_tag", UniqueFaker("uuid4"), None)
828
+ has_serial = NautobotBoolIterator()
829
+ serial = factory.Maybe("has_serial", factory.Faker("ean", length=8), "")
830
+ has_tenant = NautobotBoolIterator()
831
+ tenant = factory.Maybe("has_tenant", random_instance(Tenant, allow_null=False), None)
832
+
833
+
834
+ class DeviceComponentTemplateFactory(BaseModelFactory):
835
+ class Params:
836
+ has_label = NautobotBoolIterator()
837
+ has_description = NautobotBoolIterator()
838
+
839
+ device_type = random_instance(DeviceType.objects.all(), allow_null=False)
840
+ label = factory.Maybe(
841
+ "has_label",
842
+ factory.Faker("word"),
843
+ "",
844
+ )
845
+ description = factory.Maybe(
846
+ "has_description",
847
+ factory.Faker("sentence"),
848
+ "",
849
+ )
850
+
851
+
852
+ class ModularDeviceComponentTemplateFactory(DeviceComponentTemplateFactory):
853
+ class Params:
854
+ has_device_type = NautobotBoolIterator()
855
+
856
+ device_type = factory.Maybe("has_device_type", random_instance(DeviceType, allow_null=False), None)
857
+ module_type = factory.Maybe("has_device_type", None, random_instance(ModuleType, allow_null=False))
858
+
859
+
860
+ class ConsolePortTemplateFactory(ModularDeviceComponentTemplateFactory):
861
+ class Meta:
862
+ model = ConsolePortTemplate
863
+
864
+ type = factory.Faker("random_element", elements=ConsolePortTypeChoices.values())
865
+ name = factory.Sequence(lambda n: f"ConsolePort {n}")
866
+
867
+
868
+ class ConsoleServerPortTemplateFactory(ModularDeviceComponentTemplateFactory):
869
+ class Meta:
870
+ model = ConsoleServerPortTemplate
871
+
872
+ type = factory.Faker("random_element", elements=ConsolePortTypeChoices.values())
873
+ name = factory.Sequence(lambda n: f"ConsoleServerPort {n}")
874
+
875
+
876
+ class PowerPortTemplateFactory(ModularDeviceComponentTemplateFactory):
877
+ class Meta:
878
+ model = PowerPortTemplate
879
+
880
+ type = factory.Faker("random_element", elements=PowerPortTypeChoices.values())
881
+ name = factory.Sequence(lambda n: f"PowerPort {n}")
882
+
883
+
884
+ class PowerOutletTemplateFactory(ModularDeviceComponentTemplateFactory):
885
+ class Meta:
886
+ model = PowerOutletTemplate
887
+
888
+ type = factory.Faker("random_element", elements=PowerOutletTypeChoices.values())
889
+ name = factory.Sequence(lambda n: f"PowerOutlet {n}")
890
+
891
+
892
+ class InterfaceTemplateFactory(ModularDeviceComponentTemplateFactory):
893
+ class Meta:
894
+ model = InterfaceTemplate
895
+
896
+ type = factory.Faker("random_element", elements=InterfaceTypeChoices.values())
897
+ name = factory.Sequence(lambda n: f"Interface {n}")
898
+
899
+
900
+ class FrontPortTemplateFactory(ModularDeviceComponentTemplateFactory):
901
+ class Meta:
902
+ model = FrontPortTemplate
903
+
904
+ device_type = factory.Maybe(
905
+ "has_device_type",
906
+ random_instance(DeviceType.objects.filter(rear_port_templates__isnull=False), allow_null=False),
907
+ None,
908
+ )
909
+ module_type = factory.Maybe(
910
+ "has_device_type",
911
+ None,
912
+ random_instance(ModuleType.objects.filter(rear_port_templates__isnull=False), allow_null=False),
913
+ )
914
+ type = factory.Faker("random_element", elements=PortTypeChoices.values())
915
+ name = factory.Sequence(lambda n: f"FrontPort {n}")
916
+
917
+ @factory.lazy_attribute
918
+ def rear_port_template(self):
919
+ if self.module_type:
920
+ return factory.random.randgen.choice(self.module_type.rear_port_templates.all())
921
+ else:
922
+ return factory.random.randgen.choice(self.device_type.rear_port_templates.all())
923
+
924
+ @factory.lazy_attribute
925
+ def rear_port_position(self):
926
+ return self.rear_port_template.front_port_templates.count() + 1
927
+
928
+
929
+ class RearPortTemplateFactory(ModularDeviceComponentTemplateFactory):
930
+ class Meta:
931
+ model = RearPortTemplate
932
+
933
+ type = factory.Faker("random_element", elements=PortTypeChoices.values())
934
+ name = factory.Sequence(lambda n: f"RearPort {n}")
935
+ positions = factory.Sequence(lambda n: n + 100)
936
+
937
+
938
+ class ModuleBayTemplateFactory(ModularDeviceComponentTemplateFactory):
939
+ class Meta:
940
+ model = ModuleBayTemplate
941
+
942
+ name = factory.Sequence(lambda n: f"ModuleBay {n}")
943
+ position = factory.Maybe(
944
+ "has_device_type",
945
+ factory.LazyAttribute(lambda o: o.device_type.module_bay_templates.count() + 1),
946
+ factory.LazyAttribute(lambda o: o.module_type.module_bay_templates.count() + 1),
947
+ )