• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

kobotoolbox / kpi / 28511670524
81%
master: 76%

Build:
Build:
LAST BUILD BRANCH: DEV-1469-create-model-for-tag-trackers
DEFAULT BRANCH: master
Ran 01 Jul 2026 10:45AM UTC
Jobs 10
Files 892
Run time 3min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

01 Jul 2026 10:41AM UTC coverage: 81.439%. Remained the same
28511670524

push

github

web-flow
feat(bulkProcessing): display review button DEV-2321 (#7203)

### 📣 Summary

Display "Review" button in table cells for automatic transcripts and
translations that haven't been accepted yet. Works both for bulk and
single requests.

### 💭 Notes

Changes here:
- **`submissionUtils.tsx`**: Added `hasUnacceptedAutomaticContent()`
function that checks the new `pendingReview` flag from the backend to
determine if a transcript/translation needs review
- **`SupplementalDetailsCell.tsx`**: New component that shows either a
"Review" button (for pending content) or the standard text modal (for
accepted content). Clicking the button navigates to Processing →
Transcript or Processing → Translations
- **`routes.utils.ts`**: Added `goToProcessing()` helper to navigate to
the processing view with the right submission and tab pre-selected
- **`submissionUtils.tests.ts`**: Added 10 tests covering the new
function (pending content, accepted content, missing data, qual
questions, etc.)
- **Stories**: Added examples to DataTableCell and DataTableWrapper
stories to showcase the Review button

This uses the `pendingReview` flag that the backend now returns (from PR
#7182). When automatic transcription/translation finishes but hasn't
been manually accepted, the API includes `pendingReview: true` in the
supplemental details. The frontend checks for this flag and shows a
button instead of the content text. Makes sense – you can't review what
you can't see yet, but you need to know it's ready.

### 👀 Preview steps

1. ℹ️ Have a project with an audio question and few submissions,
automatic features enabled, bulk feature flag enabled
2. Go to Project → Data → Table
4. Request automatic transcription for the audio from Processing view
(or run a bulk transcription job)
5. Wait for the transcription to complete
6. 🔴 [on main] The transcript column is empty – no indication that
anything is ready
7. 🟢 [on PR] The transcript column shows a "Review" button
8. Click the "Review" button
... (continued)

9259 of 12599 branches covered (73.49%)

30214 of 37100 relevant lines covered (81.44%)

5.52 hits per line

Coverage Regressions

Lines Coverage ∆ File
667
5.22
-74.11% kpi/utils/query_parser/canopy_autogenerated_parser/__init__.py
377
34.8
-59.09% kpi/serializers/v2/asset.py
350
27.96
-57.57% kpi/models/import_export_task.py
242
38.71
-39.87% kpi/deployment_backends/openrosa_backend.py
237
23.31
-66.57% kpi/serializers/v2/asset_permission_assignment.py
200
58.52
-35.15% kpi/models/asset.py
185
14.34
-66.31% kobo/apps/subsequences/tasks.py
165
30.61
-56.12% kobo/apps/subsequences/models.py
157
45.06
-36.09% kobo/apps/audit_log/models.py
157
36.93
-51.31% kpi/views/v2/data.py
150
40.73
-54.55% kobo/apps/organizations/serializers.py
150
28.85
-57.69% kobo/apps/subsequences/serializers.py
136
14.8
-69.39% kobo/apps/subsequences/utils/versioning.py
132
29.35
-65.67% kobo/apps/project_ownership/models/transfer.py
126
31.44
-64.95% kobo/apps/subsequences/actions/automatic_bedrock_qual.py
123
35.57
-48.62% kobo/apps/subsequences/actions/base.py
114
25.35
-53.52% kpi/filters.py
113
54.57
-27.9% kpi/deployment_backends/base_backend.py
110
25.88
-64.71% kpi/utils/query_parser/query_parser.py
107
15.7
-47.98% kobo/apps/superuser_stats/tasks.py
98
61.89
-26.49% kpi/views/v2/asset.py
91
19.51
-73.98% kobo/apps/subsequences/actions/qual.py
87
16.67
-58.0% kobo/apps/project_ownership/utils.py
87
71.12
-23.71% kpi/mixins/object_permission.py
87
29.29
-62.14% kpi/serializers/v2/asset_file.py
86
46.99
-51.81% kobo/apps/organizations/views.py
86
26.12
-64.18% kobo/apps/trash_bin/utils/trash.py
84
17.76
-78.5% kobo/apps/subsequences/actions/mixins.py
81
0.0
-93.1% kobo/apps/stripe/serializers.py
75
21.6
-60.0% kobo/apps/stripe/utils/subscription_limits.py
75
0.0
-41.9% kobo/apps/stripe/views.py
75
59.0
-37.5% kpi/utils/xml.py
72
35.2
-57.6% kpi/models/paired_data.py
71
20.58
-29.22% kobo/apps/subsequences/integrations/google/google_translate.py
71
64.65
-33.02% kpi/permissions.py
70
37.21
-40.7% kpi/serializers/current_user.py
70
23.4
-74.47% kpi/utils/xlsform_preprocessors/kobomatrix_handler.py
68
41.03
-43.59% kobo/apps/organizations/admin/organization_user.py
68
35.34
-51.13% kpi/paginators.py
67
32.52
-54.47% kobo/apps/accounts/forms.py
66
31.62
-56.41% kpi/serializers/v2/export_task.py
66
26.85
-61.11% kpi/serializers/v2/paired_data.py
65
12.36
-73.03% kobo/apps/reports/report_data.py
63
0.0
-51.64% kobo/apps/stripe/models.py
63
34.55
-57.27% kpi/views/v2/paired_data.py
62
27.87
-50.82% kobo/apps/project_ownership/tasks.py
62
19.77
-24.03% kobo/apps/subsequences/integrations/google/google_transcribe.py
62
42.79
-28.84% kpi/renderers.py
62
22.32
-55.36% kpi/utils/models.py
60
37.07
-51.72% kpi/models/asset_snapshot.py
57
32.58
-64.04% kpi/deployment_backends/mock_backend.py
57
28.28
-57.58% kpi/password_validation.py
56
42.86
-53.33% kpi/views/v2/environment.py
49
20.21
-52.13% kobo/apps/stripe/utils/billing_dates.py
48
34.52
-57.14% kobo/apps/audit_log/base_views.py
46
57.58
-27.88% kobo/apps/organizations/models.py
46
53.92
-45.1% kpi/models/asset_file.py
44
52.58
-45.36% kobo/apps/subsequences/views.py
43
31.43
-40.95% kobo/apps/organizations/admin/organization.py
43
30.0
-61.43% kobo/apps/organizations/permissions.py
42
0.0
-79.25% kobo/apps/user_reports/tasks.py
42
49.47
-44.21% kpi/views/v2/asset_permission_assignment.py
41
32.81
-64.06% kobo/apps/trash_bin/utils/account.py
41
43.7
-30.37% kpi/views/v2/asset_snapshot.py
40
45.6
-32.0% kobo/apps/project_views/views.py
39
52.28
-19.8% kpi/mixins/formpack_xlsform_utils.py
39
39.68
-30.95% kpi/utils/autoname.py
36
43.06
-50.0% kobo/apps/project_ownership/serializers/invite.py
35
18.75
-72.92% kpi/utils/xlsform_preprocessors/koborank_handler.py
33
31.58
-57.89% kpi/utils/mailer.py
32
62.63
-32.32% kpi/utils/django_orm_helper.py
32
50.75
-47.76% kpi/views/v2/asset_export_settings.py
31
55.36
-27.68% kobo/apps/openrosa/apps/logger/utils/instance.py
31
26.42
-58.49% kobo/apps/trash_bin/utils/project.py
30
66.83
-14.63% kpi/utils/mongo_helper.py
29
37.14
-41.43% hub/utils/i18n.py
29
0.0
-78.38% kobo/apps/accounts/adapter.py
29
21.95
-70.73% kpi/utils/xlsform_preprocessors/koboscore_handler.py
27
72.82
-26.21% kpi/utils/usage_calculator.py
26
60.0
-18.57% kobo/apps/audit_log/signals.py
26
27.5
-65.0% kpi/serializers/v2/attachment_delete.py
25
51.22
-30.49% kobo/apps/accounts/mfa/views.py
25
31.11
-55.56% kpi/serializers/v2/data.py
24
27.63
-31.58% kobo/apps/subsequences/integrations/google/rate_limit.py
24
40.0
-53.33% kpi/fields/jsonschema_form_field.py
24
71.43
-28.57% kpi/serializers/v2/service_usage.py
24
54.84
-38.71% kpi/utils/kobo_to_xlsform.py
24
59.32
-40.68% kpi/views/v2/export_task.py
23
0.0
-67.65% kobo/apps/accounts/mfa/adapter.py
23
27.4
-31.51% kobo/apps/trackers/utils.py
23
40.48
-54.76% kpi/serializers/v2/deployment.py
22
67.95
-28.21% kpi/authentication.py
22
50.98
-43.14% kpi/serializers/v2/asset_snapshot.py
22
55.56
-40.74% kpi/serializers/v2/permission.py
22
29.41
-64.71% kpi/utils/rename_xls_sheet.py
21
0.0
-84.0% kobo/apps/stripe/signals.py
21
48.84
-48.84% kobo/apps/trash_bin/models/project.py
21
38.33
-35.0% kpi/serializers/v2/asset_export_settings.py
21
58.18
-38.18% kpi/signals.py
21
23.08
-53.85% kpi/utils/asset_translation_utils.py
21
40.58
-30.43% kpi/utils/data_exports.py
21
26.47
-61.76% kpi/utils/export_cleanup.py
20
52.38
-31.75% hub/models/extra_user_detail.py
20
0.0
-68.97% kobo/apps/audit_log/tasks.py
20
66.2
-28.17% kobo/apps/project_ownership/models/invite.py
20
72.38
-19.05% kpi/utils/object_permission.py
20
17.86
-71.43% kpi/utils/submission.py
19
26.0
-38.0% kobo/apps/service_health/views.py
19
0.0
-65.52% kobo/apps/stripe/admin.py
19
32.14
-67.86% kobo/apps/subsequences/utils/supplement_data.py
19
47.73
-43.18% kobo/apps/trash_bin/models/attachment.py
19
51.28
-48.72% kobo/apps/trash_bin/tasks/__init__.py
19
33.33
-63.33% kpi/utils/paired_data.py
19
51.06
-40.43% kpi/views/v2/import_task.py
19
49.25
-28.36% kpi/views/v2/user.py
18
84.8
-3.3% kobo/apps/openrosa/libs/utils/logger_tools.py
18
47.22
-50.0% kobo/apps/organizations/tasks.py
18
35.56
-40.0% kpi/fields/file.py
18
37.84
-48.65% kpi/serializers/v2/create_user.py
18
47.13
-20.69% kpi/tasks.py
18
37.93
-62.07% kpi/views/token.py
18
48.65
-48.65% kpi/views/v2/attachment_audio_duration.py
17
50.0
-44.74% kobo/apps/organizations/utils.py
17
38.1
-40.48% kpi/utils/urls.py
16
32.0
-64.0% kobo/apps/openrosa/apps/logger/utils/attachment.py
16
0.0
-100.0% kobo/apps/service_health/test_service_health.py
16
31.82
-36.36% kobo/apps/stripe/utils/limit_enforcement.py
16
55.81
-37.21% kpi/backends.py
16
28.0
-64.0% kpi/utils/audio_duration.py
16
62.9
-25.81% kpi/views/v2/attachment.py
15
67.74
-24.19% kobo/apps/hook/models/hook.py
15
28.57
-71.43% kobo/apps/trash_bin/utils/signals.py
15
75.71
-21.43% kpi/utils/cache.py
15
67.61
-21.13% kpi/utils/sluggify.py
14
41.3
-15.22% kobo/apps/subsequences/integrations/google/base.py
14
26.09
-60.87% kpi/fields/relative_prefix_hyperlinked_related.py
14
82.76
-16.09% kpi/utils/asset_content_analyzer.py
13
45.71
-37.14% kobo/apps/user_reports/seralizers.py
13
40.0
-43.33% kpi/serializers/v2/asset_counts.py
13
33.33
-48.15% kpi/utils/prerequisite_migration_checker.py
13
30.43
-56.52% kpi/utils/private_storage.py
12
28.21
-30.77% kobo/apps/accounts/mfa/flows.py
12
83.33
-10.0% kobo/apps/openrosa/apps/logger/models/attachment.py
12
35.0
-60.0% kobo/apps/stripe/utils/import_management.py
12
43.48
-52.17% kobo/apps/subsequences/throttling.py
12
22.73
-54.55% kpi/utils/bugfix.py
12
44.62
-18.46% kpi/utils/hash.py
11
69.44
-30.56% kpi/models/asset_user_partial_permission.py
11
35.29
-64.71% kpi/utils/strings.py
11
55.56
-40.74% kpi/utils/xlsform_preprocessors/base_handlers.py
10
60.71
-35.71% kobo/apps/audit_log/utils.py
10
39.58
-20.83% kobo/apps/subsequences/prompts.py
10
33.33
-37.04% kpi/mixins/audio_transcoding.py
10
74.0
-20.0% kpi/models/asset_version.py
10
78.85
-19.23% kpi/serializers/v2/user.py
10
63.33
-33.33% kpi/views/v2/asset_version.py
9
41.0
-9.0% kobo/apps/accounts/mfa/models.py
9
0.0
-29.03% kobo/apps/stripe/utils/manual_subscription.py
9
74.51
-17.65% kpi/context_processors.py
9
35.29
-52.94% kpi/serializers/v1/authorized_application_user.py
9
71.43
-25.71% kpi/utils/project_views.py
9
79.17
-18.75% kpi/views/v2/asset_file.py
8
91.05
-4.21% kobo/apps/openrosa/apps/api/viewsets/xform_list_api.py
8
71.67
-3.33% kobo/apps/openrosa/apps/viewer/models/parsed_instance.py
8
0.0
-100.0% kobo/apps/service_health/test_service_health_minimal.py
8
0.0
-100.0% kobo/apps/stripe/urls.py
8
57.14
-38.1% kpi/fields/writable_json.py
7
81.08
-18.92% kobo/apps/project_views/serializers.py
7
61.76
-20.59% kobo/apps/storage_backends/base.py
7
0.0
-100.0% kobo/apps/stripe/apps.py
7
50.0
-31.82% kobo/apps/trash_bin/mixins/admin.py
7
53.33
-46.67% kobo/apps/trash_bin/utils/attachment.py
7
53.85
-8.97% kpi/deployment_backends/kc_access/utils.py
7
57.14
-33.33% kpi/fields/paginated_api.py
7
53.33
-46.67% kpi/maintenance_tasks.py
7
70.37
-25.93% kpi/models/extra_project_metadata_field.py
7
52.94
-41.18% kpi/serializers/v2/reports.py
7
36.14
-8.43% kpi/utils/storage.py
7
74.07
-25.93% kpi/views/v2/attachment_delete.py
7
75.86
-24.14% kpi/views/v2/tag.py
6
43.75
-37.5% kobo/apps/project_ownership/filters.py
6
72.09
-13.95% kobo/apps/project_ownership/serializers/transfer.py
6
0.0
-100.0% kobo/apps/project_views/tasks.py
6
0.0
-100.0% kobo/apps/stripe/exceptions.py
6
0.0
-37.5% kobo/apps/stripe/utils/view_utils.py
6
68.42
-31.58% kobo/apps/subsequences/schemas.py
6
58.46
-4.62% kobo/apps/trash_bin/admin.py
6
62.96
-22.22% kobo/apps/trash_bin/models/account.py
6
42.86
-42.86% kpi/mixins/asset.py
6
80.0
-20.0% kpi/serializers/v2/tag.py
6
53.85
-46.15% kpi/utils/files.py
5
57.69
-19.23% kobo/apps/subsequences/integrations/google/locations.py
5
65.22
-21.74% kobo/apps/trash_bin/tasks/project.py
5
82.35
-14.71% kobo/apps/user_reports/views.py
5
85.84
-4.42% kpi/exceptions.py
5
75.0
-20.83% kpi/models/authorized_application.py
5
76.0
-20.0% kpi/views/v2/asset_submission_counts.py
5
61.54
-38.46% kpi/views/v2/logout.py
5
73.91
-21.74% kpi/views/v2/user_asset_subscription.py
4
53.85
-30.77% kobo/apps/accounts/templatetags/customize_email_content.py
4
74.0
-8.0% kobo/apps/audit_log/serializers.py
4
63.27
-8.16% kobo/apps/hook/views/v2/hook_log.py
4
77.5
-10.0% kobo/apps/kobo_auth/signals.py
4
72.22
-22.22% kobo/apps/subsequences/actions/automatic_google_transcription.py
4
72.22
-22.22% kobo/apps/subsequences/actions/automatic_google_translation.py
4
33.33
-14.81% kobo/apps/subsequences/audit.py
4
83.33
-16.67% kobo/apps/trackers/models.py
4
68.18
-18.18% kobo/apps/trash_bin/tasks/account.py
4
37.5
-5.0% kobo/apps/trash_bin/tasks/attachment.py
4
89.47
-7.02% kpi/deployment_backends/mixin.py
4
76.19
-19.05% kpi/serializers/v2/user_asset_subscription.py
4
33.33
-66.67% kpi/utils/chunked_delete.py
4
20.0
-80.0% kpi/utils/placeholders.py
4
61.54
-30.77% kpi/versioning.py
4
80.0
-20.0% kpi/views/v1_api_gone.py
3
65.79
-7.89% kobo/apps/data_collectors/signals.py
3
59.32
-5.08% kobo/apps/hook/views/v2/hook.py
3
62.16
-8.11% kobo/apps/openrosa/apps/logger/utils/database_query.py
3
55.95
-1.79% kobo/apps/openrosa/apps/main/models/meta_data.py
3
63.33
-5.0% kobo/apps/openrosa/apps/main/models/user_profile.py
3
58.06
-9.68% kobo/apps/organizations/admin/organization_owner.py
3
42.86
-4.29% kobo/apps/project_ownership/admin.py
3
85.71
-8.57% kobo/apps/project_views/models/assignment.py
3
89.19
-8.11% kobo/apps/project_views/models/project_view.py
3
92.86
-7.14% kobo/apps/subsequences/exceptions.py
3
75.0
-25.0% kobo/apps/superuser_stats/admin.py
3
70.0
-30.0% kpi/fields/serializer_method_file.py
3
82.61
-13.04% kpi/serializers/v2/asset_version.py
3
80.0
-20.0% kpi/serializers/v2/attachment_audio_duration.py
3
76.47
-17.65% kpi/utils/pyxform_compatibility.py
3
30.67
-4.0% kpi/utils/two_database_configuration_checker.py
3
75.0
-25.0% kpi/views/v2/open_rosa.py
3
84.21
-15.79% kpi/views/v2/permission.py
2
60.0
-40.0% kobo/apps/audit_log/filters.py
2
67.97
-1.56% kobo/apps/audit_log/views.py
2
65.31
-4.08% kobo/apps/hook/models/hook_log.py
2
87.5
-12.5% kobo/apps/hook/serializers/v2/hook_log.py
2
56.25
-4.17% kobo/apps/hook/serializers/v2/hook.py
2
78.08
-2.74% kobo/apps/openrosa/libs/utils/image_tools.py
2
64.21
-2.11% kobo/apps/openrosa/libs/utils/middleware.py
2
91.3
-8.7% kobo/apps/project_ownership/views/invite.py
2
42.86
-28.57% kobo/apps/subsequences/utils/time.py
2
83.33
-6.67% kobo/urls.py
2
64.52
-6.45% kpi/mixins/standardize_searchable_field.py
2
66.67
-16.67% kpi/mixins/validation_password_permission.py
2
96.3
-3.7% kpi/mixins/xls_exportable.py
2
90.0
-10.0% kpi/utils/absolute_paths.py
2
88.24
-11.76% kpi/views/v2/service_usage.py
1
63.64
-9.09% kobo/apps/accounts/mfa/permissions.py
1
44.44
-5.56% kobo/apps/accounts/templatetags/get_provider_appname.py
1
94.12
-5.88% kobo/apps/audit_log/middleware.py
1
76.6
-2.13% kobo/apps/kobo_auth/models.py
1
86.11
-2.78% kobo/apps/openrosa/apps/logger/fields.py
1
90.48
-0.79% kobo/apps/openrosa/apps/logger/signals.py
1
87.5
-0.39% kobo/apps/openrosa/apps/logger/xform_instance_parser.py
1
87.5
-12.5% kobo/apps/service_health/middleware.py
1
88.89
-11.11% kobo/apps/subsequences/actions/manual_qual.py
1
92.31
-7.69% kobo/apps/user_reports/utils/migrations.py
1
70.73
-2.44% kpi/admin.py
1
57.89
-2.63% kpi/db_routers.py
1
96.67
-3.33% kpi/fields/kpi_uid.py
1
75.0
-25.0% kpi/fields/read_only.py
1
90.0
-10.0% kpi/mixins/mfa.py
1
62.5
-12.5% kpi/utils/datetime.py
1
81.25
-6.25% kpi/utils/drf_exceptions.py
1
50.0
-50.0% kpi/utils/export_task.py
1
75.0
-25.0% kpi/utils/gravatar_url.py
1
55.56
-2.22% kpi/views/current_user.py
1
42.5
-2.5% kpi/views/__init__.py
1
93.33
-6.67% kpi/views/v2/asset_usage.py
Jobs
ID Job ID Ran Files Coverage
1 28511670524.1 01 Jul 2026 10:45AM UTC 888
44.45
2 28511670524.2 01 Jul 2026 10:45AM UTC 888
49.62
3 28511670524.3 01 Jul 2026 10:46AM UTC 890
45.81
4 28511670524.4 01 Jul 2026 10:47AM UTC 888
52.97
5 28511670524.5 01 Jul 2026 10:47AM UTC 890
54.24
6 28511670524.6 01 Jul 2026 10:48AM UTC 890
66.64
7 28511670524.7 01 Jul 2026 10:48AM UTC 890
50.96
8 28511670524.8 01 Jul 2026 10:49AM UTC 888
58.95
9 28511670524.9 01 Jul 2026 10:50AM UTC 890
60.11
10 28511670524.10 01 Jul 2026 10:50AM UTC 892
68.96
Source Files on build 28511670524
  • Tree
  • List 892
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • aac01a1e on github
  • Prev Build on main (#28447174544)
  • Next Build on main (#28511654923)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc