nautobot 2.4.0__py3-none-any.whl → 2.4.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 (592) hide show
  1. nautobot/apps/__init__.py +1 -1
  2. nautobot/apps/api.py +8 -8
  3. nautobot/apps/change_logging.py +2 -2
  4. nautobot/apps/choices.py +4 -4
  5. nautobot/apps/events.py +3 -3
  6. nautobot/apps/factory.py +2 -2
  7. nautobot/apps/filters.py +1 -1
  8. nautobot/apps/forms.py +20 -20
  9. nautobot/apps/graphql.py +2 -2
  10. nautobot/apps/jobs.py +8 -8
  11. nautobot/apps/models.py +19 -19
  12. nautobot/apps/tables.py +1 -1
  13. nautobot/apps/testing.py +10 -10
  14. nautobot/apps/ui.py +2 -2
  15. nautobot/apps/utils.py +7 -7
  16. nautobot/apps/views.py +7 -7
  17. nautobot/circuits/api/serializers.py +0 -1
  18. nautobot/circuits/api/views.py +8 -4
  19. nautobot/circuits/tables.py +1 -2
  20. nautobot/circuits/templates/circuits/circuit_create.html +7 -1
  21. nautobot/circuits/views.py +3 -3
  22. nautobot/cloud/api/views.py +10 -6
  23. nautobot/cloud/models.py +1 -1
  24. nautobot/cloud/views.py +16 -0
  25. nautobot/core/api/fields.py +5 -5
  26. nautobot/core/api/filter_backends.py +9 -3
  27. nautobot/core/api/schema.py +2 -13
  28. nautobot/core/api/serializers.py +34 -40
  29. nautobot/core/api/views.py +4 -56
  30. nautobot/core/celery/log.py +4 -4
  31. nautobot/core/celery/schedulers.py +1 -1
  32. nautobot/core/choices.py +2 -2
  33. nautobot/core/events/__init__.py +3 -3
  34. nautobot/core/filters.py +16 -21
  35. nautobot/core/fixtures/user-data.json +59 -0
  36. nautobot/core/forms/__init__.py +19 -19
  37. nautobot/core/forms/fields.py +11 -14
  38. nautobot/core/forms/forms.py +2 -33
  39. nautobot/core/graphql/types.py +1 -1
  40. nautobot/core/jobs/__init__.py +7 -28
  41. nautobot/core/jobs/cleanup.py +12 -48
  42. nautobot/core/jobs/groups.py +1 -1
  43. nautobot/core/management/commands/validate_models.py +1 -1
  44. nautobot/core/models/__init__.py +1 -1
  45. nautobot/core/models/query_functions.py +2 -2
  46. nautobot/core/models/tree_queries.py +3 -6
  47. nautobot/core/settings.py +2 -29
  48. nautobot/core/settings.yaml +0 -21
  49. nautobot/core/tables.py +60 -74
  50. nautobot/core/templates/inc/media.html +0 -3
  51. nautobot/core/templates/inc/nav_menu.html +0 -1
  52. nautobot/core/templates/nautobot_config.py.j2 +0 -13
  53. nautobot/core/templates/search.html +0 -7
  54. nautobot/core/templates/utilities/render_jinja2.html +1 -1
  55. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  56. nautobot/core/templates/utilities/theme_preview.html +0 -7
  57. nautobot/core/templatetags/helpers.py +2 -11
  58. nautobot/core/testing/__init__.py +8 -8
  59. nautobot/core/testing/api.py +15 -170
  60. nautobot/core/testing/filters.py +2 -25
  61. nautobot/core/testing/forms.py +0 -2
  62. nautobot/core/testing/mixins.py +2 -7
  63. nautobot/core/testing/views.py +29 -44
  64. nautobot/core/tests/integration/test_app_home.py +1 -0
  65. nautobot/core/tests/integration/test_app_navbar.py +1 -0
  66. nautobot/core/tests/integration/test_filters.py +2 -0
  67. nautobot/core/tests/integration/test_home.py +1 -0
  68. nautobot/core/tests/integration/test_navbar.py +1 -0
  69. nautobot/core/tests/integration/test_view_authentication.py +0 -1
  70. nautobot/core/tests/runner.py +1 -1
  71. nautobot/core/tests/test_api.py +1 -98
  72. nautobot/core/tests/test_csv.py +3 -25
  73. nautobot/core/tests/test_forms.py +0 -1
  74. nautobot/core/tests/test_jobs.py +1 -303
  75. nautobot/core/tests/test_settings_schema.py +0 -7
  76. nautobot/core/tests/test_tables.py +0 -100
  77. nautobot/core/tests/test_utils.py +1 -63
  78. nautobot/core/tests/test_views.py +3 -30
  79. nautobot/core/ui/nav.py +0 -1
  80. nautobot/core/ui/object_detail.py +1 -15
  81. nautobot/core/urls.py +0 -11
  82. nautobot/core/utils/lookup.py +8 -11
  83. nautobot/core/utils/requests.py +9 -24
  84. nautobot/core/views/__init__.py +0 -42
  85. nautobot/core/views/generic.py +176 -78
  86. nautobot/core/views/mixins.py +34 -94
  87. nautobot/core/views/renderers.py +6 -6
  88. nautobot/dcim/api/serializers.py +62 -54
  89. nautobot/dcim/api/views.py +113 -47
  90. nautobot/dcim/filters/__init__.py +2 -31
  91. nautobot/dcim/forms.py +17 -36
  92. nautobot/dcim/graphql/types.py +2 -2
  93. nautobot/dcim/models/__init__.py +1 -1
  94. nautobot/dcim/models/device_component_templates.py +2 -2
  95. nautobot/dcim/models/device_components.py +20 -22
  96. nautobot/dcim/models/devices.py +1 -10
  97. nautobot/dcim/models/locations.py +3 -3
  98. nautobot/dcim/models/power.py +5 -6
  99. nautobot/dcim/models/racks.py +4 -4
  100. nautobot/dcim/tables/__init__.py +3 -3
  101. nautobot/dcim/tables/devices.py +5 -7
  102. nautobot/dcim/tables/devicetypes.py +2 -2
  103. nautobot/dcim/tables/racks.py +1 -1
  104. nautobot/dcim/templates/dcim/controller_create.html +7 -1
  105. nautobot/dcim/templates/dcim/controller_retrieve.html +9 -1
  106. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -2
  107. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -5
  108. nautobot/dcim/templates/dcim/device.html +9 -1
  109. nautobot/dcim/templates/dcim/device_edit.html +37 -36
  110. nautobot/dcim/templates/dcim/location.html +9 -1
  111. nautobot/dcim/templates/dcim/location_edit.html +7 -1
  112. nautobot/dcim/templates/dcim/rack.html +9 -1
  113. nautobot/dcim/templates/dcim/rack_edit.html +7 -1
  114. nautobot/dcim/templates/dcim/rackreservation.html +9 -1
  115. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +9 -1
  116. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +7 -1
  117. nautobot/dcim/tests/test_api.py +3 -16
  118. nautobot/dcim/tests/test_filters.py +0 -33
  119. nautobot/dcim/tests/test_forms.py +2 -51
  120. nautobot/dcim/tests/test_graphql.py +0 -52
  121. nautobot/dcim/tests/test_models.py +5 -34
  122. nautobot/dcim/tests/test_views.py +83 -21
  123. nautobot/dcim/views.py +13 -1
  124. nautobot/extras/api/customfields.py +2 -2
  125. nautobot/extras/api/serializers.py +85 -90
  126. nautobot/extras/api/views.py +27 -22
  127. nautobot/extras/constants.py +0 -2
  128. nautobot/extras/filters/__init__.py +6 -8
  129. nautobot/extras/forms/base.py +2 -2
  130. nautobot/extras/forms/forms.py +31 -139
  131. nautobot/extras/forms/mixins.py +5 -13
  132. nautobot/extras/group_sync.py +3 -3
  133. nautobot/extras/health_checks.py +2 -1
  134. nautobot/extras/jobs.py +12 -70
  135. nautobot/extras/managers.py +1 -3
  136. nautobot/extras/migrations/0018_joblog_data_migration.py +9 -7
  137. nautobot/extras/models/__init__.py +1 -1
  138. nautobot/extras/models/contacts.py +1 -1
  139. nautobot/extras/models/customfields.py +11 -12
  140. nautobot/extras/models/groups.py +9 -11
  141. nautobot/extras/models/jobs.py +4 -23
  142. nautobot/extras/models/models.py +2 -2
  143. nautobot/extras/plugins/__init__.py +2 -13
  144. nautobot/extras/plugins/marketplace_manifest.yml +79 -84
  145. nautobot/extras/plugins/tables.py +14 -16
  146. nautobot/extras/plugins/views.py +69 -65
  147. nautobot/extras/registry.py +1 -1
  148. nautobot/extras/secrets/__init__.py +2 -2
  149. nautobot/extras/tables.py +5 -7
  150. nautobot/extras/templates/extras/dynamicgroup.html +9 -1
  151. nautobot/extras/templates/extras/job_detail.html +0 -16
  152. nautobot/extras/templates/extras/job_edit.html +0 -1
  153. nautobot/extras/templates/extras/jobqueue_retrieve.html +9 -1
  154. nautobot/extras/templates/extras/marketplace.html +11 -29
  155. nautobot/extras/templates/extras/plugin_detail.html +15 -32
  156. nautobot/extras/templates/extras/plugins_tiles.html +10 -21
  157. nautobot/extras/test_jobs/api_test_job.py +1 -1
  158. nautobot/extras/test_jobs/atomic_transaction.py +2 -2
  159. nautobot/extras/test_jobs/dry_run.py +1 -1
  160. nautobot/extras/test_jobs/fail.py +5 -5
  161. nautobot/extras/test_jobs/file_output.py +1 -1
  162. nautobot/extras/test_jobs/file_upload_fail.py +1 -1
  163. nautobot/extras/test_jobs/file_upload_pass.py +1 -1
  164. nautobot/extras/test_jobs/ipaddress_vars.py +1 -3
  165. nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
  166. nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
  167. nautobot/extras/test_jobs/log_redaction.py +1 -1
  168. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
  169. nautobot/extras/test_jobs/modify_db.py +1 -1
  170. nautobot/extras/test_jobs/object_var_optional.py +1 -1
  171. nautobot/extras/test_jobs/object_var_required.py +1 -1
  172. nautobot/extras/test_jobs/object_vars.py +1 -1
  173. nautobot/extras/test_jobs/pass.py +3 -3
  174. nautobot/extras/test_jobs/profiling.py +1 -1
  175. nautobot/extras/test_jobs/relative_import.py +3 -3
  176. nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
  177. nautobot/extras/test_jobs/task_queues.py +1 -1
  178. nautobot/extras/tests/integration/test_plugin_banner.py +2 -0
  179. nautobot/extras/tests/test_api.py +13 -13
  180. nautobot/extras/tests/test_customfields.py +1 -1
  181. nautobot/extras/tests/test_datasources.py +1 -2
  182. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  183. nautobot/extras/tests/test_filters.py +6 -6
  184. nautobot/extras/tests/test_forms.py +1 -20
  185. nautobot/extras/tests/test_jobs.py +19 -160
  186. nautobot/extras/tests/test_models.py +10 -10
  187. nautobot/extras/tests/test_plugins.py +9 -62
  188. nautobot/extras/tests/test_relationships.py +9 -120
  189. nautobot/extras/tests/test_views.py +191 -52
  190. nautobot/extras/utils.py +2 -3
  191. nautobot/extras/views.py +98 -30
  192. nautobot/ipam/api/fields.py +3 -3
  193. nautobot/ipam/api/serializers.py +33 -41
  194. nautobot/ipam/api/views.py +117 -68
  195. nautobot/ipam/factory.py +1 -1
  196. nautobot/ipam/filters.py +2 -3
  197. nautobot/ipam/lookups.py +62 -101
  198. nautobot/ipam/models.py +16 -66
  199. nautobot/ipam/querysets.py +2 -2
  200. nautobot/ipam/tables.py +7 -23
  201. nautobot/ipam/templates/ipam/ipaddress.html +9 -1
  202. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +7 -1
  203. nautobot/ipam/templates/ipam/ipaddress_edit.html +7 -1
  204. nautobot/ipam/templates/ipam/prefix.html +9 -1
  205. nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
  206. nautobot/ipam/templates/ipam/vlan.html +9 -1
  207. nautobot/ipam/templates/ipam/vlan_edit.html +7 -1
  208. nautobot/ipam/templates/ipam/vrf_edit.html +7 -1
  209. nautobot/ipam/tests/test_api.py +3 -416
  210. nautobot/ipam/tests/test_forms.py +47 -49
  211. nautobot/ipam/tests/test_migrations.py +30 -30
  212. nautobot/ipam/tests/test_models.py +34 -95
  213. nautobot/ipam/tests/test_querysets.py +1 -63
  214. nautobot/ipam/tests/test_views.py +0 -3
  215. nautobot/ipam/utils/__init__.py +6 -36
  216. nautobot/ipam/views.py +87 -61
  217. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  218. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  219. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +2 -40
  220. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  221. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  222. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  223. nautobot/project-static/docs/404.html +4 -46
  224. nautobot/project-static/docs/apps/index.html +4 -46
  225. nautobot/project-static/docs/apps/nautobot-apps.html +6 -47
  226. nautobot/project-static/docs/assets/_mkdocstrings.css +1 -25
  227. nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js → bundle.83f73b43.min.js} +2 -2
  228. nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js.map → bundle.83f73b43.min.js.map} +2 -2
  229. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +10 -62
  230. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +7 -59
  231. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +122 -374
  232. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +18 -90
  233. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +21 -95
  234. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +6 -53
  235. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +5 -52
  236. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +17 -79
  237. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +28 -102
  238. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +21 -108
  239. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +38 -131
  240. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +65 -239
  241. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +165 -581
  242. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +36 -109
  243. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +167 -453
  244. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +211 -493
  245. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +8 -60
  246. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +15 -71
  247. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +55 -407
  248. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +205 -585
  249. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +412 -858
  250. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +7 -59
  251. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +186 -448
  252. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +147 -365
  253. nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -46
  254. nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -46
  255. nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -46
  256. nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -46
  257. nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -46
  258. nautobot/project-static/docs/development/apps/api/models/index.html +4 -46
  259. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -46
  260. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -46
  261. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -46
  262. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -46
  263. nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -46
  264. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -46
  265. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -46
  266. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -46
  267. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -46
  268. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +7 -68
  269. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -46
  270. nautobot/project-static/docs/development/apps/api/prometheus.html +4 -46
  271. nautobot/project-static/docs/development/apps/api/setup.html +4 -46
  272. nautobot/project-static/docs/development/apps/api/testing.html +4 -46
  273. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -46
  274. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -46
  275. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -46
  276. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -46
  277. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -46
  278. nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -46
  279. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -46
  280. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -46
  281. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -46
  282. nautobot/project-static/docs/development/apps/api/views/index.html +4 -46
  283. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -46
  284. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -46
  285. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -46
  286. nautobot/project-static/docs/development/apps/api/views/notes.html +4 -46
  287. nautobot/project-static/docs/development/apps/api/views/rest-api.html +6 -52
  288. nautobot/project-static/docs/development/apps/api/views/urls.html +4 -46
  289. nautobot/project-static/docs/development/apps/index.html +4 -46
  290. nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -46
  291. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -46
  292. nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -46
  293. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -46
  294. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -46
  295. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -46
  296. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -46
  297. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +8 -50
  298. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -46
  299. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +14 -211
  300. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -46
  301. nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -46
  302. nautobot/project-static/docs/development/core/application-registry.html +4 -46
  303. nautobot/project-static/docs/development/core/best-practices.html +4 -46
  304. nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -46
  305. nautobot/project-static/docs/development/core/caching.html +4 -46
  306. nautobot/project-static/docs/development/core/controllers.html +4 -46
  307. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +74 -73
  308. nautobot/project-static/docs/development/core/generic-views.html +4 -46
  309. nautobot/project-static/docs/development/core/getting-started.html +224 -249
  310. nautobot/project-static/docs/development/core/homepage.html +7 -49
  311. nautobot/project-static/docs/development/core/index.html +4 -46
  312. nautobot/project-static/docs/development/core/{minikube-dev-environment-for-k8s-jobs.html → local-k8s.html} +168 -469
  313. nautobot/project-static/docs/development/core/model-checklist.html +12 -56
  314. nautobot/project-static/docs/development/core/model-features.html +4 -46
  315. nautobot/project-static/docs/development/core/natural-keys.html +4 -46
  316. nautobot/project-static/docs/development/core/navigation-menu.html +4 -46
  317. nautobot/project-static/docs/development/core/release-checklist.html +7 -49
  318. nautobot/project-static/docs/development/core/role-internals.html +4 -46
  319. nautobot/project-static/docs/development/core/settings.html +4 -46
  320. nautobot/project-static/docs/development/core/style-guide.html +7 -49
  321. nautobot/project-static/docs/development/core/templates.html +4 -46
  322. nautobot/project-static/docs/development/core/testing.html +4 -46
  323. nautobot/project-static/docs/development/core/ui-component-framework.html +273 -369
  324. nautobot/project-static/docs/development/core/user-preferences.html +4 -46
  325. nautobot/project-static/docs/development/index.html +4 -46
  326. nautobot/project-static/docs/development/jobs/index.html +122 -216
  327. nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -46
  328. nautobot/project-static/docs/index.html +23 -54
  329. nautobot/project-static/docs/objects.inv +0 -0
  330. nautobot/project-static/docs/overview/application_stack.html +7 -47
  331. nautobot/project-static/docs/overview/design_philosophy.html +4 -46
  332. nautobot/project-static/docs/release-notes/index.html +12 -52
  333. nautobot/project-static/docs/release-notes/version-1.0.html +193 -234
  334. nautobot/project-static/docs/release-notes/version-1.1.html +190 -231
  335. nautobot/project-static/docs/release-notes/version-1.2.html +265 -306
  336. nautobot/project-static/docs/release-notes/version-1.3.html +291 -332
  337. nautobot/project-static/docs/release-notes/version-1.4.html +377 -417
  338. nautobot/project-static/docs/release-notes/version-1.5.html +566 -605
  339. nautobot/project-static/docs/release-notes/version-1.6.html +447 -904
  340. nautobot/project-static/docs/release-notes/version-2.0.html +489 -528
  341. nautobot/project-static/docs/release-notes/version-2.1.html +324 -363
  342. nautobot/project-static/docs/release-notes/version-2.2.html +317 -356
  343. nautobot/project-static/docs/release-notes/version-2.3.html +352 -997
  344. nautobot/project-static/docs/release-notes/version-2.4.html +101 -417
  345. nautobot/project-static/docs/requirements.txt +2 -2
  346. nautobot/project-static/docs/search/search_index.json +1 -1
  347. nautobot/project-static/docs/sitemap.xml +287 -295
  348. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  349. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -46
  350. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
  351. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +6 -48
  352. nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -46
  353. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -46
  354. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +8 -110
  355. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -46
  356. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -46
  357. nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -46
  358. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -46
  359. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -46
  360. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -46
  361. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -46
  362. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -46
  363. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +6 -48
  364. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -46
  365. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -46
  366. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -46
  367. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +8 -66
  368. nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -46
  369. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +5 -47
  370. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -46
  371. nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -46
  372. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -46
  373. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -46
  374. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -46
  375. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -46
  376. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -46
  377. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -46
  378. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -46
  379. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -46
  380. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -46
  381. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +8 -49
  382. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -46
  383. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -46
  384. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -46
  385. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -46
  386. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -46
  387. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -46
  388. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -46
  389. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -46
  390. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -46
  391. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -46
  392. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -46
  393. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -46
  394. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -46
  395. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -46
  396. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -46
  397. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -46
  398. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -46
  399. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -46
  400. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -46
  401. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -46
  402. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -46
  403. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -46
  404. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -46
  405. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -46
  406. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -46
  407. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -46
  408. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -46
  409. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -46
  410. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -46
  411. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -46
  412. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -46
  413. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -46
  414. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -46
  415. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -46
  416. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -46
  417. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -46
  418. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -46
  419. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -46
  420. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -46
  421. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -46
  422. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -46
  423. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -46
  424. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -46
  425. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -46
  426. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -46
  427. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -46
  428. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -46
  429. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -46
  430. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -46
  431. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -46
  432. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -46
  433. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -46
  434. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -46
  435. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -46
  436. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -46
  437. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -46
  438. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -46
  439. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +12 -50
  440. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -46
  441. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -46
  442. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -46
  443. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -46
  444. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -46
  445. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -46
  446. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -46
  447. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -46
  448. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -46
  449. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -46
  450. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -46
  451. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -46
  452. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +7 -49
  453. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -46
  454. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -46
  455. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -46
  456. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -46
  457. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -46
  458. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -46
  459. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -46
  460. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -46
  461. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -46
  462. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -46
  463. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -46
  464. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -46
  465. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -46
  466. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -46
  467. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -46
  468. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -46
  469. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -46
  470. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -46
  471. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -46
  472. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -46
  473. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -46
  474. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -46
  475. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +7 -51
  476. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -46
  477. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -46
  478. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -46
  479. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +7 -49
  480. nautobot/project-static/docs/user-guide/index.html +4 -46
  481. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -46
  482. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +8 -50
  483. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -46
  484. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -46
  485. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -46
  486. nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -46
  487. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -46
  488. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -46
  489. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -46
  490. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -46
  491. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -46
  492. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -46
  493. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +7 -50
  494. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -46
  495. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +7 -49
  496. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -46
  497. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -46
  498. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -46
  499. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -46
  500. nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -46
  501. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -46
  502. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +5 -47
  503. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -46
  504. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -46
  505. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +25 -94
  506. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +5 -74
  507. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -46
  508. nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -46
  509. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -46
  510. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -46
  511. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -46
  512. nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -46
  513. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -46
  514. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -46
  515. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -46
  516. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -46
  517. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -46
  518. nautobot/project-static/js/forms.js +1 -1
  519. nautobot/tenancy/api/views.py +13 -9
  520. nautobot/tenancy/views.py +2 -4
  521. nautobot/users/admin.py +1 -1
  522. nautobot/users/api/serializers.py +4 -5
  523. nautobot/users/api/views.py +3 -3
  524. nautobot/virtualization/api/serializers.py +4 -4
  525. nautobot/virtualization/api/views.py +24 -5
  526. nautobot/virtualization/filters.py +3 -20
  527. nautobot/virtualization/models.py +1 -1
  528. nautobot/virtualization/tables.py +2 -2
  529. nautobot/virtualization/templates/virtualization/cluster_edit.html +7 -1
  530. nautobot/virtualization/templates/virtualization/virtualmachine.html +9 -1
  531. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +8 -2
  532. nautobot/virtualization/tests/test_filters.py +0 -17
  533. nautobot/wireless/filters.py +2 -2
  534. nautobot/wireless/forms.py +1 -1
  535. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +9 -1
  536. nautobot/wireless/tests/test_filters.py +1 -29
  537. nautobot/wireless/views.py +10 -0
  538. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/METADATA +6 -6
  539. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/RECORD +543 -591
  540. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/WHEEL +1 -1
  541. nautobot/core/api/constants.py +0 -11
  542. nautobot/core/jobs/bulk_actions.py +0 -248
  543. nautobot/core/templates/about.html +0 -67
  544. nautobot/core/templates/inc/tenancy_form_panel.html +0 -9
  545. nautobot/core/templates/inc/tenant_table_row.html +0 -11
  546. nautobot/core/utils/querysets.py +0 -64
  547. nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +0 -25
  548. nautobot/dcim/tests/integration/test_controller.py +0 -62
  549. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +0 -71
  550. nautobot/dcim/tests/test_jobs.py +0 -118
  551. nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +0 -22
  552. nautobot/extras/migrations/0121_alter_team_contacts.py +0 -17
  553. nautobot/extras/test_jobs/singleton.py +0 -16
  554. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
  555. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
  556. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
  557. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
  558. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
  559. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
  560. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
  561. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
  562. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
  563. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
  564. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
  565. nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
  566. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
  567. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
  568. nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
  569. nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
  570. nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
  571. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
  572. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -9444
  587. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -9722
  588. nautobot/wireless/tests/integration/__init__.py +0 -0
  589. nautobot/wireless/tests/integration/test_radio_profile.py +0 -42
  590. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/LICENSE.txt +0 -0
  591. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/NOTICE +0 -0
  592. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/entry_points.txt +0 -0
nautobot/core/tables.py CHANGED
@@ -4,6 +4,7 @@ import logging
4
4
  from django.contrib.auth.models import AnonymousUser
5
5
  from django.contrib.contenttypes.fields import GenericForeignKey
6
6
  from django.core.exceptions import FieldDoesNotExist, FieldError
7
+ from django.db import NotSupportedError
7
8
  from django.db.models import Prefetch
8
9
  from django.db.models.fields.related import ForeignKey, RelatedField
9
10
  from django.db.models.fields.reverse_related import ManyToOneRel
@@ -13,15 +14,13 @@ from django.utils.http import urlencode
13
14
  from django.utils.safestring import mark_safe
14
15
  from django.utils.text import Truncator
15
16
  import django_tables2
16
- from django_tables2.data import TableData, TableQuerysetData
17
- from django_tables2.rows import BoundRows
17
+ from django_tables2.data import TableQuerysetData
18
18
  from django_tables2.utils import Accessor, OrderBy, OrderByTuple
19
19
  from tree_queries.models import TreeNode
20
20
 
21
21
  from nautobot.core.models.querysets import count_related
22
22
  from nautobot.core.templatetags import helpers
23
23
  from nautobot.core.utils.lookup import get_model_for_view_name, get_related_field_for_models, get_route_for_model
24
- from nautobot.core.utils.querysets import maybe_prefetch_related, maybe_select_related
25
24
  from nautobot.extras import choices, models
26
25
 
27
26
  logger = logging.getLogger(__name__)
@@ -47,27 +46,8 @@ class BaseTable(django_tables2.Table):
47
46
  user=None,
48
47
  hide_hierarchy_ui=False,
49
48
  order_by=None,
50
- data_transform_callback=None,
51
49
  **kwargs,
52
50
  ):
53
- """
54
- Instantiate a BaseTable.
55
-
56
- Args:
57
- *args (list, optional): Passed through to django_tables2.Table
58
- table_changes_pending (bool): TODO
59
- saved_view (SavedView, optional): TODO
60
- user (User, optional): TODO
61
- hide_hierarchy_ui (bool): Whether to display or hide hierarchy indentation of nested objects.
62
- order_by (list, optional): Field(s) to sort by
63
- data_transform_callback (function, optional): A function that takes the given `data` as an input and
64
- returns new data. Runs after all of the queryset auto-optimization performed by this class.
65
- Used for example in IPAM views to inject "fake" records for "available" Prefixes, IPAddresses, or VLANs.
66
- **kwargs (dict, optional): Passed through to django_tables2.Table
67
- Warning:
68
- Do not modify/set the `base_columns` attribute after BaseTable class is instantiated.
69
- Do not modify/set the `base_columns` attribute after calling super().__init__() of BaseTable class.
70
- """
71
51
  # Add custom field columns
72
52
  model = self._meta.model
73
53
 
@@ -109,14 +89,6 @@ class BaseTable(django_tables2.Table):
109
89
  # Init table
110
90
  super().__init__(*args, order_by=order_by, **kwargs)
111
91
 
112
- if not isinstance(self.data, TableQuerysetData):
113
- # LinkedCountColumns don't work properly if the data is a list of dicts instead of a queryset,
114
- # as they rely on a `queryset.annotate()` call to gather the data.
115
- self.exclude = [
116
- *self.exclude,
117
- *[column.name for column in self.columns if isinstance(column.column, LinkedCountColumn)],
118
- ]
119
-
120
92
  # Don't show hierarchy if we're sorted
121
93
  if order_by is not None and hide_hierarchy_ui is None:
122
94
  hide_hierarchy_ui = True
@@ -150,7 +122,7 @@ class BaseTable(django_tables2.Table):
150
122
  columns = user.get_config(f"tables.{self.__class__.__name__}.columns")
151
123
  if columns:
152
124
  for name, column in self.base_columns.items():
153
- if name in columns and name not in self.exclude:
125
+ if name in columns:
154
126
  self.columns.show(name)
155
127
  else:
156
128
  self.columns.hide(name)
@@ -189,8 +161,7 @@ class BaseTable(django_tables2.Table):
189
161
  logger.error("Couldn't find model for %s", column.column.viewname)
190
162
  continue
191
163
  reverse_lookup = column.column.reverse_lookup or next(iter(column.column.url_params.keys()))
192
- distinct = column.column.distinct
193
- count_fields.append((column.name, column_model, reverse_lookup, distinct))
164
+ count_fields.append((column.name, column_model, reverse_lookup))
194
165
  try:
195
166
  lookup = column.column.lookup or get_related_field_for_models(model, column_model).name
196
167
  # For some reason get_related_field_for_models(Tag, DynamicGroup) gives a M2M with the name
@@ -202,8 +173,7 @@ class BaseTable(django_tables2.Table):
202
173
  if lookup is not None:
203
174
  # Also attempt to prefetch the first matching record for display - see LinkedCountColumn
204
175
  prefetch_fields.append(
205
- # Use order_by() because we don't care about ordering here and it's potentially expensive
206
- Prefetch(lookup, column_model.objects.order_by()[:1], to_attr=f"{lookup}_list")
176
+ Prefetch(lookup, column_model.objects.all()[:1], to_attr=f"{lookup}_list")
207
177
  )
208
178
  continue
209
179
 
@@ -239,46 +209,75 @@ class BaseTable(django_tables2.Table):
239
209
  prefetch_fields.append("__".join(prefetch_path))
240
210
 
241
211
  if select_fields:
242
- queryset = maybe_select_related(queryset, select_fields)
212
+ # Django doesn't allow .select_related() on a QuerySet that had .values()/.values_list() applied, or
213
+ # one that has had union()/intersection()/difference() applied.
214
+ # We can detect and avoid these cases the same way that Django itself does.
215
+ if queryset._fields is not None:
216
+ logger.debug(
217
+ "NOT applying select_related(%s) to %s QuerySet as it includes .values()/.values_list()",
218
+ select_fields,
219
+ model.__name__,
220
+ )
221
+ elif queryset.query.combinator:
222
+ logger.debug(
223
+ "NOT applying select_related(%s) to %s QuerySet as it is a combinator query",
224
+ select_fields,
225
+ model.__name__,
226
+ )
227
+ else:
228
+ logger.debug("Applying .select_related(%s) to %s QuerySet", select_fields, model.__name__)
229
+ # Belt and suspenders - we should have avoided any error cases above, but be safe anyway:
230
+ try:
231
+ queryset = queryset.select_related(*select_fields)
232
+ except (TypeError, ValueError, NotSupportedError) as exc:
233
+ logger.warning(
234
+ "Unexpected error when trying to .select_related() on %s QuerySet: %s",
235
+ model.__name__,
236
+ exc,
237
+ )
243
238
 
244
239
  if prefetch_fields:
245
- queryset = maybe_prefetch_related(queryset, prefetch_fields)
240
+ if queryset.query.combinator:
241
+ logger.debug(
242
+ "NOT applying prefetch_related(%s) to %s QuerySet as it is a combinator query",
243
+ prefetch_fields,
244
+ model.__name__,
245
+ )
246
+ else:
247
+ logger.debug("Applying .prefetch_related(%s) to %s QuerySet", prefetch_fields, model.__name__)
248
+ # Belt and suspenders - we should have avoided any error cases above, but be safe anyway:
249
+ try:
250
+ queryset = queryset.prefetch_related(*prefetch_fields)
251
+ except (AttributeError, TypeError, ValueError, NotSupportedError) as exc:
252
+ logger.warning(
253
+ "Unexpected error when trying to .prefetch_related() on %s QuerySet: %s",
254
+ model.__name__,
255
+ exc,
256
+ )
246
257
 
247
258
  if count_fields:
248
- for column_name, column_model, lookup_name, distinct in count_fields:
259
+ for column_name, column_model, lookup_name in count_fields:
249
260
  if hasattr(queryset.first(), column_name):
250
261
  continue
251
262
  try:
252
263
  logger.debug(
253
- "Applying .annotate(%s=count_related(%s, %r, distinct=%s) to %s QuerySet",
264
+ "Applying .annotate(%s=count_related(%s, %r) to %s QuerySet",
254
265
  column_name,
255
266
  column_model.__name__,
256
267
  lookup_name,
257
- distinct,
258
268
  model.__name__,
259
269
  )
260
- queryset = queryset.annotate(
261
- **{column_name: count_related(column_model, lookup_name, distinct=distinct)}
262
- )
270
+ queryset = queryset.annotate(**{column_name: count_related(column_model, lookup_name)})
263
271
  except FieldError:
264
272
  # No error message logged here as the above is *very much* best-effort
265
273
  pass
266
274
 
267
275
  self.data.data = queryset
268
276
 
269
- # TODO: it would be better if we could apply this transformation and the above queryset optimizations
270
- # **before** calling super().__init__(), but the current implementation works for now, though inelegant.
271
- if data_transform_callback is not None:
272
- self.data = TableData.from_data(data_transform_callback(self.data.data))
273
- self.data.set_table(self)
274
- self.rows = BoundRows(data=self.data, table=self, pinned_data=self.pinned_data)
275
-
276
277
  @property
277
278
  def configurable_columns(self):
278
279
  selected_columns = [
279
- (name, column.verbose_name)
280
- for name, column in self.columns.items()
281
- if name in self.sequence and name not in ["pk", "actions"]
280
+ (name, self.columns[name].verbose_name) for name in self.sequence if name not in ["pk", "actions"]
282
281
  ]
283
282
  available_columns = [
284
283
  (name, column.verbose_name)
@@ -289,7 +288,7 @@ class BaseTable(django_tables2.Table):
289
288
 
290
289
  @property
291
290
  def visible_columns(self):
292
- return [name for name, column in self.columns.items() if column.visible and name not in self.exclude]
291
+ return [name for name in self.sequence if self.columns[name].visible]
293
292
 
294
293
  @property
295
294
  def order_by(self):
@@ -444,7 +443,7 @@ class ChoiceFieldColumn(django_tables2.Column):
444
443
  choices. The CSS class is derived by calling .get_FOO_class() on the row record.
445
444
  """
446
445
 
447
- def render(self, *, record, bound_column, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
446
+ def render(self, record, bound_column, value): # pylint: disable=arguments-differ
448
447
  if value:
449
448
  name = bound_column.name
450
449
  css_class = getattr(record, f"get_{name}_class")()
@@ -491,7 +490,6 @@ class LinkedCountColumn(django_tables2.Column):
491
490
  TODO: this currently does *not* support nested lookups via `__`. That may be solvable in the future.
492
491
  reverse_lookup (str, optional): The reverse lookup parameter to use to derive the count.
493
492
  If not specified, the first key in `url_params` will be implicitly used as the `reverse_lookup` value.
494
- distinct (bool, optional): Parameter passed through to `count_related()`.
495
493
  **kwargs (dict, optional): As the parent Column class.
496
494
 
497
495
  Examples:
@@ -516,37 +514,25 @@ class LinkedCountColumn(django_tables2.Column):
516
514
  # We'd like to do the below but this module isn't currently smart enough to build the right Prefetch()
517
515
  # for a nested lookup:
518
516
  # lookup="circuit_terminations__circuit",
519
- # For the count,
520
- # .annotate(circuit_count=count_related(Circuit, "circuit_terminations__cloud_network", distinct=True))
517
+ # For the count, .annotate(circuit_count=count_related(Circuit, "circuit_terminations__cloud_network"))
521
518
  reverse_lookup="circuit_terminations__cloud_network",
522
- distinct=True,
523
519
  verbose_name="Circuits",
524
520
  )
525
521
  ```
526
522
  """
527
523
 
528
524
  def __init__(
529
- self,
530
- viewname,
531
- *args,
532
- view_kwargs=None,
533
- url_params=None,
534
- lookup=None,
535
- reverse_lookup=None,
536
- distinct=False,
537
- default=None,
538
- **kwargs,
525
+ self, viewname, *args, view_kwargs=None, url_params=None, lookup=None, reverse_lookup=None, default=0, **kwargs
539
526
  ):
540
527
  self.viewname = viewname
541
528
  self.lookup = lookup
542
529
  self.view_kwargs = view_kwargs or {}
543
530
  self.url_params = url_params
544
531
  self.reverse_lookup = reverse_lookup or next(iter(url_params.keys()))
545
- self.distinct = distinct
546
532
  self.model = get_model_for_view_name(self.viewname)
547
533
  super().__init__(*args, default=default, **kwargs)
548
534
 
549
- def render(self, *, bound_column, record, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
535
+ def render(self, bound_column, record, value): # pylint: disable=arguments-differ
550
536
  related_record = None
551
537
  try:
552
538
  lookup = self.lookup or get_related_field_for_models(bound_column._table._meta.model, self.model).name
@@ -630,7 +616,7 @@ class ComputedFieldColumn(django_tables2.Column):
630
616
 
631
617
  super().__init__(*args, **kwargs)
632
618
 
633
- def render(self, *, record): # pylint: disable=arguments-differ # tables2 varies its kwargs
619
+ def render(self, record):
634
620
  return self.computedfield.render({"obj": record})
635
621
 
636
622
 
@@ -649,7 +635,7 @@ class CustomFieldColumn(django_tables2.Column):
649
635
 
650
636
  super().__init__(*args, **kwargs)
651
637
 
652
- def render(self, *, record, bound_column, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
638
+ def render(self, record, bound_column, value): # pylint: disable=arguments-differ
653
639
  if self.customfield.type == choices.CustomFieldTypeChoices.TYPE_BOOLEAN:
654
640
  template = helpers.render_boolean(value)
655
641
  elif self.customfield.type == choices.CustomFieldTypeChoices.TYPE_MULTISELECT:
@@ -680,7 +666,7 @@ class RelationshipColumn(django_tables2.Column):
680
666
  kwargs.setdefault("accessor", Accessor("associations"))
681
667
  super().__init__(orderable=False, *args, **kwargs)
682
668
 
683
- def render(self, *, record, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
669
+ def render(self, record, value): # pylint: disable=arguments-differ
684
670
  # Filter the relationship associations by the relationship instance.
685
671
  # Since associations accessor returns all the relationship associations regardless of the relationship.
686
672
  value = [v for v in value if v.relationship == self.relationship]
@@ -47,6 +47,3 @@
47
47
  <meta name="theme-color" content="#ffffff">
48
48
  <meta charset="UTF-8">
49
49
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
50
- {% if settings.PUBLISH_ROBOTS_TXT %}
51
- <meta name="robots" content="noindex, nofollow">
52
- {% endif %}
@@ -93,7 +93,6 @@
93
93
  <span class="mdi mdi-chevron-down"></span>
94
94
  </a>
95
95
  <ul class="collapse nav-dropdown-menu" id="adminDropdown">
96
- <li><a href="{% url 'about' %}"><i class="mdi mdi-information"></i> About</a></li>
97
96
  <li><a href="{% url 'user:profile' %}"><i class="mdi mdi-account-box"></i> Profile</a></li>
98
97
  {% if request.user.is_staff %}
99
98
  <li><a href="{% url 'worker_status' %}"><i class="mdi mdi-server-network"></i> Worker Status</a></li>
@@ -463,16 +463,6 @@ INSTALLATION_METRICS_ENABLED = is_truthy(os.getenv("NAUTOBOT_INSTALLATION_METRIC
463
463
  #
464
464
  # NAPALM_ARGS = {}
465
465
 
466
- # Expiration date (YYYY-MM-DD) for an active Nautobot support contract with Network to Code.
467
- # Displayed in the About page.
468
- # if (
469
- # "NAUTOBOT_NTC_SUPPORT_CONTRACT_EXPIRATION_DATE" in os.environ
470
- # and os.environ["NAUTOBOT_NTC_SUPPORT_CONTRACT_EXPIRATION_DATE"] != ""
471
- # ):
472
- # NTC_SUPPORT_CONTRACT_EXPIRATION_DATE = datetime.date.fromisoformat(
473
- # os.environ["NAUTOBOT_NTC_SUPPORT_CONTRACT_EXPIRATION_DATE"]
474
- # )
475
-
476
466
  # Default number of objects to display per page of the UI and REST API. Default is 50
477
467
  #
478
468
  # if "NAUTOBOT_PAGINATE_COUNT" in os.environ and os.environ["NAUTOBOT_PAGINATE_COUNT"] != "":
@@ -503,9 +493,6 @@ INSTALLATION_METRICS_ENABLED = is_truthy(os.getenv("NAUTOBOT_INSTALLATION_METRIC
503
493
  # if "NAUTOBOT_PREFER_IPV4" in os.environ and os.environ["NAUTOBOT_PREFER_IPV4"] != "":
504
494
  # PREFER_IPV4 = is_truthy(os.environ["NAUTOBOT_PREFER_IPV4"])
505
495
 
506
- # Publish a simple "no-index" robots.txt for Nautobot?
507
- # PUBLISH_ROBOTS_TXT = is_truthy(os.getenv("NAUTOBOT_PUBLISH_ROBOTS_TXT", "True"))
508
-
509
496
  # Default height and width in pixels of a single rack unit in rendered rack elevations. Defaults are 22 and 230
510
497
  #
511
498
  # if (
@@ -65,10 +65,3 @@
65
65
  </div>
66
66
  {% endif %}
67
67
  {% endblock %}
68
-
69
- {% block javascript %}
70
- {{ block.super }}
71
- <script>
72
- var clipboard = new ClipboardJS('.btn');
73
- </script>
74
- {% endblock %}
@@ -10,7 +10,7 @@
10
10
  }
11
11
  #render_jinja_template_form textarea {
12
12
  resize: vertical;
13
- white-space: pre;
13
+ white-space: nowrap;
14
14
  }
15
15
 
16
16
  </style>
@@ -1,3 +1,3 @@
1
1
  {% load helpers %}
2
2
 
3
- {% if url_name %}<a href="{% url url_name %}?tags={{ tag.name }}">{% endif %}<span class="label" style="color: {{ tag.color|fgcolor }}; background-color: #{{ tag.color }}">{{ tag }}</span>{% if url_name %}</a>{% endif %}
3
+ {% if url_name %}<a href="{% url url_name %}?tags={{ tag.name }}">{% endif %}<span class="label label-default" style="color: {{ tag.color|fgcolor }}; background-color: #{{ tag.color }}">{{ tag }}</span>{% if url_name %}</a>{% endif %}
@@ -330,7 +330,6 @@
330
330
  <small>title for most object views</small>
331
331
  <span class="label label-default">Default</span>
332
332
  <span class="label label-primary">Primary</span>
333
- <span class="label label-transparent">Transparent</span>
334
333
  <span class="label label-success">Success</span>
335
334
  <span class="label label-info">Info</span>
336
335
  <span class="label label-warning">Warning</span>
@@ -341,7 +340,6 @@
341
340
  <small>used for special purposes such as Location detail "badges"</small>
342
341
  <span class="label label-default">Default</span>
343
342
  <span class="label label-primary">Primary</span>
344
- <span class="label label-transparent">Transparent</span>
345
343
  <span class="label label-success">Success</span>
346
344
  <span class="label label-info">Info</span>
347
345
  <span class="label label-warning">Warning</span>
@@ -352,7 +350,6 @@
352
350
  <small>title for object create/edit forms</small>
353
351
  <span class="label label-default">Default</span>
354
352
  <span class="label label-primary">Primary</span>
355
- <span class="label label-transparent">Transparent</span>
356
353
  <span class="label label-success">Success</span>
357
354
  <span class="label label-info">Info</span>
358
355
  <span class="label label-warning">Warning</span>
@@ -363,7 +360,6 @@
363
360
  <small>used in modal titles and a few others</small>
364
361
  <span class="label label-default">Default</span>
365
362
  <span class="label label-primary">Primary</span>
366
- <span class="label label-transparent">Transparent</span>
367
363
  <span class="label label-success">Success</span>
368
364
  <span class="label label-info">Info</span>
369
365
  <span class="label label-warning">Warning</span>
@@ -374,7 +370,6 @@
374
370
  <small>used in user profiles and cable traces</small>
375
371
  <span class="label label-default">Default</span>
376
372
  <span class="label label-primary">Primary</span>
377
- <span class="label label-transparent">Transparent</span>
378
373
  <span class="label label-success">Success</span>
379
374
  <span class="label label-info">Info</span>
380
375
  <span class="label label-warning">Warning</span>
@@ -385,7 +380,6 @@
385
380
  <small>Unused in core</small>
386
381
  <span class="label label-default">Default</span>
387
382
  <span class="label label-primary">Primary</span>
388
- <span class="label label-transparent">Transparent</span>
389
383
  <span class="label label-success">Success</span>
390
384
  <span class="label label-info">Info</span>
391
385
  <span class="label label-warning">Warning</span>
@@ -396,7 +390,6 @@
396
390
  <small>Small text</small>
397
391
  <span class="label label-default">Default</span>
398
392
  <span class="label label-primary">Primary</span>
399
- <span class="label label-transparent">Transparent</span>
400
393
  <span class="label label-success">Success</span>
401
394
  <span class="label label-info">Info</span>
402
395
  <span class="label label-warning">Warning</span>
@@ -890,13 +890,7 @@ def saved_view_modal(
890
890
  "clear_view",
891
891
  ]
892
892
 
893
- view_class = lookup.get_view_for_model(model, "List")
894
- table_name = None
895
- if hasattr(view_class, "table"):
896
- table_name = view_class.table.__name__
897
- if hasattr(view_class, "table_class"):
898
- table_name = view_class.table_class.__name__
899
-
893
+ table_name = lookup.get_table_for_model(model).__name__
900
894
  for param in non_filter_params:
901
895
  if param == "saved_view":
902
896
  current_saved_view_pk = filters_applied.pop(param, None)
@@ -1050,13 +1044,12 @@ def versioned_static(file_path):
1050
1044
 
1051
1045
 
1052
1046
  @register.simple_tag
1053
- def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui, base_depth=0):
1047
+ def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui):
1054
1048
  """Generates a visual representation of a tree record hierarchy using dots.
1055
1049
 
1056
1050
  Args:
1057
1051
  tree_depth (range): A range representing the depth of the tree nodes.
1058
1052
  hide_hierarchy_ui (bool): Indicates whether to hide the hierarchy UI.
1059
- base_depth (int, optional): Starting depth (number of dots to skip rendering).
1060
1053
 
1061
1054
  Returns:
1062
1055
  str: A string containing dots (representing hierarchy levels) if `hide_hierarchy_ui` is False,
@@ -1064,8 +1057,6 @@ def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui, base_depth=0
1064
1057
  """
1065
1058
  if hide_hierarchy_ui or tree_depth == 0:
1066
1059
  return ""
1067
- if isinstance(base_depth, int): # may be an empty string
1068
- tree_depth = tree_depth[base_depth:]
1069
1060
  ui_representation = " ".join(['<i class="mdi mdi-circle-small"></i>' for _ in tree_depth])
1070
1061
  return mark_safe(ui_representation) # noqa: S308 # suspicious-mark-safe-usage, OK here since its just the `i` tag
1071
1062
 
@@ -21,23 +21,23 @@ from nautobot.extras.models import Job, JobResult
21
21
  __all__ = (
22
22
  "APITestCase",
23
23
  "APIViewTestCases",
24
- "FilterTestCases",
25
- "JobClassInfo",
26
- "ModelTestCase",
27
- "ModelViewTestCase",
28
- "NautobotTestCaseMixin",
29
- "NautobotTestClient",
30
- "TestCase",
31
- "ViewTestCases",
32
24
  "create_job_result_and_run_job",
33
25
  "create_test_user",
34
26
  "disable_warnings",
35
27
  "extract_form_failures",
36
28
  "extract_page_body",
29
+ "FilterTestCases",
37
30
  "get_deletable_objects",
38
31
  "get_job_class_and_model",
32
+ "JobClassInfo",
33
+ "ModelTestCase",
34
+ "ModelViewTestCase",
35
+ "NautobotTestCaseMixin",
36
+ "NautobotTestClient",
39
37
  "post_data",
40
38
  "run_job_for_testing",
39
+ "TestCase",
40
+ "ViewTestCases",
41
41
  )
42
42
 
43
43
  # Use the proper swappable User model