nautobot 2.4.5__py3-none-any.whl → 2.4.7__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 (410) hide show
  1. nautobot/apps/forms.py +2 -0
  2. nautobot/circuits/templates/circuits/providernetwork.html +1 -1
  3. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +2 -55
  4. nautobot/circuits/views.py +20 -23
  5. nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +2 -40
  6. nautobot/cloud/views.py +12 -0
  7. nautobot/core/api/mixins.py +10 -0
  8. nautobot/core/api/urls.py +2 -2
  9. nautobot/core/api/views.py +39 -1
  10. nautobot/core/celery/encoders.py +2 -2
  11. nautobot/core/forms/__init__.py +2 -0
  12. nautobot/core/forms/fields.py +23 -7
  13. nautobot/core/forms/utils.py +1 -0
  14. nautobot/core/forms/widgets.py +18 -0
  15. nautobot/core/jobs/bulk_actions.py +1 -1
  16. nautobot/core/management/commands/generate_test_data.py +1 -1
  17. nautobot/core/models/name_color_content_types.py +9 -0
  18. nautobot/core/models/validators.py +7 -0
  19. nautobot/core/settings.py +0 -14
  20. nautobot/core/settings.yaml +0 -28
  21. nautobot/core/tables.py +6 -1
  22. nautobot/core/templates/generic/object_retrieve.html +1 -1
  23. nautobot/core/templates/widgets/sluginput.html +5 -1
  24. nautobot/core/templatetags/helpers.py +15 -1
  25. nautobot/core/testing/api.py +18 -0
  26. nautobot/core/testing/integration.py +6 -2
  27. nautobot/core/tests/nautobot_config.py +0 -2
  28. nautobot/core/tests/runner.py +17 -140
  29. nautobot/core/tests/test_api.py +4 -4
  30. nautobot/core/tests/test_authentication.py +83 -4
  31. nautobot/core/tests/test_forms.py +11 -8
  32. nautobot/core/tests/test_graphql.py +9 -0
  33. nautobot/core/tests/test_jobs.py +7 -0
  34. nautobot/core/ui/object_detail.py +47 -3
  35. nautobot/core/utils/lookup.py +2 -2
  36. nautobot/dcim/factory.py +2 -0
  37. nautobot/dcim/filters/__init__.py +5 -0
  38. nautobot/dcim/forms.py +27 -1
  39. nautobot/dcim/migrations/0068_alter_softwareimagefile_download_url.py +19 -0
  40. nautobot/dcim/migrations/0069_softwareimagefile_external_integration.py +25 -0
  41. nautobot/dcim/models/devices.py +9 -2
  42. nautobot/dcim/models/locations.py +9 -0
  43. nautobot/dcim/tables/devices.py +1 -0
  44. nautobot/dcim/templates/dcim/device_list.html +1 -1
  45. nautobot/dcim/templates/dcim/devicetype.html +1 -1
  46. nautobot/dcim/templates/dcim/manufacturer.html +1 -63
  47. nautobot/dcim/templates/dcim/module_list.html +1 -1
  48. nautobot/dcim/templates/dcim/moduletype_retrieve.html +1 -1
  49. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +4 -0
  50. nautobot/dcim/tests/integration/test_module_bay_position.py +125 -0
  51. nautobot/dcim/tests/test_api.py +74 -31
  52. nautobot/dcim/tests/test_filters.py +2 -0
  53. nautobot/dcim/tests/test_models.py +78 -0
  54. nautobot/dcim/tests/test_views.py +7 -1
  55. nautobot/dcim/urls.py +1 -45
  56. nautobot/dcim/views.py +35 -66
  57. nautobot/extras/choices.py +4 -0
  58. nautobot/extras/filters/__init__.py +6 -0
  59. nautobot/extras/forms/forms.py +83 -11
  60. nautobot/extras/models/customfields.py +10 -9
  61. nautobot/extras/plugins/marketplace_manifest.yml +18 -0
  62. nautobot/extras/signals.py +43 -4
  63. nautobot/extras/tables.py +4 -5
  64. nautobot/extras/tasks.py +4 -2
  65. nautobot/extras/templates/extras/contact_retrieve.html +1 -58
  66. nautobot/extras/templates/extras/exporttemplate.html +1 -53
  67. nautobot/extras/templates/extras/inc/panel_changelog.html +1 -1
  68. nautobot/extras/templates/extras/inc/panel_jobhistory.html +1 -1
  69. nautobot/extras/templates/extras/status.html +1 -37
  70. nautobot/extras/templates/extras/team_retrieve.html +1 -58
  71. nautobot/extras/tests/integration/test_notes.py +1 -1
  72. nautobot/extras/tests/test_api.py +22 -7
  73. nautobot/extras/tests/test_changelog.py +4 -4
  74. nautobot/extras/tests/test_customfields.py +27 -0
  75. nautobot/extras/tests/test_plugins.py +19 -13
  76. nautobot/extras/tests/test_relationships.py +9 -0
  77. nautobot/extras/tests/test_tags.py +2 -2
  78. nautobot/extras/tests/test_views.py +37 -6
  79. nautobot/extras/urls.py +3 -100
  80. nautobot/extras/views.py +111 -133
  81. nautobot/ipam/tables.py +7 -2
  82. nautobot/ipam/templates/ipam/namespace_retrieve.html +0 -41
  83. nautobot/ipam/templates/ipam/service.html +2 -46
  84. nautobot/ipam/templates/ipam/service_edit.html +1 -17
  85. nautobot/ipam/templates/ipam/service_retrieve.html +7 -0
  86. nautobot/ipam/tests/migration/__init__.py +0 -0
  87. nautobot/ipam/tests/migration/test_migrations.py +510 -0
  88. nautobot/ipam/tests/test_api.py +66 -36
  89. nautobot/ipam/tests/test_filters.py +0 -10
  90. nautobot/ipam/tests/test_views.py +44 -2
  91. nautobot/ipam/urls.py +2 -47
  92. nautobot/ipam/utils/migrations.py +185 -152
  93. nautobot/ipam/utils/testing.py +177 -0
  94. nautobot/ipam/views.py +95 -157
  95. nautobot/project-static/css/base.css +5 -0
  96. nautobot/project-static/docs/404.html +0 -2
  97. nautobot/project-static/docs/apps/index.html +0 -2
  98. nautobot/project-static/docs/apps/nautobot-apps.html +0 -2
  99. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +0 -2
  100. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +0 -2
  101. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +0 -2
  102. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +0 -2
  103. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +0 -2
  104. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +0 -2
  105. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +0 -2
  106. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +0 -2
  107. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +0 -2
  108. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +0 -2
  109. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +0 -2
  110. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +0 -2
  111. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +62 -2
  112. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +0 -2
  113. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +0 -2
  114. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +47 -2
  115. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +0 -2
  116. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +0 -2
  117. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +18 -2
  118. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +0 -2
  119. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +70 -5
  120. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +0 -2
  121. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +0 -2
  122. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +0 -2
  123. nautobot/project-static/docs/development/apps/api/configuration-view.html +0 -2
  124. nautobot/project-static/docs/development/apps/api/database-backend-config.html +0 -2
  125. nautobot/project-static/docs/development/apps/api/models/django-admin.html +0 -2
  126. nautobot/project-static/docs/development/apps/api/models/global-search.html +0 -2
  127. nautobot/project-static/docs/development/apps/api/models/graphql.html +0 -2
  128. nautobot/project-static/docs/development/apps/api/models/index.html +0 -2
  129. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +0 -2
  130. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +0 -2
  131. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +0 -2
  132. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +0 -2
  133. nautobot/project-static/docs/development/apps/api/platform-features/index.html +0 -2
  134. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +0 -2
  135. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +0 -2
  136. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +0 -2
  137. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +0 -2
  138. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +0 -2
  139. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +0 -2
  140. nautobot/project-static/docs/development/apps/api/prometheus.html +0 -2
  141. nautobot/project-static/docs/development/apps/api/setup.html +0 -2
  142. nautobot/project-static/docs/development/apps/api/testing.html +0 -89
  143. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +0 -2
  144. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +0 -2
  145. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +0 -2
  146. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +0 -2
  147. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +0 -2
  148. nautobot/project-static/docs/development/apps/api/views/base-template.html +0 -2
  149. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +0 -2
  150. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +0 -2
  151. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +0 -2
  152. nautobot/project-static/docs/development/apps/api/views/index.html +0 -2
  153. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +0 -2
  154. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +0 -2
  155. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +0 -2
  156. nautobot/project-static/docs/development/apps/api/views/notes.html +0 -2
  157. nautobot/project-static/docs/development/apps/api/views/rest-api.html +0 -2
  158. nautobot/project-static/docs/development/apps/api/views/urls.html +0 -2
  159. nautobot/project-static/docs/development/apps/index.html +0 -2
  160. nautobot/project-static/docs/development/apps/migration/code-updates.html +0 -2
  161. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -3
  162. nautobot/project-static/docs/development/apps/migration/from-v1.html +0 -2
  163. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +0 -2
  164. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +0 -2
  165. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +0 -2
  166. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +0 -2
  167. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +0 -2
  168. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +0 -2
  169. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +0 -2
  170. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +0 -2
  171. nautobot/project-static/docs/development/apps/porting-from-netbox.html +0 -2
  172. nautobot/project-static/docs/development/core/application-registry.html +0 -2
  173. nautobot/project-static/docs/development/core/best-practices.html +3 -5
  174. nautobot/project-static/docs/development/core/bootstrap-ui.html +0 -2
  175. nautobot/project-static/docs/development/core/caching.html +0 -2
  176. nautobot/project-static/docs/development/core/controllers.html +0 -2
  177. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +0 -2
  178. nautobot/project-static/docs/development/core/generic-views.html +0 -2
  179. nautobot/project-static/docs/development/core/getting-started.html +78 -109
  180. nautobot/project-static/docs/development/core/homepage.html +0 -2
  181. nautobot/project-static/docs/development/core/index.html +0 -2
  182. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +0 -2
  183. nautobot/project-static/docs/development/core/model-checklist.html +0 -2
  184. nautobot/project-static/docs/development/core/model-features.html +0 -2
  185. nautobot/project-static/docs/development/core/natural-keys.html +0 -2
  186. nautobot/project-static/docs/development/core/navigation-menu.html +0 -2
  187. nautobot/project-static/docs/development/core/release-checklist.html +1 -3
  188. nautobot/project-static/docs/development/core/role-internals.html +0 -2
  189. nautobot/project-static/docs/development/core/settings.html +0 -2
  190. nautobot/project-static/docs/development/core/style-guide.html +1 -3
  191. nautobot/project-static/docs/development/core/templates.html +0 -2
  192. nautobot/project-static/docs/development/core/testing.html +24 -200
  193. nautobot/project-static/docs/development/core/ui-component-framework.html +0 -2
  194. nautobot/project-static/docs/development/core/user-preferences.html +0 -2
  195. nautobot/project-static/docs/development/index.html +0 -2
  196. nautobot/project-static/docs/development/jobs/index.html +0 -2
  197. nautobot/project-static/docs/development/jobs/migration/from-v1.html +0 -2
  198. nautobot/project-static/docs/index.html +0 -2
  199. nautobot/project-static/docs/media/user-guide/administration/getting-started/nautobot-cloud.png +0 -0
  200. nautobot/project-static/docs/objects.inv +0 -0
  201. nautobot/project-static/docs/overview/application_stack.html +1 -3
  202. nautobot/project-static/docs/overview/design_philosophy.html +0 -2
  203. nautobot/project-static/docs/release-notes/index.html +0 -2
  204. nautobot/project-static/docs/release-notes/version-1.0.html +0 -2
  205. nautobot/project-static/docs/release-notes/version-1.1.html +0 -2
  206. nautobot/project-static/docs/release-notes/version-1.2.html +0 -2
  207. nautobot/project-static/docs/release-notes/version-1.3.html +0 -2
  208. nautobot/project-static/docs/release-notes/version-1.4.html +0 -2
  209. nautobot/project-static/docs/release-notes/version-1.5.html +0 -2
  210. nautobot/project-static/docs/release-notes/version-1.6.html +0 -2
  211. nautobot/project-static/docs/release-notes/version-2.0.html +0 -2
  212. nautobot/project-static/docs/release-notes/version-2.1.html +0 -2
  213. nautobot/project-static/docs/release-notes/version-2.2.html +0 -2
  214. nautobot/project-static/docs/release-notes/version-2.3.html +0 -2
  215. nautobot/project-static/docs/release-notes/version-2.4.html +364 -3
  216. nautobot/project-static/docs/search/search_index.json +1 -1
  217. nautobot/project-static/docs/sitemap.xml +290 -290
  218. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  219. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +0 -2
  220. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +0 -2
  221. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +0 -2
  222. nautobot/project-static/docs/user-guide/administration/configuration/index.html +0 -2
  223. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +0 -2
  224. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +2 -50
  225. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +0 -2
  226. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +0 -2
  227. nautobot/project-static/docs/user-guide/administration/guides/docker.html +0 -2
  228. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +0 -2
  229. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +71 -2
  230. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +0 -2
  231. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +0 -2
  232. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +0 -2
  233. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +0 -2
  234. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +0 -2
  235. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +0 -2
  236. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +0 -2
  237. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -3
  238. nautobot/project-static/docs/user-guide/administration/installation/index.html +257 -18
  239. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +0 -2
  240. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +0 -2
  241. nautobot/project-static/docs/user-guide/administration/installation/services.html +0 -2
  242. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +0 -2
  243. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +0 -2
  244. nautobot/project-static/docs/user-guide/administration/security/index.html +0 -2
  245. nautobot/project-static/docs/user-guide/administration/security/notices.html +0 -2
  246. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +1 -3
  247. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +0 -2
  248. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +0 -2
  249. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +0 -2
  250. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +0 -2
  251. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +0 -2
  252. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +0 -2
  253. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +0 -2
  254. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +0 -2
  255. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +0 -2
  256. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +2 -4
  257. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +0 -2
  258. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +0 -2
  259. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +0 -2
  260. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +0 -2
  261. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +0 -2
  262. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +0 -2
  263. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +0 -2
  264. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +0 -2
  265. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +0 -2
  266. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +0 -2
  267. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +0 -2
  268. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +0 -2
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +0 -2
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +0 -2
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +0 -2
  272. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +0 -2
  273. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +0 -2
  274. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +0 -2
  275. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +0 -2
  276. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +0 -2
  277. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +0 -2
  278. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +0 -2
  279. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +0 -2
  280. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +0 -2
  281. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +0 -2
  282. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +0 -2
  283. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +0 -2
  284. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +0 -2
  285. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +0 -2
  286. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +0 -2
  287. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +0 -2
  288. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +0 -2
  289. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +0 -2
  290. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +0 -2
  291. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +0 -2
  292. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +0 -2
  293. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +0 -2
  294. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +0 -2
  295. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +0 -2
  296. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +0 -2
  297. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +0 -2
  298. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +0 -2
  299. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +0 -2
  300. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +0 -2
  301. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +0 -2
  302. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +0 -2
  303. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +0 -2
  304. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +0 -2
  305. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +0 -2
  306. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +0 -2
  307. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -2
  308. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +0 -2
  309. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +0 -2
  310. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +0 -2
  311. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +0 -2
  312. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +0 -2
  313. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +0 -2
  314. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +0 -2
  315. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +0 -2
  316. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +0 -2
  317. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +0 -2
  318. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +0 -2
  319. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +0 -2
  320. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +0 -2
  321. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +0 -2
  322. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +0 -2
  323. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +0 -2
  324. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +0 -2
  325. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +0 -2
  326. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +0 -2
  327. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +0 -2
  328. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +0 -2
  329. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +0 -2
  330. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +0 -2
  331. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +0 -2
  332. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +0 -2
  333. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +0 -2
  334. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +0 -2
  335. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +0 -2
  336. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +11 -13
  337. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +0 -2
  338. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +8 -10
  339. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -2
  340. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +0 -2
  341. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +40 -27
  342. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -6
  343. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -3
  344. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +77 -7
  345. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -3
  346. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +0 -3
  347. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -3
  348. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +0 -2
  349. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +0 -2
  350. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +0 -2
  351. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +0 -2
  352. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -2
  353. nautobot/project-static/docs/user-guide/index.html +89 -4
  354. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +0 -2
  355. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +0 -2
  356. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +0 -2
  357. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +0 -2
  358. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +0 -2
  359. nautobot/project-static/docs/user-guide/platform-functionality/events.html +0 -2
  360. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +0 -2
  361. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +0 -2
  362. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +0 -2
  363. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +0 -2
  364. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +0 -2
  365. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +0 -2
  366. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +0 -2
  367. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +0 -2
  368. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +0 -2
  369. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +0 -2
  370. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +0 -2
  371. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -2
  372. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +0 -2
  373. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +0 -2
  374. nautobot/project-static/docs/user-guide/platform-functionality/note.html +0 -2
  375. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +0 -2
  376. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +0 -2
  377. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +0 -2
  378. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +0 -2
  379. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +0 -2
  380. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +0 -2
  381. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +0 -2
  382. nautobot/project-static/docs/user-guide/platform-functionality/role.html +0 -2
  383. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +0 -2
  384. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +0 -2
  385. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +0 -2
  386. nautobot/project-static/docs/user-guide/platform-functionality/status.html +0 -2
  387. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +0 -2
  388. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +0 -2
  389. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +0 -2
  390. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +0 -2
  391. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +207 -124
  392. nautobot/project-static/js/forms.js +88 -37
  393. nautobot/project-static/js/homepage_layout.js +12 -3
  394. nautobot/virtualization/forms.py +20 -0
  395. nautobot/virtualization/templates/virtualization/clustergroup.html +1 -39
  396. nautobot/virtualization/templates/virtualization/clustertype.html +1 -0
  397. nautobot/virtualization/tests/test_api.py +14 -3
  398. nautobot/virtualization/tests/test_views.py +10 -2
  399. nautobot/virtualization/urls.py +10 -93
  400. nautobot/virtualization/views.py +33 -72
  401. {nautobot-2.4.5.dist-info → nautobot-2.4.7.dist-info}/METADATA +6 -5
  402. {nautobot-2.4.5.dist-info → nautobot-2.4.7.dist-info}/RECORD +407 -402
  403. {nautobot-2.4.5.dist-info → nautobot-2.4.7.dist-info}/WHEEL +1 -1
  404. nautobot/core/tests/performance_baselines.yml +0 -8900
  405. nautobot/dcim/templates/dcim/modulebay_create.html +0 -39
  406. nautobot/ipam/tests/test_migrations.py +0 -462
  407. /nautobot/ipam/templates/ipam/{namespace_ipaddresses.html → namespace_ip_addresses.html} +0 -0
  408. {nautobot-2.4.5.dist-info → nautobot-2.4.7.dist-info}/LICENSE.txt +0 -0
  409. {nautobot-2.4.5.dist-info → nautobot-2.4.7.dist-info}/NOTICE +0 -0
  410. {nautobot-2.4.5.dist-info → nautobot-2.4.7.dist-info}/entry_points.txt +0 -0
@@ -8498,48 +8498,6 @@
8498
8498
  </ul>
8499
8499
  </nav>
8500
8500
 
8501
- </li>
8502
-
8503
- <li class="md-nav__item">
8504
- <a href="#performance-tests" class="md-nav__link">
8505
- <span class="md-ellipsis">
8506
- Performance Tests
8507
- </span>
8508
- </a>
8509
-
8510
- <nav class="md-nav" aria-label="Performance Tests">
8511
- <ul class="md-nav__list">
8512
-
8513
- <li class="md-nav__item">
8514
- <a href="#running-performance-tests" class="md-nav__link">
8515
- <span class="md-ellipsis">
8516
- Running Performance Tests
8517
- </span>
8518
- </a>
8519
-
8520
- </li>
8521
-
8522
- <li class="md-nav__item">
8523
- <a href="#gathering-performance-test-baseline-data" class="md-nav__link">
8524
- <span class="md-ellipsis">
8525
- Gathering Performance Test Baseline Data
8526
- </span>
8527
- </a>
8528
-
8529
- </li>
8530
-
8531
- <li class="md-nav__item">
8532
- <a href="#caveats" class="md-nav__link">
8533
- <span class="md-ellipsis">
8534
- Caveats
8535
- </span>
8536
- </a>
8537
-
8538
- </li>
8539
-
8540
- </ul>
8541
- </nav>
8542
-
8543
8501
  </li>
8544
8502
 
8545
8503
  <li class="md-nav__item">
@@ -9404,48 +9362,6 @@
9404
9362
  </ul>
9405
9363
  </nav>
9406
9364
 
9407
- </li>
9408
-
9409
- <li class="md-nav__item">
9410
- <a href="#performance-tests" class="md-nav__link">
9411
- <span class="md-ellipsis">
9412
- Performance Tests
9413
- </span>
9414
- </a>
9415
-
9416
- <nav class="md-nav" aria-label="Performance Tests">
9417
- <ul class="md-nav__list">
9418
-
9419
- <li class="md-nav__item">
9420
- <a href="#running-performance-tests" class="md-nav__link">
9421
- <span class="md-ellipsis">
9422
- Running Performance Tests
9423
- </span>
9424
- </a>
9425
-
9426
- </li>
9427
-
9428
- <li class="md-nav__item">
9429
- <a href="#gathering-performance-test-baseline-data" class="md-nav__link">
9430
- <span class="md-ellipsis">
9431
- Gathering Performance Test Baseline Data
9432
- </span>
9433
- </a>
9434
-
9435
- </li>
9436
-
9437
- <li class="md-nav__item">
9438
- <a href="#caveats" class="md-nav__link">
9439
- <span class="md-ellipsis">
9440
- Caveats
9441
- </span>
9442
- </a>
9443
-
9444
- </li>
9445
-
9446
- </ul>
9447
- </nav>
9448
-
9449
9365
  </li>
9450
9366
 
9451
9367
  <li class="md-nav__item">
@@ -9476,10 +9392,11 @@
9476
9392
 
9477
9393
 
9478
9394
  <h1 id="testing-nautobot">Testing Nautobot<a class="headerlink" href="#testing-nautobot" title="Permanent link">&para;</a></h1>
9479
- <p>Best practices for developing and maintaining Nautobot's automated unit/integration test suites.</p>
9480
- <p>Unit tests are automated tests written and run to ensure that a section of the Nautobot application (known as the "unit") meets its design and behaves as intended and expected. Most commonly as a developer of or contributor to Nautobot you will be writing unit tests to exercise the code you have written. Unit tests are not meant to test how the application behaves, only the individual blocks of code, therefore use of mock data and phony connections is common in unit test code. As a guiding principle, unit tests should be fast, because they will be executed quite often.</p>
9481
- <p>Integration tests are automated tests written and run to ensure that the Nautobot application behaves as expected when being used as it would be in practice. By contrast to unit tests, where individual units of code are being tested, integration tests rely upon the server code actually running, and web UI clients or API clients to make real connections to the service to exercise actual workflows, such as navigating to the login page, filling out the username/passwords fields, and clicking the "Log In" button.</p>
9395
+ <p>Best practices for developing and maintaining Nautobot's automated test suites.</p>
9396
+ <p><strong>Unit tests</strong> are automated tests written and run to ensure that a section of the Nautobot application (known as the "unit") meets its design and behaves as intended and expected. Most commonly as a developer of or contributor to Nautobot you will be writing unit tests to exercise the code you have written. Unit tests are not meant to test how the application behaves, only the individual blocks of code, therefore use of mock data and phony connections is common in unit test code. As a guiding principle, unit tests should be fast, because they will be executed quite often.</p>
9397
+ <p><strong>Integration tests</strong> are automated tests written and run to ensure that the Nautobot application behaves as expected when being used as it would be in practice. By contrast to unit tests, where individual units of code are being tested, integration tests rely upon the server code actually running, and web UI clients or API clients to make real connections to the service to exercise actual workflows, such as navigating to the login page, filling out the username/passwords fields, and clicking the "Log In" button.</p>
9482
9398
  <p>Integration testing is much more involved, and builds on top of the foundation laid by unit testing. As a guiding principle, integration tests should be comprehensive, because they are the last mile to asserting that Nautobot does what it is advertised to do. Without integration testing, we have to do it all manually, and that's no fun for anyone!</p>
9399
+ <p><strong>Migration tests</strong> are automated tests written and run to ensure that Nautobot database migrations (primarily "data" migrations in particular, as opposed to "schema" migrations) correctly handle various data scenarios. These are "before/after" tests that bring the database to a particular historical state, populate data into this database state, then run the database migrations (simulating an in-place update of Nautobot) and verify that the final state of the database is as expected.</p>
9483
9400
  <h2 id="tagging-tests">Tagging Tests<a class="headerlink" href="#tagging-tests" title="Permanent link">&para;</a></h2>
9484
9401
  <p>By Nautobot convention, <strong>unit</strong> tests must be <a href="https://docs.djangoproject.com/en/stable/topics/testing/tools/#tagging-tests">tagged</a> with <code>unit</code>. The base test case class <code>nautobot.core.testing.TestCase</code> has this tag, therefore any test cases inheriting from that class do not need to be explicitly tagged. All existing view and API test cases in the Nautobot test suite inherit from this class.</p>
9485
9402
  <p>By Nautobot convention, <strong>integration</strong> tests must be <a href="https://docs.djangoproject.com/en/stable/topics/testing/tools/#tagging-tests">tagged</a> with <code>integration</code>. The base test case class <code>nautobot.core.testing.integration.SeleniumTestCase</code> has this tag, therefore any test cases inheriting from that class do not need to be explicitly tagged. All existing integration test cases in the Nautobot test suite inherit from this class.</p>
@@ -9487,7 +9404,11 @@
9487
9404
  <summary>Changed in version 2.0.0</summary>
9488
9405
  <p>The base test classes moved from <code>nautobot.utilities.testing</code> to <code>nautobot.core.testing</code>.</p>
9489
9406
  </details>
9490
- <p>The <code>invoke unittest</code> and <code>invoke integration-test</code> commands are intentionally distinct, and the correct tagging of test cases is essential to enforcing the division between these two test categories. We never want to risk running the unit tests and integration tests at the same time. The isolation from each other is critical to a clean and manageable continuous development cycle.</p>
9407
+ <p>Nautobot's Python-based <strong>migration</strong> tests are built around the <code>django-test-migrations</code> library and its <code>MigratorTestCase</code> class, which has the tag <code>migration_test</code>, therefore any test cases inheriting from that class do not need to be explicitly tagged.</p>
9408
+ <div class="admonition info">
9409
+ <p class="admonition-title">Info</p>
9410
+ <p>There are also a set of "holistic" migration tests executable by the <code>invoke migration-test</code> command; these "tests" consist of nothing more than historical SQL dumps (in the <code>development/datasets/</code> directory) of a fully populated database state that can be used to populate an empty database before running a <code>nautobot-server migrate</code> command and confirming that it raises no errors. This sort of test is fairly crude; in most cases writing a specific <code>MigratorTestCase</code> subclass is to be preferred.</p>
9411
+ </div>
9491
9412
  <h2 id="base-classes-and-code-location">Base Classes and Code Location<a class="headerlink" href="#base-classes-and-code-location" title="Permanent link">&para;</a></h2>
9492
9413
  <table>
9493
9414
  <thead>
@@ -9495,6 +9416,7 @@
9495
9416
  <th>Test Type</th>
9496
9417
  <th>Base Class</th>
9497
9418
  <th>Code Location</th>
9419
+ <th>Test Execution</th>
9498
9420
  </tr>
9499
9421
  </thead>
9500
9422
  <tbody>
@@ -9502,16 +9424,24 @@
9502
9424
  <td>Unit</td>
9503
9425
  <td><code>nautobot.core.testing.TestCase</code> or subclass (see below)</td>
9504
9426
  <td><code>nautobot/APP/tests/test_*.py</code></td>
9427
+ <td><code>invoke tests</code></td>
9505
9428
  </tr>
9506
9429
  <tr>
9507
9430
  <td>Integration</td>
9508
9431
  <td><code>nautobot.core.testing.integration.SeleniumTestCase</code></td>
9509
9432
  <td><code>nautobot/APP/tests/integration/test_*.py</code></td>
9433
+ <td><code>invoke tests --tag integration</code></td>
9434
+ </tr>
9435
+ <tr>
9436
+ <td>Migration</td>
9437
+ <td><code>django_test_migrations.contrib.unittest_case.MigratorTestCase</code></td>
9438
+ <td><code>nautobot/APP/tests/migration/test_*.py</code></td>
9439
+ <td><code>invoke tests --tag migration_test</code></td>
9510
9440
  </tr>
9511
9441
  </tbody>
9512
9442
  </table>
9513
9443
  <ul>
9514
- <li>New unit tests <strong>must always</strong> inherit from <code>nautobot.core.testing.TestCase</code> or one of its subclasses. Do not use <code>django.test.TestCase</code>.<ul>
9444
+ <li>New unit tests <strong>must always</strong> inherit from <code>nautobot.core.testing.TestCase</code> or one of its subclasses. Do not use <code>django.test.TestCase</code> or <code>unittest.TestCase</code>.<ul>
9515
9445
  <li>API view test cases should generally inherit from one or more of the classes in <code>nautobot.core.testing.api.APIViewTestCases</code>.</li>
9516
9446
  <li>Filterset test cases should generally inherit from <code>nautobot.core.testing.filters.FilterTestCases.FilterTestCase</code>.</li>
9517
9447
  <li>Form test cases should generally inherit from <code>nautobot.core.testing.forms.FormTestCases.BaseFormTestCase</code>.</li>
@@ -9525,6 +9455,9 @@
9525
9455
  <summary>Changed in version 2.0.0</summary>
9526
9456
  <p>The base test classes moved from <code>nautobot.utilities.testing</code> to <code>nautobot.core.testing</code>.</p>
9527
9457
  </details>
9458
+ <ul>
9459
+ <li>New migration tests <strong>should generally</strong> inherit from <code>django_test_migrations.contrib.unittest_case.MigratorTestCase</code>; if any other base class is used, you <strong>must</strong> explicitly tag it with the <code>migration_test</code> tag.</li>
9460
+ </ul>
9528
9461
  <h2 id="generic-filter-tests">Generic Filter Tests<a class="headerlink" href="#generic-filter-tests" title="Permanent link">&para;</a></h2>
9529
9462
  <details class="version-added">
9530
9463
  <summary>Added in version 2.0.0</summary>
@@ -9577,14 +9510,14 @@
9577
9510
  <p>In short, we should only have one place in our tests where factories are called, and that's the <code>generate_test_data</code> management command. Individual tests should use standard <code>create()</code> or <code>save()</code> model methods, never factories.</p>
9578
9511
  </div>
9579
9512
  <h3 id="factory-caching">Factory Caching<a class="headerlink" href="#factory-caching" title="Permanent link">&para;</a></h3>
9580
- <p>To reduce the time taken between multiple test runs, a new argument has been added to the <code>nautobot-server test</code> command: <code>--cache-test-fixtures</code>. When running tests with <code>--cache-test-fixtures</code> for the first time, after the factory data has been generated it will be saved to a <code>factory_dump.json</code> file in the <code>development</code> directory. On subsequent runs of unit or integration tests, if <code>--cache-test-fixtures</code> is again specified (hint: it is included by default when running <code>invoke unittest</code> or <code>invoke integration-test</code>), the factory data will be loaded from the file instead of being generated again. This can significantly reduce the time taken to run tests.</p>
9513
+ <p>To reduce the time taken between multiple test runs, a new argument has been added to the <code>nautobot-server test</code> command: <code>--cache-test-fixtures</code>. When running tests with <code>--cache-test-fixtures</code> for the first time, after the factory data has been generated it will be saved to a <code>factory_dump.json</code> file in the <code>development</code> directory. On subsequent runs of unit or integration tests, if <code>--cache-test-fixtures</code> is again specified (hint: it is included by default when running <code>invoke tests</code>), the factory data will be loaded from the file instead of being generated again. This can significantly reduce the time taken to run tests.</p>
9581
9514
  <details class="version-changed">
9582
9515
  <summary>Changed in version 2.2.7 — Hashing of migrations in the factory dump</summary>
9583
9516
  <p>The test runner now calculates a hash of applied database migrations and uses that as a key when creating/locating the factory data file. This serves as a way to avoid inadvertently using cached test data from the wrong branch or wrong set of migrations, and reduces the frequency with which you might need to manually delete the fixture file. For example, the set of migrations present in <code>develop</code> might result in a <code>factory_dump.966e2e1ed4ae5f924d54.json</code>, while those in <code>next</code> might result in <code>factory_dump.72b71317c5f5c047493e.json</code> - both files can coexist, and when you switch between branches during development, the correct one will automatically be selected.</p>
9584
9517
  </details>
9585
9518
  <details class="version-changed">
9586
9519
  <summary>Changed in version 2.3.4 — Factory caching is enabled by default in invoke tasks</summary>
9587
- <p>Factory caching is now enabled by default with the <code>invoke unittest</code> and <code>invoke integration-test</code> commands. To bypass it, either use the <code>--no-cache-test-fixtures</code> argument to <code>invoke unittest</code> or <code>invoke integration-test</code>, or manually remove the <code>development/factory_dump.*.json</code> cache file(s).</p>
9520
+ <p>Factory caching is now enabled by default with the <code>invoke tests</code> command. To bypass it, either use the <code>--no-cache-test-fixtures</code> argument to <code>invoke tests</code>, or manually remove the <code>development/factory_dump.*.json</code> cache file(s).</p>
9588
9521
  </details>
9589
9522
  <div class="admonition tip">
9590
9523
  <p class="admonition-title">Tip</p>
@@ -9594,113 +9527,6 @@
9594
9527
  <li>When the definition of a factory is changed or a new factory is added.</li>
9595
9528
  </ol>
9596
9529
  </div>
9597
- <h2 id="performance-tests">Performance Tests<a class="headerlink" href="#performance-tests" title="Permanent link">&para;</a></h2>
9598
- <h3 id="running-performance-tests">Running Performance Tests<a class="headerlink" href="#running-performance-tests" title="Permanent link">&para;</a></h3>
9599
- <p>Nautobot uses <a href="https://pypi.org/project/django-slowtests/"><code>django-slowtests</code></a> to run performance tests. To run performance tests, you need to install the <code>django-slowtests</code> package.
9600
- Once you install the package, you can do <code>invoke performance-test</code> or <code>invoke unittest --performance-test</code> to run unit tests with <code>NautobotPerformanceTestRunner</code>. The invoke commands will automatically add <code>--testrunner nautobot.core.tests.runner.NautobotPerformanceTestRunner</code> to the <code>coverage run</code> command and this flag will replace the default <code>NautobotTestRunner</code> while retaining all its functionalities with the addition of performance evaluation after test runs.</p>
9601
- <p><code>NautobotPerformanceTestRunner</code> which inherits from <code>DiscoverSlowestTestsRunner</code> will only be available when <code>django-slowtests</code> is installed. The runner measures the time to run unit tests against baselines stored in a designated .yml file (defaults to <code>nautobot/core/tests/performance_baselines.yml</code>) in addition to running the unit tests themselves.</p>
9602
- <div class="admonition warning">
9603
- <p class="admonition-title">Warning</p>
9604
- <p>This functionality requires the installation of the <a href="https://pypi.org/project/django-slowtests/"><code>django-slowtests</code></a> Python package, which is present in Nautobot's own development environment, but is <em>not</em> an inherent dependency of the Nautobot package when installed otherwise, such as into an App's development environment.</p>
9605
- </div>
9606
- <div class="admonition info">
9607
- <p class="admonition-title">Info</p>
9608
- <p><code>invoke performance-test</code> is enabled when <code>django-slowtests</code> is installed and when called, it will run and evaluate the performance of specific unit tests that are tagged with <code>performance</code> i.e. <code>@tag("performance")</code>. <code>invoke unittest --performance-report</code> and <code>invoke integration-test --performance-report</code> will also be enabled and when called, they will generate a performance report for all the tests ran in the terminal.
9609
- If performance baselines for tests are not available:</p>
9610
- </div>
9611
- <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>175 abnormally slower tests:
9612
- <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>Performance baseline for test_account (nautobot.circuits.tests.test_filters.ProviderTestCase) is not available. Test took 0.0758s to run
9613
- <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>Performance baseline for test_asn (nautobot.circuits.tests.test_filters.ProviderTestCase) is not available. Test took 0.0427s to run
9614
- <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.CircuitTerminationTest) is not available. Test took 0.2900s to run
9615
- <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.CircuitTest) is not available. Test took 0.2292s to run
9616
- <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.CircuitTypeTest) is not available. Test took 0.1596s to run
9617
- <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.ProviderNetworkTest) is not available. Test took 0.1897s to run
9618
- <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.ProviderTest) is not available. Test took 0.2092s to run
9619
- <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.CircuitTerminationTest) is not available. Test took 0.1168s to run
9620
- <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.CircuitTest) is not available. Test took 0.2762s to run
9621
- <a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.CircuitTypeTest) is not available. Test took 0.0663s to run
9622
- <a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.ProviderNetworkTest) is not available. Test took 0.0875s to run
9623
- <a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a>...
9624
- </code></pre></div>
9625
- <div class="admonition info">
9626
- <p class="admonition-title">Info</p>
9627
- <p>If performance baselines for tests are available and the time it take to run tests are siginificantly slower than baselines:</p>
9628
- </div>
9629
- <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>12 abnormally slower tests:
9630
- <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>0.9838s test_bulk_import_objects_with_constrained_permission (nautobot.ipam.tests.test_views.VLANTestCase) is significantly slower than the baseline 0.3692s
9631
- <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>1.2548s test_create_multiple_objects_with_constrained_permission (nautobot.dcim.tests.test_views.ConsolePortTestCase) is significantly slower than the baseline 0.5385s
9632
- <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a>1.4289s test_create_multiple_objects_with_constrained_permission (nautobot.dcim.tests.test_views.DeviceBayTestCase) is significantly slower than the baseline 0.5616s
9633
- <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a>1.1551s test_create_multiple_objects_with_constrained_permission (nautobot.dcim.tests.test_views.InventoryItemTestCase) is significantly slower than the baseline 0.5822s
9634
- <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a>1.4712s test_create_multiple_objects_with_constrained_permission (nautobot.dcim.tests.test_views.RearPortTestCase) is significantly slower than the baseline 0.5695s
9635
- <a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a>1.5958s test_create_multiple_objects_with_constrained_permission (nautobot.virtualization.tests.test_views.VMInterfaceTestCase) is significantly slower than the baseline 1.0020s
9636
- <a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a>1.0566s test_create_object_with_constrained_permission (nautobot.virtualization.tests.test_views.VirtualMachineTestCase) is significantly slower than the baseline 0.3627s
9637
- <a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a>...
9638
- </code></pre></div>
9639
- <div class="admonition info">
9640
- <p class="admonition-title">Info</p>
9641
- <p>To output the performance evaluation to a file for later use, i.e. as performance baselines for future test runs, do <code>invoke performance-test --performance-snapshot</code>. This command will collect the <code>names</code> of the test and their <code>execution_time</code> and store them in a .yml file default to <code>report.yml</code>. Subsequently, the data in that file will have to be manually added to the baseline file set at <a href="../../user-guide/administration/configuration/settings.html#test_performance_baseline_file"><code>TEST_PERFORMANCE_BASELINE_FILE</code></a> to be used as baselines in performance tests.</p>
9642
- </div>
9643
- <p>Example output of <code>invoke performance-test --performance-snapshot</code>:</p>
9644
- <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">tests</span><span class="p">:</span>
9645
- <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_account (nautobot.circuits.tests.test_filters.ProviderTestCase)</span>
9646
- <a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.07075</span>
9647
- <a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_asn (nautobot.circuits.tests.test_filters.ProviderTestCase)</span>
9648
- <a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.041262</span>
9649
- <a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_cabled (nautobot.circuits.tests.test_filters.CircuitTerminationTestCase)</span>
9650
- <a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.268673</span>
9651
- <a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_cid (nautobot.circuits.tests.test_filters.CircuitTestCase)</span>
9652
- <a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.116057</span>
9653
- <a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_circuit_id (nautobot.circuits.tests.test_filters.CircuitTerminationTestCase)</span>
9654
- <a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.042665</span>
9655
- <a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_commit_rate (nautobot.circuits.tests.test_filters.CircuitTestCase)</span>
9656
- <a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.047894</span>
9657
- <a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_connected (nautobot.circuits.tests.test_filters.CircuitTerminationTestCase)</span>
9658
- <a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.056196</span>
9659
- <a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_id (nautobot.circuits.tests.test_filters.CircuitTerminationTestCase)</span>
9660
- <a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.03598</span>
9661
- <a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a><span class="nn">...</span>
9662
- </code></pre></div>
9663
- <h3 id="gathering-performance-test-baseline-data">Gathering Performance Test Baseline Data<a class="headerlink" href="#gathering-performance-test-baseline-data" title="Permanent link">&para;</a></h3>
9664
- <p><code>TEST_PERFORMANCE_BASELINE_FILE</code> specifies the file in which performance baselines are stored, defaults to <code>nautobot/core/tests/performance_baselines.yml</code>. Currently, only baselines for those unit tests tagged with <code>performance</code> are stored.</p>
9665
- <p>You can add baselines for your own test to <code>nautobot/core/tests/performance_baselines.yml</code> or have your own baseline yaml file for performance testing by specifying a different file path for <code>TEST_PERFORMANCE_BASELINE_FILE</code> in an App's development/test <code>nautobot_config.py</code>, and store the output of <code>invoke performance-test --performance-snapshot</code> in that file.
9666
- <code>--performance-snapshot</code> flag will store the results of your performance test to a new <code>report.yml</code> and all you need to do is copy/paste the results to the file set by <code>TEST_PERFORMANCE_BASELINE_FILE</code>. Now you have baselines for your own tests!</p>
9667
- <p>Example output of <code>invoke performance-test --performance-snapshot</code>:</p>
9668
- <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">tests</span><span class="p">:</span>
9669
- <a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_account (nautobot.circuits.tests.test_filters.ProviderTestCase)</span>
9670
- <a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.07075</span>
9671
- <a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_asn (nautobot.circuits.tests.test_filters.ProviderTestCase)</span>
9672
- <a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.041262</span>
9673
- <a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_cabled (nautobot.circuits.tests.test_filters.CircuitTerminationTestCase)</span>
9674
- <a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.268673</span>
9675
- <a id="__codelineno-5-8" name="__codelineno-5-8" href="#__codelineno-5-8"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_cid (nautobot.circuits.tests.test_filters.CircuitTestCase)</span>
9676
- <a id="__codelineno-5-9" name="__codelineno-5-9" href="#__codelineno-5-9"></a><span class="w"> </span><span class="nt">execution_time</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.116057</span>
9677
- <a id="__codelineno-5-10" name="__codelineno-5-10" href="#__codelineno-5-10"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">test_circuit_id (nautobot.circuits.tests.test_filters.CircuitTerminationTestCase)</span>
9678
- <a id="__codelineno-5-11" name="__codelineno-5-11" href="#__codelineno-5-11"></a><span class="nn">...</span>
9679
- </code></pre></div>
9680
- <p>if you decide to run <code>invoke unittest --performance-test</code> which will run tests that currently do not have their baselines present in the file, your output could look something like this:</p>
9681
- <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>175 abnormally slower tests:
9682
- <a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>Performance baseline for test_account (nautobot.circuits.tests.test_filters.ProviderTestCase) is not available. Test took 0.0758s to run
9683
- <a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>Performance baseline for test_asn (nautobot.circuits.tests.test_filters.ProviderTestCase) is not available. Test took 0.0427s to run
9684
- <a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.CircuitTerminationTest) is not available. Test took 0.2900s to run
9685
- <a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.CircuitTest) is not available. Test took 0.2292s to run
9686
- <a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.CircuitTypeTest) is not available. Test took 0.1596s to run
9687
- <a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.ProviderNetworkTest) is not available. Test took 0.1897s to run
9688
- <a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a>Performance baseline for test_bulk_create_objects (nautobot.circuits.tests.test_api.ProviderTest) is not available. Test took 0.2092s to run
9689
- <a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.CircuitTerminationTest) is not available. Test took 0.1168s to run
9690
- <a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.CircuitTest) is not available. Test took 0.2762s to run
9691
- <a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.CircuitTypeTest) is not available. Test took 0.0663s to run
9692
- <a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a>Performance baseline for test_bulk_delete_objects (nautobot.circuits.tests.test_api.ProviderNetworkTest) is not available. Test took 0.0875s to run
9693
- <a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a>...
9694
- </code></pre></div>
9695
- <h3 id="caveats">Caveats<a class="headerlink" href="#caveats" title="Permanent link">&para;</a></h3>
9696
- <div class="admonition warning">
9697
- <p class="admonition-title">Warning</p>
9698
- <p><code>django-slowtests</code> is only a <em>development</em> dependency of Nautobot. You cannot run performance tests in a production deployment of Nautobot unless you directly <code>pip install django-slowtests</code> into such a deployment.</p>
9699
- </div>
9700
- <div class="admonition info">
9701
- <p class="admonition-title">Info</p>
9702
- <p>Because Apps also commonly use Nautobot's default test runner <code>NautobotTestRunner</code>, in order to use <code>NautobotPerformanceTestRunner</code> you need to add <code>django-slowtests</code> as a part of your App dev dependencies.</p>
9703
- </div>
9704
9530
  <h2 id="test-code-style">Test Code Style<a class="headerlink" href="#test-code-style" title="Permanent link">&para;</a></h2>
9705
9531
  <ul>
9706
9532
  <li>Use more specific/feature-rich test assertion methods where available (e.g. <code>self.assertInHTML(fragment, html)</code> rather than <code>self.assertTrue(re.search(fragment, html))</code> or <code>assert re.search(fragment, html) is not None</code>).</li>
@@ -9854,8 +9680,6 @@ If performance baselines for tests are not available:</p>
9854
9680
 
9855
9681
  <script src="../../assets/javascripts/bundle.60a45f97.min.js"></script>
9856
9682
 
9857
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9858
-
9859
9683
 
9860
9684
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9861
9685
  document$.subscribe(() => { lightbox.reload() });
@@ -11182,8 +11182,6 @@ It integrates with <code>django_tables2</code> and provides extensive customizat
11182
11182
 
11183
11183
  <script src="../../assets/javascripts/bundle.60a45f97.min.js"></script>
11184
11184
 
11185
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
11186
-
11187
11185
 
11188
11186
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
11189
11187
  document$.subscribe(() => { lightbox.reload() });
@@ -9348,8 +9348,6 @@
9348
9348
 
9349
9349
  <script src="../../assets/javascripts/bundle.60a45f97.min.js"></script>
9350
9350
 
9351
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9352
-
9353
9351
 
9354
9352
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9355
9353
  document$.subscribe(() => { lightbox.reload() });
@@ -9256,8 +9256,6 @@
9256
9256
 
9257
9257
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
9258
9258
 
9259
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9260
-
9261
9259
 
9262
9260
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9263
9261
  document$.subscribe(() => { lightbox.reload() });
@@ -10939,8 +10939,6 @@ Another example of using the nested reference would be to access <a href="../../
10939
10939
 
10940
10940
  <script src="../../assets/javascripts/bundle.60a45f97.min.js"></script>
10941
10941
 
10942
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
10943
-
10944
10942
 
10945
10943
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
10946
10944
  document$.subscribe(() => { lightbox.reload() });
@@ -9822,8 +9822,6 @@
9822
9822
 
9823
9823
  <script src="../../../assets/javascripts/bundle.60a45f97.min.js"></script>
9824
9824
 
9825
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9826
-
9827
9825
 
9828
9826
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9829
9827
  document$.subscribe(() => { lightbox.reload() });
@@ -9467,8 +9467,6 @@ Learn how <a href="apps/index.html">Nautobot Apps</a> can expand Nautobot's func
9467
9467
 
9468
9468
  <script src="assets/javascripts/bundle.60a45f97.min.js"></script>
9469
9469
 
9470
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9471
-
9472
9470
 
9473
9471
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9474
9472
  document$.subscribe(() => { lightbox.reload() });
Binary file
@@ -9267,7 +9267,7 @@
9267
9267
  </tr>
9268
9268
  <tr>
9269
9269
  <td>Application</td>
9270
- <td><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.146 0h3.924v18.166c-2.013.382-3.491.535-5.096.535-4.791 0-7.288-2.166-7.288-6.32 0-4.002 2.65-6.6 6.753-6.6.637 0 1.121.05 1.707.203zm0 9.143a3.9 3.9 0 0 0-1.325-.204c-1.988 0-3.134 1.223-3.134 3.365 0 2.09 1.096 3.236 3.109 3.236.433 0 .79-.025 1.35-.102V9.142zM21.314 6.06v9.098c0 3.134-.229 4.638-.917 5.937-.637 1.249-1.478 2.039-3.211 2.905l-3.644-1.733c1.733-.815 2.574-1.53 3.109-2.625.561-1.121.739-2.421.739-5.835V6.059zM17.39.021h3.924v4.026H17.39z"/></svg></span> Django <br> <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.14 7.5A2.86 2.86 0 0 1 22 10.36v3.78A2.86 2.86 0 0 1 19.14 17H12c0 .39.32.96.71.96H17v1.68a2.86 2.86 0 0 1-2.86 2.86H9.86A2.86 2.86 0 0 1 7 19.64v-3.75a2.85 2.85 0 0 1 2.86-2.85h5.25a2.85 2.85 0 0 0 2.85-2.86V7.5zm-4.28 11.79c-.4 0-.72.3-.72.89s.32.71.72.71a.71.71 0 0 0 .71-.71c0-.59-.32-.89-.71-.89m-10-1.79A2.86 2.86 0 0 1 2 14.64v-3.78A2.86 2.86 0 0 1 4.86 8H12c0-.39-.32-.96-.71-.96H7V5.36A2.86 2.86 0 0 1 9.86 2.5h4.28A2.86 2.86 0 0 1 17 5.36v3.75a2.85 2.85 0 0 1-2.86 2.85H8.89a2.85 2.85 0 0 0-2.85 2.86v2.68zM9.14 5.71c.4 0 .72-.3.72-.89s-.32-.71-.72-.71c-.39 0-.71.12-.71.71s.32.89.71.89"/></svg></span> Python 3.9 - 3.12 supported</td>
9270
+ <td><span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.146 0h3.924v18.166c-2.013.382-3.491.535-5.096.535-4.791 0-7.288-2.166-7.288-6.32 0-4.002 2.65-6.6 6.753-6.6.637 0 1.121.05 1.707.203zm0 9.143a3.9 3.9 0 0 0-1.325-.204c-1.988 0-3.134 1.223-3.134 3.365 0 2.09 1.096 3.236 3.109 3.236.433 0 .79-.025 1.35-.102V9.142zM21.314 6.06v9.098c0 3.134-.229 4.638-.917 5.937-.637 1.249-1.478 2.039-3.211 2.905l-3.644-1.733c1.733-.815 2.574-1.53 3.109-2.625.561-1.121.739-2.421.739-5.835V6.059zM17.39.021h3.924v4.026H17.39z"/></svg></span> Django <br> <span class="twemoji"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.14 7.5A2.86 2.86 0 0 1 22 10.36v3.78A2.86 2.86 0 0 1 19.14 17H12c0 .39.32.96.71.96H17v1.68a2.86 2.86 0 0 1-2.86 2.86H9.86A2.86 2.86 0 0 1 7 19.64v-3.75a2.85 2.85 0 0 1 2.86-2.85h5.25a2.85 2.85 0 0 0 2.85-2.86V7.5zm-4.28 11.79c-.4 0-.72.3-.72.89s.32.71.72.71a.71.71 0 0 0 .71-.71c0-.59-.32-.89-.71-.89m-10-1.79A2.86 2.86 0 0 1 2 14.64v-3.78A2.86 2.86 0 0 1 4.86 8H12c0-.39-.32-.96-.71-.96H7V5.36A2.86 2.86 0 0 1 9.86 2.5h4.28A2.86 2.86 0 0 1 17 5.36v3.75a2.85 2.85 0 0 1-2.86 2.85H8.89a2.85 2.85 0 0 0-2.85 2.86v2.68zM9.14 5.71c.4 0 .72-.3.72-.89s-.32-.71-.72-.71c-.39 0-.71.12-.71.71s.32.89.71.89"/></svg></span> Python 3.9.2 - 3.12 supported</td>
9271
9271
  </tr>
9272
9272
  <tr>
9273
9273
  <td>Database</td>
@@ -9467,8 +9467,6 @@
9467
9467
 
9468
9468
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
9469
9469
 
9470
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9471
-
9472
9470
 
9473
9471
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9474
9472
  document$.subscribe(() => { lightbox.reload() });
@@ -9405,8 +9405,6 @@
9405
9405
 
9406
9406
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
9407
9407
 
9408
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9409
-
9410
9408
 
9411
9409
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9412
9410
  document$.subscribe(() => { lightbox.reload() });
@@ -9509,8 +9509,6 @@
9509
9509
 
9510
9510
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
9511
9511
 
9512
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
9513
-
9514
9512
 
9515
9513
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
9516
9514
  document$.subscribe(() => { lightbox.reload() });
@@ -11328,8 +11328,6 @@
11328
11328
 
11329
11329
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
11330
11330
 
11331
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
11332
-
11333
11331
 
11334
11332
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
11335
11333
  document$.subscribe(() => { lightbox.reload() });
@@ -10818,8 +10818,6 @@
10818
10818
 
10819
10819
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
10820
10820
 
10821
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
10822
-
10823
10821
 
10824
10822
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
10825
10823
  document$.subscribe(() => { lightbox.reload() });
@@ -11525,8 +11525,6 @@
11525
11525
 
11526
11526
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
11527
11527
 
11528
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
11529
-
11530
11528
 
11531
11529
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
11532
11530
  document$.subscribe(() => { lightbox.reload() });
@@ -11692,8 +11692,6 @@
11692
11692
 
11693
11693
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
11694
11694
 
11695
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
11696
-
11697
11695
 
11698
11696
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
11699
11697
  document$.subscribe(() => { lightbox.reload() });
@@ -12167,8 +12167,6 @@
12167
12167
 
12168
12168
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
12169
12169
 
12170
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
12171
-
12172
12170
 
12173
12171
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
12174
12172
  document$.subscribe(() => { lightbox.reload() });
@@ -13197,8 +13197,6 @@ relationship:</p>
13197
13197
 
13198
13198
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
13199
13199
 
13200
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
13201
-
13202
13200
 
13203
13201
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
13204
13202
  document$.subscribe(() => { lightbox.reload() });
@@ -12815,8 +12815,6 @@
12815
12815
 
12816
12816
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
12817
12817
 
12818
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
12819
-
12820
12818
 
12821
12819
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
12822
12820
  document$.subscribe(() => { lightbox.reload() });
@@ -13500,8 +13500,6 @@
13500
13500
 
13501
13501
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
13502
13502
 
13503
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
13504
-
13505
13503
 
13506
13504
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
13507
13505
  document$.subscribe(() => { lightbox.reload() });
@@ -11598,8 +11598,6 @@
11598
11598
 
11599
11599
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
11600
11600
 
11601
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
11602
-
11603
11601
 
11604
11602
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
11605
11603
  document$.subscribe(() => { lightbox.reload() });
@@ -11518,8 +11518,6 @@
11518
11518
 
11519
11519
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
11520
11520
 
11521
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
11522
-
11523
11521
 
11524
11522
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
11525
11523
  document$.subscribe(() => { lightbox.reload() });
@@ -12666,8 +12666,6 @@
12666
12666
 
12667
12667
  <script src="../assets/javascripts/bundle.60a45f97.min.js"></script>
12668
12668
 
12669
- <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
12670
-
12671
12669
 
12672
12670
  <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
12673
12671
  document$.subscribe(() => { lightbox.reload() });