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

kobotoolbox / kpi / 30519181860
82%
master: 76%

Build:
Build:
LAST BUILD BRANCH: dev-2566-reduce-refresh-frequency-and-harden-reliability-of-the-billingusage
DEFAULT BRANCH: master
Ran 30 Jul 2026 06:23AM UTC
Jobs 10
Files 893
Run time 2min
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

30 Jul 2026 06:18AM UTC coverage: 81.937% (+0.04%) from 81.9%
30519181860

push

github

web-flow
fix(api): return generic messages instead of raw exception text DEV-2489 (#7338)

### 📣 Summary

Error messages shown when something can't be saved are now short and
readable instead of long technical text.

### 📖 Description

In a few places — setting up two-factor authentication, turning on
automatic transcription or translation for a question, and saving a
setting that contains JSON — KoboToolbox used to show a long, technical
error message when something went wrong. Those messages now read as a
short plain sentence, and they can be translated. The technical detail
is still recorded on the server, so support can still investigate.

### 💭 Notes

Four CodeQL alerts from DEV-2422
([#186](https://github.com/kobotoolbox/kpi/security/code-scanning/186),
[#153](https://github.com/kobotoolbox/kpi/security/code-scanning/153),
[#185](https://github.com/kobotoolbox/kpi/security/code-scanning/185),
[#77](https://github.com/kobotoolbox/kpi/security/code-scanning/77)) —
all four returned exception text straight to the client.

- `mfa/views.py`: `str(cause)` → fixed string. The UI never read that
key (`mfaActions.ts` falls back to `non_field_errors`), so nothing
visible changes.
- `subsequences/serializers.py` ×2: a raw `jsonschema` error stringifies
to the **entire schema plus the submitted instance**. Now a generic
message, wrapped in `gettext_lazy` at the constant so `makemessages`
extracts it.
- `writable_json.py`: narrowed the bare `except Exception`.
`RecursionError` is deliberately kept in the tuple — deeply nested JSON
raises it (confirmed at ~100k levels) and it is neither `ValueError` nor
`TypeError`, so dropping it would turn a 400 into a 500.
- **Sentry:** the MFA case already reports — `logging.error(…,
exc_info=True)` is above the `event_level=WARNING` of our
`LoggingIntegration`. The three DRF `ValidationError`s deliberately do
not: they are user-input rejections, not bugs, and one event per
malformed payload would drown the real errors.
- **Tradeo... (continued)

9488 of 12791 branches covered (74.18%)

30729 of 37503 relevant lines covered (81.94%)

5.51 hits per line

Coverage Regressions

Lines Coverage ∆ File
667
5.22
-74.11% kpi/utils/query_parser/canopy_autogenerated_parser/__init__.py
319
26.46
-47.68% kpi/models/import_export_task.py
312
0.0
-91.23% kobo/apps/openrosa/apps/viewer/pandas_mongo_bridge.py
223
53.03
-38.65% kpi/models/asset.py
209
19.15
-51.99% kobo/apps/openrosa/libs/utils/export_tools.py
206
0.0
-86.19% kobo/apps/openrosa/libs/utils/briefcase_client.py
193
54.42
-32.22% kobo/apps/openrosa/libs/utils/logger_tools.py
192
34.68
-29.86% kpi/serializers/v2/asset.py
130
26.03
-21.42% kpi/deployment_backends/openrosa_backend.py
125
58.86
-34.06% kpi/mixins/object_permission.py
123
28.65
-33.24% kpi/views/v2/asset.py
117
25.28
-65.73% kpi/utils/query_parser/query_parser.py
111
30.22
0.52% kobo/apps/subsequences/serializers.py
97
29.35
-48.26% kobo/apps/project_ownership/models/transfer.py
92
44.2
-22.72% kpi/deployment_backends/base_backend.py
87
0.0
-87.88% kobo/apps/openrosa/libs/utils/backup_tools.py
81
0.0
-93.1% kobo/apps/stripe/serializers.py
75
0.0
-41.9% kobo/apps/stripe/views.py
71
21.6
-56.8% kobo/apps/stripe/utils/subscription_limits.py
71
42.44
-34.63% kpi/utils/mongo_helper.py
70
23.4
-74.47% kpi/utils/xlsform_preprocessors/kobomatrix_handler.py
67
25.35
-31.46% kpi/filters.py
66
33.33
-59.46% kobo/apps/openrosa/apps/viewer/views.py
66
50.0
-33.0% kpi/utils/xml.py
64
12.36
-71.91% kobo/apps/reports/report_data.py
63
32.52
-51.22% kobo/apps/accounts/forms.py
63
0.0
-51.64% kobo/apps/stripe/models.py
58
0.0
-90.63% kobo/apps/openrosa/libs/data/query.py
58
31.46
-65.17% kpi/deployment_backends/mock_backend.py
54
58.08
-4.95% kobo/apps/organizations/models.py
54
35.34
-40.6% kpi/paginators.py
50
0.0
-47.17% kobo/apps/openrosa/apps/logger/tasks.py
49
51.59
-38.89% kobo/apps/openrosa/apps/logger/signals.py
49
23.85
-37.69% kobo/apps/openrosa/apps/logger/utils/instance.py
49
28.57
-43.75% kobo/apps/openrosa/apps/logger/views.py
49
28.28
-49.49% kpi/password_validation.py
48
53.18
-21.82% kpi/permissions.py
45
44.14
-10.34% kobo/apps/audit_log/models.py
44
45.72
-16.36% kobo/apps/openrosa/apps/viewer/models/data_dictionary.py
44
37.07
-37.93% kpi/models/asset_snapshot.py
40
0.0
-40.82% kobo/apps/openrosa/apps/viewer/xls_writer.py
40
23.29
-54.79% kobo/apps/openrosa/libs/utils/image_tools.py
39
33.33
-46.43% kobo/apps/audit_log/base_views.py
39
23.08
-30.0% kobo/apps/openrosa/apps/viewer/tasks.py
39
35.2
-31.2% kpi/models/paired_data.py
37
38.83
-35.92% kpi/utils/usage_calculator.py
36
24.49
-73.47% kobo/apps/openrosa/apps/logger/import_tools.py
36
20.21
-38.3% kobo/apps/stripe/utils/billing_dates.py
35
52.28
-17.77% kpi/mixins/formpack_xlsform_utils.py
35
18.75
-72.92% kpi/utils/xlsform_preprocessors/koborank_handler.py
34
57.5
-14.17% kobo/apps/openrosa/apps/viewer/models/parsed_instance.py
34
41.74
-29.57% kpi/utils/autoname.py
34
37.14
-48.57% kpi/utils/cache.py
33
49.51
-32.04% kobo/apps/openrosa/apps/viewer/models/export.py
32
53.92
-31.37% kpi/models/asset_file.py
31
62.63
-31.31% kpi/utils/django_orm_helper.py
30
58.33
-25.0% kobo/apps/openrosa/apps/logger/models/attachment.py
29
21.95
-70.73% kpi/utils/xlsform_preprocessors/koboscore_handler.py
28
30.14
-19.18% kobo/apps/openrosa/libs/utils/viewer_tools.py
28
28.01
-9.12% kpi/views/v2/data.py
27
0.0
-72.97% kobo/apps/accounts/adapter.py
27
76.95
-10.55% kobo/apps/openrosa/apps/logger/xform_instance_parser.py
27
16.67
-18.0% kobo/apps/project_ownership/utils.py
26
51.61
0.53% kobo/apps/accounts/mfa/views.py
24
33.33
-66.67% kobo/apps/openrosa/libs/utils/decorators.py
24
40.0
-53.33% kpi/fields/jsonschema_form_field.py
24
54.84
-38.71% kpi/utils/kobo_to_xlsform.py
23
51.06
-48.94% kpi/views/v2/authorized_application_user.py
22
55.71
-15.71% kobo/apps/audit_log/signals.py
22
31.58
-38.6% kpi/utils/mailer.py
21
71.79
-10.77% kobo/apps/openrosa/apps/logger/models/instance.py
21
42.79
-9.77% kpi/renderers.py
21
54.55
-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
29.67
-21.98% kobo/apps/openrosa/libs/utils/user_auth.py
19
0.0
-65.52% kobo/apps/stripe/admin.py
18
35.56
-40.0% kpi/fields/file.py
18
37.84
-48.65% kpi/serializers/v2/create_user.py
18
60.56
-25.35% kpi/utils/sluggify.py
18
37.93
-62.07% kpi/views/token.py
17
16.22
-45.95% kobo/apps/openrosa/apps/logger/utils/database_query.py
17
46.99
-10.24% kobo/apps/organizations/views.py
17
17.86
-60.71% kpi/utils/submission.py
15
31.71
-36.59% kobo/apps/openrosa/apps/logger/xform_fs.py
15
26.19
-35.71% kpi/utils/urls.py
14
47.62
-8.33% kobo/apps/openrosa/apps/main/models/meta_data.py
14
44.0
-56.0% kobo/apps/openrosa/libs/utils/model_tools.py
14
31.82
-31.82% kobo/apps/stripe/utils/limit_enforcement.py
13
37.14
-18.57% hub/utils/i18n.py
13
26.09
-56.52% kpi/fields/relative_prefix_hyperlinked_related.py
13
47.13
-14.94% kpi/tasks.py
13
81.61
-14.94% kpi/utils/asset_content_analyzer.py
12
44.9
-24.49% kobo/apps/openrosa/apps/logger/utils/counters.py
12
43.06
-16.67% kobo/apps/project_ownership/serializers/invite.py
12
35.0
-60.0% kobo/apps/stripe/utils/import_management.py
12
22.73
-54.55% kpi/utils/bugfix.py
11
54.84
-35.48% kobo/apps/openrosa/libs/authentication.py
11
0.0
-44.0% kobo/apps/stripe/signals.py
11
69.44
-30.56% kpi/models/asset_user_partial_permission.py
11
23.31
-3.09% kpi/serializers/v2/asset_permission_assignment.py
11
28.92
-13.25% kpi/utils/storage.py
11
55.56
-40.74% kpi/utils/xlsform_preprocessors/base_handlers.py
11
45.16
-17.74% kpi/views/v2/attachment.py
10
60.71
-35.71% kobo/apps/audit_log/utils.py
10
66.2
-14.08% kobo/apps/project_ownership/models/invite.py
10
21.43
-35.71% kobo/apps/subsequences/utils/supplement_data.py
10
14.8
-5.1% kobo/apps/subsequences/utils/versioning.py
10
72.92
-20.83% kpi/models/asset_version.py
10
35.29
-58.82% kpi/utils/strings.py
9
77.49
-4.71% kobo/apps/openrosa/apps/logger/models/xform.py
9
0.0
-29.03% kobo/apps/stripe/utils/manual_subscription.py
9
35.29
-52.94% kpi/serializers/v1/authorized_application_user.py
9
41.18
-52.94% kpi/utils/viewset_mixins.py
8
0.0
-100.0% kobo/apps/stripe/urls.py
7
58.95
-7.37% kobo/apps/openrosa/libs/utils/middleware.py
7
50.0
-18.42% kobo/apps/organizations/utils.py
7
61.76
-20.59% kobo/apps/storage_backends/base.py
7
0.0
-100.0% kobo/apps/stripe/apps.py
7
57.14
-33.33% kpi/fields/paginated_api.py
7
57.14
-23.81% kpi/fields/writable_json.py
7
53.33
-46.67% kpi/maintenance_tasks.py
7
70.37
-25.93% kpi/models/extra_project_metadata_field.py
7
72.38
-6.67% kpi/utils/object_permission.py
7
71.43
-20.0% kpi/utils/project_views.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
74.51
-11.76% kpi/context_processors.py
6
42.86
-42.86% kpi/mixins/asset.py
6
53.85
-46.15% kpi/utils/files.py
6
22.32
-5.36% kpi/utils/models.py
5
60.53
-13.16% kobo/apps/data_collectors/signals.py
5
84.75
-8.47% kobo/apps/openrosa/apps/logger/exceptions.py
5
72.22
-27.78% kobo/apps/openrosa/apps/logger/models/daily_xform_submission_counter.py
5
75.0
-25.0% kobo/apps/openrosa/apps/logger/models/monthly_xform_submission_counter.py
5
0.0
-38.46% kobo/apps/openrosa/apps/main/context_processors.py
5
30.0
-7.14% kobo/apps/organizations/permissions.py
5
47.22
-13.89% kobo/apps/organizations/tasks.py
5
53.85
-6.41% kpi/deployment_backends/kc_access/utils.py
5
87.72
-8.77% kpi/deployment_backends/mixin.py
5
25.0
-41.67% kpi/mixins/validation_password_permission.py
5
75.0
-20.83% kpi/models/authorized_application.py
5
29.41
-14.71% kpi/utils/rename_xls_sheet.py
4
53.85
-30.77% kobo/apps/accounts/templatetags/customize_email_content.py
4
77.5
-10.0% kobo/apps/kobo_auth/signals.py
4
45.45
-36.36% kobo/apps/openrosa/koboform/__init__.py
4
76.67
-13.33% kobo/urls.py
4
33.33
-66.67% kpi/utils/chunked_delete.py
4
80.0
-20.0% kpi/views/v1_api_gone.py
3
95.76
-2.54% kobo/apps/openrosa/apps/api/viewsets/xform_submission_api.py
3
80.0
-20.0% kobo/apps/openrosa/apps/viewer/signals.py
3
31.43
-2.86% kobo/apps/organizations/admin/organization.py
3
89.19
-8.11% kobo/apps/project_views/models/project_view.py
3
76.47
-17.65% kpi/utils/pyxform_compatibility.py
3
61.54
-23.08% kpi/versioning.py
2
82.35
-11.76% kobo/apps/audit_log/middleware.py
2
91.3
-8.7% kobo/apps/project_ownership/views/invite.py
2
66.67
-2.56% kpi/authentication.py
2
86.09
-1.74% kpi/exceptions.py
2
64.52
-6.45% kpi/mixins/standardize_searchable_field.py
2
96.3
-3.7% kpi/mixins/xls_exportable.py
2
82.61
-8.7% kpi/serializers/v2/asset_version.py
2
90.0
-10.0% kpi/utils/absolute_paths.py
2
47.06
-2.94% kpi/utils/hash.py
1
44.44
-5.56% kobo/apps/accounts/templatetags/get_provider_appname.py
1
0.0
-100.0% kobo/apps/openrosa/apps/logger/constants.py
1
86.11
-2.78% kobo/apps/openrosa/apps/logger/fields.py
1
91.3
-4.35% kobo/apps/openrosa/libs/permissions.py
1
94.12
-1.18% kobo/apps/openrosa/libs/renderers/renderers.py
1
68.75
-6.25% kobo/apps/openrosa/libs/utils/string.py
1
92.31
-7.69% kobo/apps/user_reports/utils/migrations.py
1
57.89
-2.63% kpi/db_routers.py
1
79.49
-2.56% kpi/deployment_backends/kc_access/storage.py
1
87.1
-3.23% kpi/fields/lazy_default_jsonb.py
1
72.73
-4.55% kpi/urls/__init__.py
Jobs
ID Job ID Ran Files Coverage
1 30519181860.1 30 Jul 2026 06:23AM UTC 889
44.18
2 30519181860.2 30 Jul 2026 06:24AM UTC 889
52.74
3 30519181860.3 30 Jul 2026 06:24AM UTC 889
49.43
4 30519181860.4 30 Jul 2026 06:25AM UTC 891
45.53
5 30519181860.5 30 Jul 2026 06:26AM UTC 891
54.0
6 30519181860.6 30 Jul 2026 06:27AM UTC 891
50.76
7 30519181860.7 30 Jul 2026 06:27AM UTC 891
67.08
8 30519181860.8 30 Jul 2026 06:28AM UTC 889
58.93
9 30519181860.9 30 Jul 2026 06:29AM UTC 891
60.07
10 30519181860.10 30 Jul 2026 06:29AM UTC 893
69.4
Source Files on build 30519181860
  • Tree
  • List 893
  • Changed 7
  • Source Changed 0
  • Coverage Changed 7
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 94b3bb9d on github
  • Prev Build on release/2.026.30 (#30487945096)
  • Next Build on release/2.026.30 (#30521390266)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc