squad 1.72.2__tar.gz → 1.74__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (628) hide show
  1. {squad-1.72.2 → squad-1.74}/CHANGELOG.md +39 -0
  2. {squad-1.72.2/squad.egg-info → squad-1.74}/PKG-INFO +1 -1
  3. {squad-1.72.2 → squad-1.74}/squad/api/rest.py +19 -10
  4. {squad-1.72.2 → squad-1.74}/squad/ci/backend/lava.py +2 -2
  5. {squad-1.72.2 → squad-1.74}/squad/ci/backend/tuxsuite.py +71 -19
  6. {squad-1.72.2 → squad-1.74}/squad/compat.py +14 -0
  7. {squad-1.72.2 → squad-1.74}/squad/core/comparison.py +25 -10
  8. squad-1.74/squad/core/failures.py +28 -0
  9. {squad-1.72.2 → squad-1.74}/squad/core/history.py +32 -26
  10. {squad-1.72.2 → squad-1.74}/squad/core/models.py +1 -1
  11. {squad-1.72.2 → squad-1.74}/squad/core/queries.py +1 -1
  12. {squad-1.72.2 → squad-1.74}/squad/core/tasks/__init__.py +3 -3
  13. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/diff.txt.jinja2 +1 -1
  14. {squad-1.72.2 → squad-1.74}/squad/core/utils.py +1 -1
  15. {squad-1.72.2 → squad-1.74}/squad/frontend/comparison.py +5 -5
  16. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_results_table.jinja2 +0 -4
  17. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build-nav.jinja2 +0 -5
  18. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_history.jinja2 +1 -1
  19. {squad-1.72.2 → squad-1.74}/squad/frontend/templatetags/squad.py +5 -6
  20. {squad-1.72.2 → squad-1.74}/squad/frontend/tests.py +54 -36
  21. {squad-1.72.2 → squad-1.74}/squad/frontend/urls.py +0 -2
  22. {squad-1.72.2 → squad-1.74}/squad/frontend/views.py +42 -46
  23. squad-1.74/squad/version.py +1 -0
  24. {squad-1.72.2 → squad-1.74/squad.egg-info}/PKG-INFO +1 -1
  25. {squad-1.72.2 → squad-1.74}/squad.egg-info/SOURCES.txt +0 -2
  26. {squad-1.72.2 → squad-1.74}/test/api/test_rest.py +34 -12
  27. {squad-1.72.2 → squad-1.74}/test/ci/backend/test_tuxsuite.py +161 -0
  28. {squad-1.72.2 → squad-1.74}/test/core/test_failures.py +4 -8
  29. {squad-1.72.2 → squad-1.74}/test/core/test_history.py +9 -9
  30. {squad-1.72.2 → squad-1.74}/test/frontend/test_basics.py +12 -0
  31. {squad-1.72.2 → squad-1.74}/test/frontend/test_history.py +8 -0
  32. {squad-1.72.2 → squad-1.74}/test/frontend/test_tests.py +34 -0
  33. squad-1.72.2/squad/core/failures.py +0 -32
  34. squad-1.72.2/squad/frontend/failures.py +0 -65
  35. squad-1.72.2/squad/frontend/templates/squad/failures.jinja2 +0 -91
  36. squad-1.72.2/squad/version.py +0 -1
  37. {squad-1.72.2 → squad-1.74}/.ackrc +0 -0
  38. {squad-1.72.2 → squad-1.74}/.coveragerc +0 -0
  39. {squad-1.72.2 → squad-1.74}/.ctags +0 -0
  40. {squad-1.72.2 → squad-1.74}/.dockerignore +0 -0
  41. {squad-1.72.2 → squad-1.74}/.github/workflows/release.yml +0 -0
  42. {squad-1.72.2 → squad-1.74}/.github/workflows/test.yml +0 -0
  43. {squad-1.72.2 → squad-1.74}/.gitignore +0 -0
  44. {squad-1.72.2 → squad-1.74}/.mailmap +0 -0
  45. {squad-1.72.2 → squad-1.74}/.readthedocs.yml +0 -0
  46. {squad-1.72.2 → squad-1.74}/.reuse/dep5 +0 -0
  47. {squad-1.72.2 → squad-1.74}/COPYING +0 -0
  48. {squad-1.72.2 → squad-1.74}/COPYRIGHTS +0 -0
  49. {squad-1.72.2 → squad-1.74}/Dockerfile +0 -0
  50. {squad-1.72.2 → squad-1.74}/LICENSES/GPL-3.0-or-later.txt +0 -0
  51. {squad-1.72.2 → squad-1.74}/LICENSES/MIT.txt +0 -0
  52. {squad-1.72.2 → squad-1.74}/LICENSES/OFL-1.1.txt +0 -0
  53. {squad-1.72.2 → squad-1.74}/MANIFEST.in +0 -0
  54. {squad-1.72.2 → squad-1.74}/Procfile +0 -0
  55. {squad-1.72.2 → squad-1.74}/README.rst +0 -0
  56. {squad-1.72.2 → squad-1.74}/babel.cfg +0 -0
  57. {squad-1.72.2 → squad-1.74}/dev-docker +0 -0
  58. {squad-1.72.2 → squad-1.74}/doc/.gitignore +0 -0
  59. {squad-1.72.2 → squad-1.74}/doc/Makefile +0 -0
  60. {squad-1.72.2 → squad-1.74}/doc/api.rst +0 -0
  61. {squad-1.72.2 → squad-1.74}/doc/ci.rst +0 -0
  62. {squad-1.72.2 → squad-1.74}/doc/conf.py +0 -0
  63. {squad-1.72.2 → squad-1.74}/doc/hacking.rst +0 -0
  64. {squad-1.72.2 → squad-1.74}/doc/index.rst +0 -0
  65. {squad-1.72.2 → squad-1.74}/doc/install.rst +0 -0
  66. {squad-1.72.2 → squad-1.74}/doc/intro.rst +0 -0
  67. {squad-1.72.2 → squad-1.74}/doc/lava_usecase.rst +0 -0
  68. {squad-1.72.2 → squad-1.74}/doc/plugins.rst +0 -0
  69. {squad-1.72.2 → squad-1.74}/doc/quickstart.rst +0 -0
  70. {squad-1.72.2 → squad-1.74}/doc/translating.rst +0 -0
  71. {squad-1.72.2 → squad-1.74}/doc/tuxsuite_usecase.rst +0 -0
  72. {squad-1.72.2 → squad-1.74}/docker-compose.yaml +0 -0
  73. {squad-1.72.2 → squad-1.74}/manage.py +0 -0
  74. {squad-1.72.2 → squad-1.74}/package-lock.json +0 -0
  75. {squad-1.72.2 → squad-1.74}/package.json +0 -0
  76. {squad-1.72.2 → squad-1.74}/pytest.ini +0 -0
  77. {squad-1.72.2 → squad-1.74}/requirements-dev.txt +0 -0
  78. {squad-1.72.2 → squad-1.74}/requirements.txt +0 -0
  79. {squad-1.72.2 → squad-1.74}/scripts/build +0 -0
  80. {squad-1.72.2 → squad-1.74}/scripts/check-ci +0 -0
  81. {squad-1.72.2 → squad-1.74}/scripts/check-ignore +0 -0
  82. {squad-1.72.2 → squad-1.74}/scripts/community_connector/main.js +0 -0
  83. {squad-1.72.2 → squad-1.74}/scripts/community_connector/manifest.json +0 -0
  84. {squad-1.72.2 → squad-1.74}/scripts/dogfood +0 -0
  85. {squad-1.72.2 → squad-1.74}/scripts/get-metrics +0 -0
  86. {squad-1.72.2 → squad-1.74}/scripts/get-tests +0 -0
  87. {squad-1.72.2 → squad-1.74}/scripts/git-build +0 -0
  88. {squad-1.72.2 → squad-1.74}/scripts/pytest +0 -0
  89. {squad-1.72.2 → squad-1.74}/scripts/rabbitmq-server +0 -0
  90. {squad-1.72.2 → squad-1.74}/scripts/release +0 -0
  91. {squad-1.72.2 → squad-1.74}/scripts/release-docker +0 -0
  92. {squad-1.72.2 → squad-1.74}/scripts/squad-config +0 -0
  93. {squad-1.72.2 → squad-1.74}/scripts/test-ci +0 -0
  94. {squad-1.72.2 → squad-1.74}/scripts/test-docker +0 -0
  95. {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-ci-jobs +0 -0
  96. {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-metrics +0 -0
  97. {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-test-data +0 -0
  98. {squad-1.72.2 → squad-1.74}/scripts/testdata/gen-tests +0 -0
  99. {squad-1.72.2 → squad-1.74}/scripts/testdata/setup-dev +0 -0
  100. {squad-1.72.2 → squad-1.74}/scripts/testdata/submit-ci-jobs +0 -0
  101. {squad-1.72.2 → squad-1.74}/scripts/testdata/submit-test-data +0 -0
  102. {squad-1.72.2 → squad-1.74}/scripts/translate +0 -0
  103. {squad-1.72.2 → squad-1.74}/scripts/travis-lava +0 -0
  104. {squad-1.72.2 → squad-1.74}/scripts/update-translation-files +0 -0
  105. {squad-1.72.2 → squad-1.74}/scripts/upload +0 -0
  106. {squad-1.72.2 → squad-1.74}/setup.cfg +0 -0
  107. {squad-1.72.2 → squad-1.74}/setup.py +0 -0
  108. {squad-1.72.2 → squad-1.74}/squad/__init__.py +0 -0
  109. {squad-1.72.2 → squad-1.74}/squad/admin.py +0 -0
  110. {squad-1.72.2 → squad-1.74}/squad/api/__init__.py +0 -0
  111. {squad-1.72.2 → squad-1.74}/squad/api/apps.py +0 -0
  112. {squad-1.72.2 → squad-1.74}/squad/api/ci.py +0 -0
  113. {squad-1.72.2 → squad-1.74}/squad/api/data.py +0 -0
  114. {squad-1.72.2 → squad-1.74}/squad/api/filters.py +0 -0
  115. {squad-1.72.2 → squad-1.74}/squad/api/urls.py +0 -0
  116. {squad-1.72.2 → squad-1.74}/squad/api/utils.py +0 -0
  117. {squad-1.72.2 → squad-1.74}/squad/api/views.py +0 -0
  118. {squad-1.72.2 → squad-1.74}/squad/celery.py +0 -0
  119. {squad-1.72.2 → squad-1.74}/squad/ci/__init__.py +0 -0
  120. {squad-1.72.2 → squad-1.74}/squad/ci/admin.py +0 -0
  121. {squad-1.72.2 → squad-1.74}/squad/ci/apps.py +0 -0
  122. {squad-1.72.2 → squad-1.74}/squad/ci/backend/__init__.py +0 -0
  123. {squad-1.72.2 → squad-1.74}/squad/ci/backend/fake.py +0 -0
  124. {squad-1.72.2 → squad-1.74}/squad/ci/backend/null.py +0 -0
  125. {squad-1.72.2 → squad-1.74}/squad/ci/exceptions.py +0 -0
  126. {squad-1.72.2 → squad-1.74}/squad/ci/management/__init__.py +0 -0
  127. {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/__init__.py +0 -0
  128. {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
  129. {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/listen.py +0 -0
  130. {squad-1.72.2 → squad-1.74}/squad/ci/management/commands/testfetch.py +0 -0
  131. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0001_initial.py +0 -0
  132. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
  133. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0003_backend_name.py +0 -0
  134. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0004_testjob_failure.py +0 -0
  135. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
  136. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
  137. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
  138. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
  139. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0009_slug_pattern.py +0 -0
  140. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
  141. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
  142. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0012_testjob_build.py +0 -0
  143. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0013_testjob_name.py +0 -0
  144. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
  145. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
  146. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
  147. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
  148. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0018_testjob_dates.py +0 -0
  149. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
  150. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
  151. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
  152. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
  153. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
  154. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
  155. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
  156. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
  157. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
  158. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
  159. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
  160. {squad-1.72.2 → squad-1.74}/squad/ci/migrations/__init__.py +0 -0
  161. {squad-1.72.2 → squad-1.74}/squad/ci/models.py +0 -0
  162. {squad-1.72.2 → squad-1.74}/squad/ci/tasks.py +0 -0
  163. {squad-1.72.2 → squad-1.74}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
  164. {squad-1.72.2 → squad-1.74}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
  165. {squad-1.72.2 → squad-1.74}/squad/ci/templatetags/__init__.py +0 -0
  166. {squad-1.72.2 → squad-1.74}/squad/ci/templatetags/filter_jobs.py +0 -0
  167. {squad-1.72.2 → squad-1.74}/squad/ci/utils.py +0 -0
  168. {squad-1.72.2 → squad-1.74}/squad/container_settings.py +0 -0
  169. {squad-1.72.2 → squad-1.74}/squad/core/__init__.py +0 -0
  170. {squad-1.72.2 → squad-1.74}/squad/core/admin.py +0 -0
  171. {squad-1.72.2 → squad-1.74}/squad/core/apps.py +0 -0
  172. {squad-1.72.2 → squad-1.74}/squad/core/callback.py +0 -0
  173. {squad-1.72.2 → squad-1.74}/squad/core/data.py +0 -0
  174. {squad-1.72.2 → squad-1.74}/squad/core/locale/django.pot +0 -0
  175. {squad-1.72.2 → squad-1.74}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
  176. {squad-1.72.2 → squad-1.74}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
  177. {squad-1.72.2 → squad-1.74}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
  178. {squad-1.72.2 → squad-1.74}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  179. {squad-1.72.2 → squad-1.74}/squad/core/management/__init__.py +0 -0
  180. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/__init__.py +0 -0
  181. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/compute_build_summaries.py +0 -0
  182. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/compute_project_statuses.py +0 -0
  183. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/fill_test_metadata.py +0 -0
  184. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
  185. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/import_data.py +0 -0
  186. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/import_data.rst +0 -0
  187. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/migrate_test_runs.py +0 -0
  188. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
  189. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
  190. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/prepdump.py +0 -0
  191. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/send-email.py +0 -0
  192. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/update_project_statuses.py +0 -0
  193. {squad-1.72.2 → squad-1.74}/squad/core/management/commands/users.py +0 -0
  194. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0001_initial.py +0 -0
  195. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
  196. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0003_testrun_log_file.py +0 -0
  197. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0004_group_user_groups.py +0 -0
  198. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0005_token.py +0 -0
  199. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
  200. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
  201. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0008_status.py +0 -0
  202. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
  203. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0010_testrun_datetime.py +0 -0
  204. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
  205. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0012_build_datetime.py +0 -0
  206. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
  207. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
  208. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0015_attachment.py +0 -0
  209. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0016_project_is_public.py +0 -0
  210. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0017_slug_validator.py +0 -0
  211. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0018_build_name.py +0 -0
  212. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0019_build_version.py +0 -0
  213. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0020_build_ordering.py +0 -0
  214. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0021_global_tokens.py +0 -0
  215. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0022_projectstatus.py +0 -0
  216. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0023_subscription.py +0 -0
  217. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
  218. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
  219. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
  220. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
  221. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
  222. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
  223. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
  224. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
  225. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0032_testrun_completed.py +0 -0
  226. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0033_drop_debversion.py +0 -0
  227. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
  228. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0035_remove_build_name.py +0 -0
  229. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0036_status_tests_skip.py +0 -0
  230. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
  231. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
  232. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0039_orderings.py +0 -0
  233. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
  234. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
  235. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
  236. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0043_project_status_build.py +0 -0
  237. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0044_project_html_mail.py +0 -0
  238. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0045_adminsubscription.py +0 -0
  239. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
  240. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
  241. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0048_moderate_notifications.py +0 -0
  242. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
  243. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
  244. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0051_build_status.py +0 -0
  245. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
  246. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
  247. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0054_custom_email_template.py +0 -0
  248. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
  249. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0056_project_description.py +0 -0
  250. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
  251. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
  252. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
  253. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0060_test_log.py +0 -0
  254. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
  255. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
  256. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
  257. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
  258. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
  259. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0066_environment_description.py +0 -0
  260. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
  261. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0068_suite_version.py +0 -0
  262. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0069_suite_metadata.py +0 -0
  263. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
  264. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
  265. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0072_group_description.py +0 -0
  266. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
  267. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0074_add_indexes.py +0 -0
  268. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
  269. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0076_patch_builds.py +0 -0
  270. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0077_knownissue.py +0 -0
  271. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
  272. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
  273. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
  274. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0081_status_has_metrics.py +0 -0
  275. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
  276. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
  277. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
  278. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
  279. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0086_xfail.py +0 -0
  280. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0087_test_known_issues.py +0 -0
  281. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0088_user_subscriptions.py +0 -0
  282. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
  283. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
  284. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
  285. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0092_annotation.py +0 -0
  286. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
  287. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
  288. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
  289. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0096_build_keep_data.py +0 -0
  290. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0097_build_placeholder.py +0 -0
  291. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0098_blank_annotation.py +0 -0
  292. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0099_metricthreshold.py +0 -0
  293. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
  294. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0101_project_project_settings.py +0 -0
  295. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
  296. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0103_populate_project_status.py +0 -0
  297. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0104_delayedreport.py +0 -0
  298. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
  299. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
  300. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
  301. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
  302. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0109_group_member.py +0 -0
  303. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
  304. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
  305. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0112_user_namespaces.py +0 -0
  306. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
  307. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
  308. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
  309. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
  310. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
  311. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0118_project_is_archived.py +0 -0
  312. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0119_i18n.py +0 -0
  313. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0120_buildsummary.py +0 -0
  314. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
  315. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
  316. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
  317. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
  318. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
  319. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
  320. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
  321. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
  322. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
  323. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
  324. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
  325. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
  326. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
  327. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0134_longer_metric_name.py +0 -0
  328. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
  329. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
  330. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
  331. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0138_metric_unit.py +0 -0
  332. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0139_nullable_test_name.py +0 -0
  333. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
  334. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0141_remove_test_name.py +0 -0
  335. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
  336. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0143_attachment_storage.py +0 -0
  337. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0144_attachment_data_null.py +0 -0
  338. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0145_pluginscratch.py +0 -0
  339. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
  340. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
  341. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
  342. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0149_build_patch_url.py +0 -0
  343. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
  344. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0151_callback.py +0 -0
  345. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
  346. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
  347. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
  348. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
  349. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
  350. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0157_remove_metric_name.py +0 -0
  351. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
  352. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
  353. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
  354. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
  355. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
  356. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
  357. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0164_django_update.py +0 -0
  358. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
  359. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0166_build_is_release.py +0 -0
  360. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0167_add_project_datetime.py +0 -0
  361. {squad-1.72.2 → squad-1.74}/squad/core/migrations/0168_add_group_settings.py +0 -0
  362. {squad-1.72.2 → squad-1.74}/squad/core/migrations/__init__.py +0 -0
  363. {squad-1.72.2 → squad-1.74}/squad/core/notification.py +0 -0
  364. {squad-1.72.2 → squad-1.74}/squad/core/plugins.py +0 -0
  365. {squad-1.72.2 → squad-1.74}/squad/core/statistics.py +0 -0
  366. {squad-1.72.2 → squad-1.74}/squad/core/tasks/exceptions.py +0 -0
  367. {squad-1.72.2 → squad-1.74}/squad/core/tasks/notification.py +0 -0
  368. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/base.jinja2 +0 -0
  369. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
  370. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
  371. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
  372. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
  373. {squad-1.72.2 → squad-1.74}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
  374. {squad-1.72.2 → squad-1.74}/squad/core/templatetags/__init__.py +0 -0
  375. {squad-1.72.2 → squad-1.74}/squad/core/templatetags/squad_notification.py +0 -0
  376. {squad-1.72.2 → squad-1.74}/squad/frontend/__init__.py +0 -0
  377. {squad-1.72.2 → squad-1.74}/squad/frontend/__main__.py +0 -0
  378. {squad-1.72.2 → squad-1.74}/squad/frontend/admin.py +0 -0
  379. {squad-1.72.2 → squad-1.74}/squad/frontend/apps.py +0 -0
  380. {squad-1.72.2 → squad-1.74}/squad/frontend/badges.py +0 -0
  381. {squad-1.72.2 → squad-1.74}/squad/frontend/build_settings.py +0 -0
  382. {squad-1.72.2 → squad-1.74}/squad/frontend/ci.py +0 -0
  383. {squad-1.72.2 → squad-1.74}/squad/frontend/extract.py +0 -0
  384. {squad-1.72.2 → squad-1.74}/squad/frontend/forms.py +0 -0
  385. {squad-1.72.2 → squad-1.74}/squad/frontend/group_settings.py +0 -0
  386. {squad-1.72.2 → squad-1.74}/squad/frontend/locale/django.pot +0 -0
  387. {squad-1.72.2 → squad-1.74}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
  388. {squad-1.72.2 → squad-1.74}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
  389. {squad-1.72.2 → squad-1.74}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  390. {squad-1.72.2 → squad-1.74}/squad/frontend/management/__init__.py +0 -0
  391. {squad-1.72.2 → squad-1.74}/squad/frontend/management/commands/__init__.py +0 -0
  392. {squad-1.72.2 → squad-1.74}/squad/frontend/management/commands/get_token.py +0 -0
  393. {squad-1.72.2 → squad-1.74}/squad/frontend/metrics.py +0 -0
  394. {squad-1.72.2 → squad-1.74}/squad/frontend/project_settings.py +0 -0
  395. {squad-1.72.2 → squad-1.74}/squad/frontend/queries.py +0 -0
  396. {squad-1.72.2 → squad-1.74}/squad/frontend/setup.py +0 -0
  397. {squad-1.72.2 → squad-1.74}/squad/frontend/static/compare.css +0 -0
  398. {squad-1.72.2 → squad-1.74}/squad/frontend/static/download +0 -0
  399. {squad-1.72.2 → squad-1.74}/squad/frontend/static/download.conf +0 -0
  400. {squad-1.72.2 → squad-1.74}/squad/frontend/static/favicon.ico +0 -0
  401. {squad-1.72.2 → squad-1.74}/squad/frontend/static/main.css +0 -0
  402. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/attach_select2.js +0 -0
  403. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/build.js +0 -0
  404. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/build_compare.js +0 -0
  405. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/build_list.js +0 -0
  406. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/charts.js +0 -0
  407. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/common.js +0 -0
  408. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/compare.js +0 -0
  409. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/config.js +0 -0
  410. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/annotation.js +0 -0
  411. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
  412. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
  413. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/build_release.js +0 -0
  414. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/cancel.js +0 -0
  415. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/charts.js +0 -0
  416. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/compare.js +0 -0
  417. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/fetch.js +0 -0
  418. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/filter.js +0 -0
  419. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
  420. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
  421. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
  422. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
  423. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/metric.threshold.js +0 -0
  424. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/project_compare.js +0 -0
  425. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/showHide.js +0 -0
  426. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad/table.js +0 -0
  427. {squad-1.72.2 → squad-1.74}/squad/frontend/static/squad_sign.svg +0 -0
  428. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/401.jinja2 +0 -0
  429. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/404.jinja2 +0 -0
  430. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/django/rest_framework/api.html +0 -0
  431. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
  432. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
  433. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
  434. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
  435. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
  436. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
  437. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
  438. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
  439. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
  440. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
  441. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
  442. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
  443. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
  444. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
  445. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
  446. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
  447. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
  448. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
  449. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/base.jinja2 +0 -0
  450. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build.jinja2 +0 -0
  451. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
  452. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
  453. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
  454. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
  455. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/builds.jinja2 +0 -0
  456. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/compare.jinja2 +0 -0
  457. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
  458. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
  459. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
  460. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group.jinja2 +0 -0
  461. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
  462. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
  463. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
  464. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
  465. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
  466. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
  467. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
  468. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/index.jinja2 +0 -0
  469. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
  470. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/login.jinja2 +0 -0
  471. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
  472. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
  473. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project.jinja2 +0 -0
  474. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
  475. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
  476. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
  477. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
  478. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
  479. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
  480. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
  481. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
  482. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
  483. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
  484. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
  485. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
  486. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
  487. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
  488. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
  489. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
  490. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/tests.jinja2 +0 -0
  491. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
  492. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
  493. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
  494. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
  495. {squad-1.72.2 → squad-1.74}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
  496. {squad-1.72.2 → squad-1.74}/squad/frontend/templatetags/__init__.py +0 -0
  497. {squad-1.72.2 → squad-1.74}/squad/frontend/user_settings.py +0 -0
  498. {squad-1.72.2 → squad-1.74}/squad/frontend/utils.py +0 -0
  499. {squad-1.72.2 → squad-1.74}/squad/http.py +0 -0
  500. {squad-1.72.2 → squad-1.74}/squad/jinja2.py +0 -0
  501. {squad-1.72.2 → squad-1.74}/squad/mail.py +0 -0
  502. {squad-1.72.2 → squad-1.74}/squad/manage.py +0 -0
  503. {squad-1.72.2 → squad-1.74}/squad/plugins/__init__.py +0 -0
  504. {squad-1.72.2 → squad-1.74}/squad/plugins/example.py +0 -0
  505. {squad-1.72.2 → squad-1.74}/squad/plugins/gerrit.py +0 -0
  506. {squad-1.72.2 → squad-1.74}/squad/plugins/github.py +0 -0
  507. {squad-1.72.2 → squad-1.74}/squad/plugins/linux_log_parser.py +0 -0
  508. {squad-1.72.2 → squad-1.74}/squad/run/__init__.py +0 -0
  509. {squad-1.72.2 → squad-1.74}/squad/run/__main__.py +0 -0
  510. {squad-1.72.2 → squad-1.74}/squad/run/listener.py +0 -0
  511. {squad-1.72.2 → squad-1.74}/squad/run/scheduler.py +0 -0
  512. {squad-1.72.2 → squad-1.74}/squad/run/worker.py +0 -0
  513. {squad-1.72.2 → squad-1.74}/squad/settings.py +0 -0
  514. {squad-1.72.2 → squad-1.74}/squad/socialaccount.py +0 -0
  515. {squad-1.72.2 → squad-1.74}/squad/urls.py +0 -0
  516. {squad-1.72.2 → squad-1.74}/squad/wsgi.py +0 -0
  517. {squad-1.72.2 → squad-1.74}/squad.egg-info/dependency_links.txt +0 -0
  518. {squad-1.72.2 → squad-1.74}/squad.egg-info/entry_points.txt +0 -0
  519. {squad-1.72.2 → squad-1.74}/squad.egg-info/requires.txt +0 -0
  520. {squad-1.72.2 → squad-1.74}/squad.egg-info/top_level.txt +0 -0
  521. {squad-1.72.2 → squad-1.74}/squad.svg +0 -0
  522. {squad-1.72.2 → squad-1.74}/test/__init__.py +0 -0
  523. {squad-1.72.2 → squad-1.74}/test/api/__init__.py +0 -0
  524. {squad-1.72.2 → squad-1.74}/test/api/benchmarks.csv +0 -0
  525. {squad-1.72.2 → squad-1.74}/test/api/benchmarks.json +0 -0
  526. {squad-1.72.2 → squad-1.74}/test/api/definition.yaml +0 -0
  527. {squad-1.72.2 → squad-1.74}/test/api/metadata.json +0 -0
  528. {squad-1.72.2 → squad-1.74}/test/api/test_ci.py +0 -0
  529. {squad-1.72.2 → squad-1.74}/test/api/test_data.py +0 -0
  530. {squad-1.72.2 → squad-1.74}/test/api/test_run.log +0 -0
  531. {squad-1.72.2 → squad-1.74}/test/api/tests.csv +0 -0
  532. {squad-1.72.2 → squad-1.74}/test/api/tests.json +0 -0
  533. {squad-1.72.2 → squad-1.74}/test/api/tests.py +0 -0
  534. {squad-1.72.2 → squad-1.74}/test/api/tests_log.json +0 -0
  535. {squad-1.72.2 → squad-1.74}/test/api/tests_two.json +0 -0
  536. {squad-1.72.2 → squad-1.74}/test/api/twoline_definition.yaml +0 -0
  537. {squad-1.72.2 → squad-1.74}/test/ci/__init__.py +0 -0
  538. {squad-1.72.2 → squad-1.74}/test/ci/backend/__init__.py +0 -0
  539. {squad-1.72.2 → squad-1.74}/test/ci/backend/example-broken-log.yaml +0 -0
  540. {squad-1.72.2 → squad-1.74}/test/ci/backend/example-lava-log.yaml +0 -0
  541. {squad-1.72.2 → squad-1.74}/test/ci/backend/lava.json +0 -0
  542. {squad-1.72.2 → squad-1.74}/test/ci/backend/test_fake.py +0 -0
  543. {squad-1.72.2 → squad-1.74}/test/ci/backend/test_lava.py +0 -0
  544. {squad-1.72.2 → squad-1.74}/test/ci/backend/test_real_lava.py +0 -0
  545. {squad-1.72.2 → squad-1.74}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
  546. {squad-1.72.2 → squad-1.74}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
  547. {squad-1.72.2 → squad-1.74}/test/ci/test_listen.py +0 -0
  548. {squad-1.72.2 → squad-1.74}/test/ci/test_models.py +0 -0
  549. {squad-1.72.2 → squad-1.74}/test/ci/test_tasks.py +0 -0
  550. {squad-1.72.2 → squad-1.74}/test/core/__init__.py +0 -0
  551. {squad-1.72.2 → squad-1.74}/test/core/test_attachment.py +0 -0
  552. {squad-1.72.2 → squad-1.74}/test/core/test_build.py +0 -0
  553. {squad-1.72.2 → squad-1.74}/test/core/test_build_summary.py +0 -0
  554. {squad-1.72.2 → squad-1.74}/test/core/test_callback.py +0 -0
  555. {squad-1.72.2 → squad-1.74}/test/core/test_emailtemplate.py +0 -0
  556. {squad-1.72.2 → squad-1.74}/test/core/test_group.py +0 -0
  557. {squad-1.72.2 → squad-1.74}/test/core/test_historical_emailtemplate.py +0 -0
  558. {squad-1.72.2 → squad-1.74}/test/core/test_import_data.py +0 -0
  559. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
  560. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
  561. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
  562. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
  563. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
  564. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
  565. {squad-1.72.2 → squad-1.74}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
  566. {squad-1.72.2 → squad-1.74}/test/core/test_known_issues.py +0 -0
  567. {squad-1.72.2 → squad-1.74}/test/core/test_metric.py +0 -0
  568. {squad-1.72.2 → squad-1.74}/test/core/test_metric_comparison.py +0 -0
  569. {squad-1.72.2 → squad-1.74}/test/core/test_metric_threshold.py +0 -0
  570. {squad-1.72.2 → squad-1.74}/test/core/test_metrics_data.py +0 -0
  571. {squad-1.72.2 → squad-1.74}/test/core/test_metrics_summary.py +0 -0
  572. {squad-1.72.2 → squad-1.74}/test/core/test_notification.py +0 -0
  573. {squad-1.72.2 → squad-1.74}/test/core/test_notification_delivery.py +0 -0
  574. {squad-1.72.2 → squad-1.74}/test/core/test_patch_source.py +0 -0
  575. {squad-1.72.2 → squad-1.74}/test/core/test_project.py +0 -0
  576. {squad-1.72.2 → squad-1.74}/test/core/test_project_status.py +0 -0
  577. {squad-1.72.2 → squad-1.74}/test/core/test_statistics.py +0 -0
  578. {squad-1.72.2 → squad-1.74}/test/core/test_tasks.py +0 -0
  579. {squad-1.72.2 → squad-1.74}/test/core/test_tasks_notification.py +0 -0
  580. {squad-1.72.2 → squad-1.74}/test/core/test_test.py +0 -0
  581. {squad-1.72.2 → squad-1.74}/test/core/test_test_comparison.py +0 -0
  582. {squad-1.72.2 → squad-1.74}/test/core/test_test_data.py +0 -0
  583. {squad-1.72.2 → squad-1.74}/test/core/test_test_run.py +0 -0
  584. {squad-1.72.2 → squad-1.74}/test/core/test_test_summary.py +0 -0
  585. {squad-1.72.2 → squad-1.74}/test/core/test_update_project_statuses.py +0 -0
  586. {squad-1.72.2 → squad-1.74}/test/core/test_user_namespace.py +0 -0
  587. {squad-1.72.2 → squad-1.74}/test/core/test_utils.py +0 -0
  588. {squad-1.72.2 → squad-1.74}/test/frontend/__init__.py +0 -0
  589. {squad-1.72.2 → squad-1.74}/test/frontend/test_comparison.py +0 -0
  590. {squad-1.72.2 → squad-1.74}/test/frontend/test_get_token_command.py +0 -0
  591. {squad-1.72.2 → squad-1.74}/test/frontend/test_group_settings.py +0 -0
  592. {squad-1.72.2 → squad-1.74}/test/frontend/test_template_tags.py +0 -0
  593. {squad-1.72.2 → squad-1.74}/test/frontend/test_test_job.py +0 -0
  594. {squad-1.72.2 → squad-1.74}/test/frontend/test_utils.py +0 -0
  595. {squad-1.72.2 → squad-1.74}/test/integration/__init__.py +0 -0
  596. {squad-1.72.2 → squad-1.74}/test/integration/plugins/test_tradefed.py +0 -0
  597. {squad-1.72.2 → squad-1.74}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
  598. {squad-1.72.2 → squad-1.74}/test/integration/test_build_notification_from_ci.py +0 -0
  599. {squad-1.72.2 → squad-1.74}/test/javascript.py +0 -0
  600. {squad-1.72.2 → squad-1.74}/test/karma.conf.js +0 -0
  601. {squad-1.72.2 → squad-1.74}/test/mock.py +0 -0
  602. {squad-1.72.2 → squad-1.74}/test/performance.py +0 -0
  603. {squad-1.72.2 → squad-1.74}/test/plugins/__init__.py +0 -0
  604. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kasan.log +0 -0
  605. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
  606. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
  607. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kernelpanic.log +0 -0
  608. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/kfence.log +0 -0
  609. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
  610. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/oops.log +0 -0
  611. {squad-1.72.2 → squad-1.74}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
  612. {squad-1.72.2 → squad-1.74}/test/plugins/test_gerrit.py +0 -0
  613. {squad-1.72.2 → squad-1.74}/test/plugins/test_github.py +0 -0
  614. {squad-1.72.2 → squad-1.74}/test/plugins/test_linux_log_parser.py +0 -0
  615. {squad-1.72.2 → squad-1.74}/test/plugins/test_plugin.py +0 -0
  616. {squad-1.72.2 → squad-1.74}/test/settings.py +0 -0
  617. {squad-1.72.2 → squad-1.74}/test/test_architecture.py +0 -0
  618. {squad-1.72.2 → squad-1.74}/test/test_code_quality.py +0 -0
  619. {squad-1.72.2 → squad-1.74}/test/test_cors.py +0 -0
  620. {squad-1.72.2 → squad-1.74}/test/test_i18n.py +0 -0
  621. {squad-1.72.2 → squad-1.74}/test/test_mail.py +0 -0
  622. {squad-1.72.2 → squad-1.74}/test/test_pending_migrations.py +0 -0
  623. {squad-1.72.2 → squad-1.74}/test/unit/test_annotation.js +0 -0
  624. {squad-1.72.2 → squad-1.74}/test/unit/test_cancel.js +0 -0
  625. {squad-1.72.2 → squad-1.74}/test/unit/test_charts.js +0 -0
  626. {squad-1.72.2 → squad-1.74}/test/unit/test_compare.js +0 -0
  627. {squad-1.72.2 → squad-1.74}/test/unit/test_filter.js +0 -0
  628. {squad-1.72.2 → squad-1.74}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,42 @@
1
+ # 1.74
2
+
3
+ This 1.74 release patches a couple of pages improving overall performance.
4
+
5
+ It improves loading times of build tests page, test history and build comparison by tests.
6
+
7
+ The release also removes "Test failures" page, given that there's already and API endpoint
8
+ for it and it is cumbersome to maintain an UI for it as well. Finaly, this release removes
9
+ the transitions table from build comparison page, which allowed users to query changes by
10
+ specific transitions. This is too expensive to compute in larger SQUAD instances.
11
+
12
+ Complete list of changes going in:
13
+
14
+ * api/rest.py:
15
+ * fix failures with confidence pagination
16
+ * re-add test id and test run on failures_with_confidence endpoint
17
+ * support looking release builds only
18
+ * backend/tuxsuite.py:
19
+ * avoid making extra requests when retrieving build_name
20
+ * support tuxsuite sanity tests
21
+ * core/failures.py: use past N builds instead past N tests
22
+ * core/history.py: improve history performance
23
+ * frontend/comparison.py: refactor comparison to show off regressions and fixes only
24
+ * frontend/tests.py:
25
+ * allow filtering tests by environment and suite
26
+ * catch non-existant tests
27
+ * reduce query size
28
+ * remove frontend/failures.py: there's an API endpoint for it
29
+
30
+ # 1.73
31
+
32
+ This release fixes a variety of bugs:
33
+
34
+ * flake8: fix misc new flake8 complaints
35
+ * frontend/templatetags: support newer versions of allauth package
36
+ * frontend/views.py: handle requests provinding invalid testrun id
37
+ * templates/notification/diff.txt.jinja2: fix typo when referencing environments from known issues
38
+
39
+
1
40
  # 1.72.2
2
41
 
3
42
  This 1.72.2 release does a few performance improvements in order to
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: squad
3
- Version: 1.72.2
3
+ Version: 1.74
4
4
  Summary: Software Quality Dashboard
5
5
  Home-page: https://github.com/Linaro/squad
6
6
  Author: Antonio Terceiro
@@ -3,7 +3,6 @@ import yaml
3
3
 
4
4
  from django.db.models import Q, F, Value as V, CharField, Prefetch
5
5
  from django.db.models.functions import Concat
6
- from django.db.models.query import prefetch_related_objects
7
6
  from django.db.utils import IntegrityError
8
7
  from django.core import exceptions as core_exceptions
9
8
  from django.core.exceptions import ValidationError
@@ -904,7 +903,10 @@ class BuildViewSet(NestedViewSetMixin, ModelViewSet):
904
903
 
905
904
  * `api/builds/<id>/failures_with_confidence` GET
906
905
 
907
- List of failing tests with confidence scores. List is paginated
906
+ List of failing tests with confidence scores. For each failure SQUAD will look back
907
+ N builds, where N is defined in project settings. List is paginated.
908
+
909
+ * releases_only - when active, look back only on builds with is_release=True
908
910
 
909
911
  * `api/builds/<id>/metrics` GET
910
912
 
@@ -1024,17 +1026,13 @@ class BuildViewSet(NestedViewSetMixin, ModelViewSet):
1024
1026
  result=False,
1025
1027
  ).exclude(
1026
1028
  has_known_issues=True,
1027
- ).only(
1028
- 'metadata__suite', 'metadata__name', 'metadata__id',
1029
1029
  ).order_by(
1030
- 'metadata__suite', 'metadata__name',
1031
- ).values_list(
1032
- 'metadata__suite', 'metadata__name', 'metadata__id', named=True,
1033
- )
1030
+ 'id', 'metadata__suite', 'metadata__name', 'environment__slug',
1031
+ ).distinct()
1034
1032
 
1035
1033
  page = self.paginate_queryset(failures)
1036
- fwc = failures_with_confidence(build.project, build, page)
1037
- prefetch_related_objects(fwc, "known_issues")
1034
+ releases_only = request.GET.get("releases_only")
1035
+ fwc = failures_with_confidence(build.project, build, page, releases_only=releases_only)
1038
1036
  serializer = FailuresWithConfidenceSerializer(fwc, many=True, context={'request': request})
1039
1037
  return self.get_paginated_response(serializer.data)
1040
1038
 
@@ -1393,6 +1391,17 @@ class ConfidenceSerializer(serializers.BaseSerializer):
1393
1391
 
1394
1392
  class FailuresWithConfidenceSerializer(TestSerializer):
1395
1393
  confidence = ConfidenceSerializer()
1394
+ status = None
1395
+
1396
+ class Meta:
1397
+ model = Test
1398
+ exclude = (
1399
+ 'known_issues',
1400
+ 'has_known_issues',
1401
+ 'result',
1402
+ 'url',
1403
+ 'suite',
1404
+ )
1396
1405
 
1397
1406
 
1398
1407
  class TestViewSet(NestedViewSetMixin, ModelViewSet):
@@ -122,12 +122,12 @@ class Backend(BaseBackend):
122
122
  start_time = data.get('start_time', None)
123
123
  end_time = data.get('end_time', None)
124
124
  # convert to datetime
125
- if type(start_time) == str:
125
+ if type(start_time) is str:
126
126
  try:
127
127
  start_time = isoparse(start_time)
128
128
  except ValueError:
129
129
  start_time = None
130
- if type(end_time) == str:
130
+ if type(end_time) is str:
131
131
  try:
132
132
  end_time = isoparse(end_time)
133
133
  except ValueError:
@@ -19,6 +19,7 @@ from cryptography.hazmat.primitives import (
19
19
  from squad.ci.backend.null import Backend as BaseBackend
20
20
  from squad.ci.exceptions import FetchIssue, TemporaryFetchIssue
21
21
  from squad.ci.models import TestJob
22
+ from squad.core.models import TestRun
22
23
 
23
24
 
24
25
  logger = logging.getLogger('squad.ci.backend.tuxsuite')
@@ -146,6 +147,72 @@ class Backend(BaseBackend):
146
147
 
147
148
  return None
148
149
 
150
+ def set_build_name(self, test_job, job_url, results, metadata, settings):
151
+ """
152
+ Tuxsuite allows plans with builds and tests within.
153
+ Some of these plans also support "special tests", which are
154
+ kind a sanity test to run before spinning a heavy load of tests.
155
+
156
+ Here's the default plan hierarchy:
157
+ - build -> tests
158
+
159
+ Now with sanity tests in between:
160
+ - build -> sanity tests -> tests
161
+
162
+ SQUAD needs to get to the build level in
163
+ order to retrieve the build object and finally retrieve
164
+ its build name attribute
165
+ """
166
+
167
+ build_id = results['waiting_for']
168
+ if build_id is None:
169
+ return
170
+
171
+ items = build_id.split('#')
172
+ if len(items) == 2:
173
+ _type = items[0]
174
+ _id = items[1]
175
+ else:
176
+ _type = "BUILD"
177
+ _id = items[0]
178
+
179
+ test_id = results['uid']
180
+
181
+ try:
182
+ # Check if the target build or sanity test is fetched
183
+ job_id = self.generate_job_id(_type.lower(), results)
184
+ job_id = job_id.replace(test_id, _id)
185
+
186
+ candidate = TestRun.objects.get(
187
+ build=test_job.target_build,
188
+ job_id=job_id
189
+ )
190
+
191
+ build_name = candidate.metadata.get('build_name')
192
+ if build_name:
193
+ metadata['build_name'] = build_name
194
+ return
195
+
196
+ except TestRun.DoesNotExist:
197
+ pass
198
+
199
+ # It is a sanity test, an extra request is needed to get build id
200
+ if _type == 'TEST':
201
+ follow_test_url = job_url.replace(test_id, _id)
202
+ test_json = self.fetch_url(follow_test_url).json()
203
+ build_id = test_json.get('waiting_for')
204
+
205
+ build_id = build_id.replace('BUILD#', '')
206
+ build_url = job_url.replace(test_id, build_id).replace('/tests/', '/builds/')
207
+
208
+ build_metadata = self.fetch_url(build_url).json()
209
+
210
+ build_metadata_keys = settings.get('TEST_BUILD_METADATA_KEYS', [])
211
+ metadata.update({k: build_metadata.get(k) for k in build_metadata_keys})
212
+
213
+ if 'toolchain' in build_metadata_keys and 'kconfig' in build_metadata_keys and metadata['build_name'] in [None, '']:
214
+ metadata['build_name'] = self.generate_test_name(build_metadata)
215
+
149
216
  def parse_build_results(self, test_job, job_url, results, settings):
150
217
  required_keys = ['build_status', 'warnings_count', 'download_url', 'retry']
151
218
  self.__check_required_keys__(required_keys, results)
@@ -163,6 +230,7 @@ class Backend(BaseBackend):
163
230
  metadata_keys = settings.get('BUILD_METADATA_KEYS', [])
164
231
  metadata = {k: results.get(k) for k in metadata_keys}
165
232
  metadata['job_url'] = job_url
233
+ metadata['job_id'] = test_job.job_id
166
234
  metadata['config'] = urljoin(results.get('download_url') + '/', 'config')
167
235
  metadata['build_name'] = test_name
168
236
 
@@ -200,6 +268,7 @@ class Backend(BaseBackend):
200
268
  metadata_keys = settings.get('TEST_METADATA_KEYS', [])
201
269
  metadata = {k: results.get(k) for k in metadata_keys}
202
270
  metadata['job_url'] = job_url
271
+ metadata['job_id'] = test_job.job_id
203
272
 
204
273
  # Set job name
205
274
  try:
@@ -227,25 +296,8 @@ class Backend(BaseBackend):
227
296
  # Retrieve TuxRun log
228
297
  logs = self.fetch_url(job_url + '/', 'logs?format=txt').text
229
298
 
230
- # Fetch more metadata if available
231
- if results['waiting_for'] is not None:
232
- build_id = results['waiting_for']
233
-
234
- # Tuxsuite recently has added support for tests depending on other tests
235
- if build_id.startswith('BUILD#') or '#' not in build_id:
236
- _, _, test_id = self.parse_job_id(test_job.job_id)
237
- build_id = build_id.replace('BUILD#', '')
238
- build_url = job_url.replace(test_id, build_id).replace('/tests/', '/builds/')
239
-
240
- # TODO: check if we can save a few seconds by querying a testjob that
241
- # already contains build results
242
- build_metadata = self.fetch_url(build_url).json()
243
-
244
- build_metadata_keys = settings.get('TEST_BUILD_METADATA_KEYS', [])
245
- metadata.update({k: build_metadata.get(k) for k in build_metadata_keys})
246
-
247
- if 'toolchain' in build_metadata_keys and 'kconfig' in build_metadata_keys and metadata['build_name'] in [None, '']:
248
- metadata['build_name'] = self.generate_test_name(build_metadata)
299
+ # Follow up the chain and retrieve build name
300
+ self.set_build_name(test_job, job_url, results, metadata, settings)
249
301
 
250
302
  # Create a boot test
251
303
  boot_test_name = 'boot/' + (metadata.get('build_name') or 'boot')
@@ -2,8 +2,10 @@
2
2
  SQUAD compatibity file
3
3
  """
4
4
  from rest_framework_extensions import __version__ as DRFE_VERSION_STR
5
+ from allauth import __version__ as DAA_VERSION_STR
5
6
 
6
7
  DRFE_VERSION = [int(n) for n in DRFE_VERSION_STR.split(".")]
8
+ DAA_VERSION = [int(n) for n in DAA_VERSION_STR.split(".")]
7
9
 
8
10
  # Handles compatibility for django_restframework_filters
9
11
  try:
@@ -27,3 +29,15 @@ def drf_basename(name):
27
29
  return {"basename": name}
28
30
  else:
29
31
  return {"base_name": name}
32
+
33
+
34
+ def get_socialaccount_provider(providers, socialapp, request):
35
+ """
36
+ Django-allauth 0.55 removed the function `by_id`
37
+ Ref: https://github.com/pennersr/django-allauth/commit/cc5279bb61dba9cf0fafb10f4ae175c018749f1f
38
+ """
39
+
40
+ if DAA_VERSION >= [0, 55]:
41
+ return socialapp.get_provider(request)
42
+ else:
43
+ return providers.registry.by_id(socialapp.provider)
@@ -393,7 +393,7 @@ class TestComparison(BaseComparison):
393
393
 
394
394
  tests = models.Test.objects.filter(test_run_id__in=test_runs_ids.keys()).annotate(
395
395
  suite_slug=F('suite__slug'),
396
- ).prefetch_related('metadata').defer('log')
396
+ ).prefetch_related('metadata').defer('log').order_by()
397
397
 
398
398
  for test in tests:
399
399
  build, env = test_runs_ids.get(test.test_run_id)
@@ -539,6 +539,9 @@ class TestComparison(BaseComparison):
539
539
  # No baseline is present, then no comparison is needed
540
540
  return
541
541
 
542
+ baseline = self.builds[0]
543
+ target = self.builds[1]
544
+
542
545
  query = self.base_sql.copy()
543
546
  query['select'].append('target.result')
544
547
  query['select'].append('target.has_known_issues')
@@ -549,42 +552,54 @@ class TestComparison(BaseComparison):
549
552
  tests = [t for t in models.Test.objects.raw(sql)]
550
553
  prefetch_related_objects(tests, 'metadata', 'suite')
551
554
 
552
- env_ids = []
555
+ env_ids = [t.environment_id for t in tests]
556
+ envs = {e.id: e for e in models.Environment.objects.filter(id__in=env_ids).all()}
557
+ envs_slugs = sorted({e.slug for e in envs.values()})
558
+
559
+ for build in self.builds:
560
+ self.environments[build] = envs_slugs
561
+
553
562
  fixed_tests = defaultdict(set)
554
563
  regressions = defaultdict(set)
555
564
  fixes = defaultdict(set)
556
565
 
557
566
  for test in tests:
558
567
  env_id = test.environment_id
568
+
559
569
  full_name = test.full_name
570
+ if full_name not in self.results:
571
+ self.results[full_name] = OrderedDict()
560
572
 
561
- env_ids.append(env_id)
573
+ baseline_key = (baseline, envs[env_id].slug)
574
+ target_key = (target, envs[env_id].slug)
562
575
 
563
576
  if test.status == 'fail':
564
577
  regressions[env_id].add(full_name)
578
+ self.results[full_name][target_key] = 'fail'
579
+ self.results[full_name][baseline_key] = 'pass'
565
580
  elif test.status == 'pass':
566
581
  fixes[env_id].add(full_name)
567
582
  fixed_tests[env_id].add(test.metadata_id)
583
+ self.results[full_name][target_key] = 'pass'
584
+ self.results[full_name][baseline_key] = 'fail'
568
585
 
569
- environments = {e.id: e for e in models.Environment.objects.filter(id__in=env_ids).all()}
586
+ self.results = OrderedDict(sorted(self.results.items()))
570
587
 
571
588
  for env_id in regressions.keys():
572
- self.__regressions__[environments[env_id].slug] = list(regressions[env_id])
589
+ self.__regressions__[envs[env_id].slug] = list(regressions[env_id])
573
590
 
574
591
  # It's not a fix if baseline test is intermittent for a given environment:
575
592
  # - test.has_known_issues == True and
576
593
  # - test.known_issues[env].intermittent == True
577
- fixed_tests_environment_slugs = [environments[env_id] for env_id in fixed_tests.keys()]
594
+ fixed_tests_environment_slugs = [envs[env_id] for env_id in fixed_tests.keys()]
578
595
  intermittent_fixed_tests = self.__intermittent_fixed_tests__(fixed_tests, fixed_tests_environment_slugs)
579
596
  for env_id in fixes.keys():
580
- env_slug = environments[env_id].slug
597
+ env_slug = envs[env_id].slug
581
598
  test_list = [test for test in fixes[env_id] if (test, env_slug) not in intermittent_fixed_tests]
582
599
  if len(test_list):
583
600
  self.__fixes__[env_slug] = test_list
584
601
 
585
- baseline = self.builds[0]
586
- target = self.builds[1]
587
- for env in environments.values():
602
+ for env in envs.values():
588
603
  if env.slug in self.__regressions__:
589
604
  for test in self.__regressions__[env.slug]:
590
605
  self.__diff__[test][target][env.slug] = False
@@ -0,0 +1,28 @@
1
+ from django.db.models import prefetch_related_objects
2
+
3
+ from squad.core.models import Test
4
+
5
+
6
+ def failures_with_confidence(project, build, failures, releases_only=False):
7
+ limit = project.build_confidence_count
8
+ threshold = project.build_confidence_threshold
9
+
10
+ prefetch_related_objects(failures, "metadata")
11
+
12
+ queryset = project.builds.filter(id__lt=build.id)
13
+ if releases_only:
14
+ queryset = queryset.filter(is_release=True)
15
+ builds = queryset.order_by('-id').all()[:limit]
16
+ builds_ids = [b.id for b in builds]
17
+
18
+ # Find previous `limit` tests that contain this test x environment
19
+ for failure in failures:
20
+ history = Test.objects.filter(
21
+ build_id__in=builds_ids,
22
+ metadata_id=failure.metadata_id,
23
+ environment_id=failure.environment_id,
24
+ ).only("result").order_by()
25
+
26
+ failure.set_confidence(threshold, history)
27
+
28
+ return failures
@@ -1,9 +1,9 @@
1
- from collections import OrderedDict
1
+ from collections import defaultdict
2
2
  from django.core.paginator import Paginator
3
3
 
4
4
  from squad.core.queries import test_confidence
5
5
  from squad.core.utils import parse_name
6
- from squad.core.models import Test, SuiteMetadata, KnownIssue
6
+ from squad.core.models import SuiteMetadata, KnownIssue, Environment
7
7
 
8
8
 
9
9
  class TestResult(object):
@@ -11,20 +11,20 @@ class TestResult(object):
11
11
  __test__ = False
12
12
 
13
13
  class TestRunStatus(object):
14
- def __init__(self, test_run, suite):
15
- self.test_run = test_run
14
+ def __init__(self, test_run_id, suite):
15
+ self.test_run_id = test_run_id
16
16
  self.suite = suite
17
17
 
18
- def __init__(self, test, suite, metadata, known_issues, is_duplicate=False):
18
+ def __init__(self, test, suite, metadata, known_issues, is_duplicate=False, list_of_duplicates=None):
19
19
  self.test = test
20
20
  self.suite = suite
21
21
  self.known_issues = known_issues
22
22
  if is_duplicate:
23
- self.status, self.confidence_score = test_confidence(test)
23
+ self.status, self.confidence_score = test_confidence(None, list_of_duplicates=list_of_duplicates)
24
24
  else:
25
25
  self.status, self.confidence_score = (test.status, None)
26
- self.test_run = test.test_run
27
- self.test_run_status = self.TestRunStatus(self.test_run, self.suite)
26
+ self.test_run_id = test.test_run_id
27
+ self.test_run_status = self.TestRunStatus(self.test_run_id, self.suite)
28
28
  self.info = {
29
29
  "test_description": metadata.description if metadata else '',
30
30
  "test_instructions": metadata.instructions_to_reproduce if metadata else '',
@@ -51,11 +51,6 @@ class TestHistory(object):
51
51
 
52
52
  self.top = builds[0]
53
53
 
54
- environments = OrderedDict()
55
- results = OrderedDict()
56
- for build in builds:
57
- results[build] = {}
58
-
59
54
  issues_by_env = {}
60
55
  for issue in KnownIssue.active_by_project_and_test(project, full_test_name).all():
61
56
  for env in issue.environments.all():
@@ -65,16 +60,27 @@ class TestHistory(object):
65
60
 
66
61
  suite = project.suites.prefetch_related('metadata').get(slug=suite_slug)
67
62
  metadata = SuiteMetadata.objects.get(kind='test', suite=suite_slug, name=test_name)
68
- tests = Test.objects.filter(build__in=builds, metadata_id=metadata.id).prefetch_related('build', 'environment', 'test_run', 'metadata').order_by()
69
- for test in tests:
70
- build = test.build
71
- environment = test.environment
72
- environments[environment] = True
73
- known_issues = issues_by_env.get(environment.id)
74
- is_duplicate = False
75
- if environment in results[build]:
76
- is_duplicate = True
77
- results[build][environment] = TestResult(test, suite, metadata, known_issues, is_duplicate)
78
-
79
- self.environments = sorted(environments.keys(), key=lambda env: env.slug)
80
- self.results = results
63
+
64
+ results = defaultdict()
65
+ environments_ids = set()
66
+ for build in builds:
67
+ results[build] = defaultdict(list)
68
+ for test in build.tests.filter(metadata=metadata).order_by():
69
+ test.metadata = metadata
70
+ test.suite = suite
71
+ results[build][test.environment_id].append(test)
72
+ environments_ids.add(test.environment_id)
73
+
74
+ results_without_duplicates = defaultdict()
75
+ for build in results:
76
+ results_without_duplicates[build] = defaultdict()
77
+ for env in results[build]:
78
+ tests = results[build][env]
79
+
80
+ is_duplicate = len(tests) > 1
81
+ known_issues = issues_by_env.get(tests[0].environment_id)
82
+ result = TestResult(tests[0], suite, metadata, known_issues, is_duplicate, list_of_duplicates=tests)
83
+ results_without_duplicates[build][env] = result
84
+
85
+ self.environments = Environment.objects.filter(id__in=environments_ids).order_by('slug')
86
+ self.results = results_without_duplicates
@@ -1025,7 +1025,7 @@ class Test(models.Model):
1025
1025
 
1026
1026
  @property
1027
1027
  def passes(self):
1028
- return sum(1 for t in self.tests if t.status == "pass")
1028
+ return sum(1 for t in self.tests if t.result)
1029
1029
 
1030
1030
  @property
1031
1031
  def score(self):
@@ -199,7 +199,7 @@ def test_confidence(test, list_of_duplicates=None):
199
199
  return {value: count for value, count in data.items() if count == max_count}
200
200
 
201
201
  if test:
202
- duplicates = models.Test.objects.filter(metadata=test.metadata, environment=test.environment, build=test.build).order_by()
202
+ duplicates = models.Test.objects.filter(metadata_id=test.metadata_id, environment_id=test.environment_id, build_id=test.build_id).order_by()
203
203
  else:
204
204
  duplicates = list_of_duplicates
205
205
 
@@ -72,7 +72,7 @@ class ValidateTestRun(object):
72
72
  except json.decoder.JSONDecodeError as e:
73
73
  raise exceptions.InvalidMetadataJSON("metadata is not valid JSON: " + str(e) + "\n" + metadata_json)
74
74
 
75
- if type(metadata) != dict:
75
+ if type(metadata) is not dict:
76
76
  raise exceptions.InvalidMetadata("metadata is not a object ({})")
77
77
 
78
78
  if "job_id" in metadata.keys():
@@ -87,7 +87,7 @@ class ValidateTestRun(object):
87
87
  except json.decoder.JSONDecodeError as e:
88
88
  raise exceptions.InvalidMetricsDataJSON("metrics is not valid JSON: " + str(e) + "\n" + metrics_file)
89
89
 
90
- if type(metrics) != dict:
90
+ if type(metrics) is not dict:
91
91
  raise exceptions.InvalidMetricsData.type(metrics)
92
92
 
93
93
  for metric, value_dict in metrics.items():
@@ -113,7 +113,7 @@ class ValidateTestRun(object):
113
113
  except json.decoder.JSONDecodeError as e:
114
114
  raise exceptions.InvalidTestsDataJSON("tests is not valid JSON: " + str(e) + "\n" + tests_file)
115
115
 
116
- if type(tests) != dict:
116
+ if type(tests) is not dict:
117
117
  raise exceptions.InvalidTestsData.type(tests)
118
118
 
119
119
 
@@ -24,7 +24,7 @@ Failures
24
24
  {% if summary.failures %}
25
25
  {% for env, tests in summary.failures.items() %}{{env}}:
26
26
  {% for test in tests %}
27
- * {{test.full_name}}{% for issue in known_issues %}{% if issue.test_name == test.full_name %}{% for issue_environment in issue.environment.all() %}{% if env == issue_environment.slug %}
27
+ * {{test.full_name}}{% for issue in known_issues %}{% if issue.test_name == test.full_name %}{% for issue_environment in issue.environments.all() %}{% if env == issue_environment.slug %}
28
28
  * Known issue: {{issue.title}}{% if issue.url %} {{issue.url}}{% endif %}{% if issue.intermittent %} (intermittent){% endif %}{% endif %}{% endfor %}{% endif %}{% endfor %}{% endfor %}
29
29
  {% endfor %}
30
30
  {% else %}
@@ -170,7 +170,7 @@ def log_deletion(request, object, message):
170
170
 
171
171
  def storage_save(obj, storage_field, filename, content):
172
172
  content_bytes = content or ''
173
- if type(content_bytes) == str:
173
+ if type(content_bytes) is str:
174
174
  content_bytes = content_bytes.encode()
175
175
  filename = '%s/%s/%s' % (obj.__class__.__name__.lower(), obj.pk, filename)
176
176
  storage_field.save(filename, ContentFile(content_bytes))
@@ -116,11 +116,11 @@ def compare_builds(request):
116
116
  baseline = get_object_or_404(project.builds, version=baseline_build)
117
117
  target = get_object_or_404(project.builds, version=target_build)
118
118
 
119
- comparison_class = __get_comparison_class(comparison_type)
120
- comparison = comparison_class.compare_builds(baseline, target)
121
-
122
- if comparison_type == 'test' and len(transitions):
123
- comparison.apply_transitions([t for t, checked in transitions.items() if checked])
119
+ if comparison_type == 'test':
120
+ comparison = TestComparison(baseline, target, regressions_and_fixes_only=True)
121
+ else:
122
+ comparison_class = __get_comparison_class(comparison_type)
123
+ comparison = comparison_class.compare_builds(baseline, target)
124
124
 
125
125
  comparison.results = __paginate(comparison.results, request)
126
126
 
@@ -1,9 +1,5 @@
1
1
  {% if comparison %}
2
2
 
3
- {% if comparison_type == 'test' %}
4
- {% include "squad/_results_transitions_filter.jinja2" %}
5
- {% endif %}
6
-
7
3
  <table class='test-results'>
8
4
  <thead>
9
5
  <tr>
@@ -103,11 +103,6 @@
103
103
  {{ _('Tests') }}
104
104
  </a>
105
105
  </li>
106
- <li role="presentation" {% if url_name == 'failures' %}class="active"{% endif %}>
107
- <a href="{{build_section_url(build, 'failures')}}">
108
- {{ _('Test failures') }}
109
- </a>
110
- </li>
111
106
  <li role="presentation" {% if url_name == 'build_metrics' %}class="active"{% endif %}>
112
107
  <a href="{{build_section_url(build, 'build_metrics')}}">
113
108
  {{ _('Metrics') }}
@@ -39,7 +39,7 @@
39
39
  <td><a href="{{project_url(build)}}">{{build.version}}</a></td>
40
40
  <td>{{build.datetime|date}}</td>
41
41
  {% for environment in history.environments %}
42
- {% with result=results[environment] %}
42
+ {% with result=results[environment.id] %}
43
43
  {% if result %}
44
44
  {% with known_issues=result.known_issues %}
45
45
  <td class='{{result.status|slugify}}'>
@@ -14,6 +14,7 @@ from allauth.socialaccount import providers
14
14
 
15
15
 
16
16
  from squad import version
17
+ from squad.compat import get_socialaccount_provider
17
18
  from squad.core.models import Test, Build
18
19
  from squad.core.utils import format_metadata
19
20
  from squad.jinja2 import register_global_function, register_filter
@@ -81,14 +82,12 @@ def testrun_suite_test_details_history_url(group, project, build, status, test):
81
82
 
82
83
 
83
84
  def testrun_suite_or_test_url(group, project, build, status, kind, test=None):
84
- testrun = status.test_run.id
85
- suite = status.suite
86
85
  args = (
87
86
  group.slug,
88
87
  project.slug,
89
88
  build.version,
90
- testrun,
91
- suite.slug.replace('/', '$'),
89
+ status.test_run_id,
90
+ status.suite.slug.replace('/', '$'),
92
91
  )
93
92
  if test:
94
93
  if isinstance(test, Test):
@@ -272,7 +271,7 @@ def to_json(d):
272
271
  def socialaccount_providers(context):
273
272
  request = context['request']
274
273
  return_dict = {}
275
- for backend in SocialApp.objects.all():
276
- provider = providers.registry.by_id(backend.provider)
274
+ for socialapp in SocialApp.objects.all():
275
+ provider = get_socialaccount_provider(providers, socialapp, request)
277
276
  return_dict.update({provider: provider.get_login_url(request)})
278
277
  return return_dict