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

kobotoolbox / kpi / 38914364267
83%
master: 76%

Build:
Build:
LAST BUILD BRANCH: reorganize-constance-fieldsets
DEFAULT BRANCH: master
Ran 16 Oct 2026 02:19PM UTC
Jobs 10
Files 915
Run time 1min
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

16 Oct 2026 02:15PM UTC coverage: 83.187% (+0.06%) from 83.126%
38914364267

push

github

web-flow
feat(enketo): use internal enketo URL DEV-3063 (#7690)

### πŸ‘· Description for instance maintainers
Updates kpi to communicate with enketo using internal enketo's URL's,
and provides kobocat's internal URLs to enketo to use in turn (via
redis).

### πŸ’­ Notes
Update kpi to use internal URLs for communication between enketo and
kpi. POST requests from kpi -> enketo now go through the internal enketo
URL, although we still return the external links in the serializer.
Similarly, we now store the internal kpi/kobocat url in redis rather
than the external, so enketo will use these urls when getting
information from the server. This allows for faster and more reliable
communication between kpi and enketo.

The url for each asset will only be updated to use the internal url
once. Once we have done that, we set a flag on the asset noting that the
internal url is already stored and we don't need to update it in redis
again (except for pre-existing cases like when `require_auth` changes or
permissions are changed).

Right now it's behind a constance setting so we can easily turn it off
if something goes wrong. We expect to eventually remove the setting and
have it be standard on all instances.

This PR also introduces a small performance gain: enketo ids (and the
encoded versions) are static throughout the lifetime of the asset, and
we know the structure of the links enketo creates. Therefore, once we've
fetched the enketo response once, we have all the information needed to
generate all the enketo links locally without having to make a round
trip to enketo again.


### πŸ‘€ Preview steps
Regression test only. Ensure that deploying surveys, transferring
ownership, using data collectors, etc. works as expected when
`ENKETO_USE_INTERNAL_OPENROSA_URL` is True in Constance.

---------

Co-authored-by: Olivier LΓ©ger <olivierleger@gmail.com>

10415 of 13731 branches covered (75.85%)

62 of 151 new or added lines in 12 files covered. (41.06%)

6511 existing lines in 170 files now uncovered.

33265 of 39988 relevant lines covered (83.19%)

5.51 hits per line

Uncovered Changes

Lines Coverage βˆ† File
32
41.82
-33.18% kpi/deployment_backends/openrosa_utils.py
24
26.65
-20.53% kpi/deployment_backends/openrosa_backend.py
21
26.47
7.8% kobo/apps/data_collectors/utils.py
4
24.44
-37.46% kpi/utils/urls.py
3
40.0
kpi/utils/enketo_utils.py
2
28.39
-8.75% kpi/views/v2/data.py
1
30.58
-47.09% kobo/apps/project_ownership/models/transfer.py
1
44.24
-23.15% kpi/deployment_backends/base_backend.py
1
44.2
0.5% kpi/views/v2/asset_snapshot.py

Coverage Regressions

Lines Coverage βˆ† File
667
5.22
-74.11% kpi/utils/query_parser/canopy_autogenerated_parser/__init__.py
336
24.66
-45.28% kpi/models/import_export_task.py
312
0.0
-91.23% kobo/apps/openrosa/apps/viewer/pandas_mongo_bridge.py
226
53.15
-38.5% kpi/models/asset.py
214
55.36
-30.65% kobo/apps/openrosa/libs/utils/logger_tools.py
209
19.68
-56.33% kobo/apps/openrosa/libs/utils/export_tools.py
206
0.0
-86.19% kobo/apps/openrosa/libs/utils/briefcase_client.py
192
34.58
-29.91% kpi/serializers/v2/asset.py
130
26.65
-20.53% kpi/deployment_backends/openrosa_backend.py
127
25.26
-66.84% kpi/utils/query_parser/query_parser.py
125
58.86
-34.06% kpi/mixins/object_permission.py
123
28.84
-33.15% kpi/views/v2/asset.py
121
25.41
-66.85% kobo/apps/openrosa/apps/logger/utils/attachment_restore.py
101
44.24
-23.15% kpi/deployment_backends/base_backend.py
96
30.58
-47.09% kobo/apps/project_ownership/models/transfer.py
90
41.76
-52.94% kpi/utils/django_orm_helper.py
89
30.37
-65.93% kpi/utils/mailer.py
87
0.0
-87.88% kobo/apps/openrosa/libs/utils/backup_tools.py
73
34.81
-54.07% kobo/apps/openrosa/apps/logger/utils/counters.py
71
42.44
-34.63% kpi/utils/mongo_helper.py
70
64.46
-24.04% kobo/apps/openrosa/apps/logger/xform_instance_parser.py
70
23.4
-74.47% kpi/utils/xlsform_preprocessors/kobomatrix_handler.py
67
31.76
-45.27% kobo/apps/accounts/forms.py
67
25.35
-31.46% kpi/filters.py
66
33.33
-59.46% kobo/apps/openrosa/apps/viewer/views.py
66
50.0
-13.5% kpi/utils/xml.py
64
0.0
-64.0% kobo/apps/openrosa/apps/logger/tasks.py
64
12.36
-71.91% kobo/apps/reports/report_data.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
35.34
-40.6% kpi/paginators.py
53
43.6
-10.79% kobo/apps/audit_log/models.py
51
23.66
-38.93% 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
47
52.42
-37.9% kobo/apps/openrosa/apps/logger/signals.py
44
0.0
-67.69% kobo/apps/accounts/adapter.py
44
45.72
-16.36% kobo/apps/openrosa/apps/viewer/models/data_dictionary.py
44
37.61
-37.61% kpi/models/asset_snapshot.py
41
57.5
-17.08% kobo/apps/openrosa/apps/viewer/models/parsed_instance.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
40
35.43
-31.5% kpi/utils/usage_calculator.py
39
33.33
-46.43% kobo/apps/audit_log/base_views.py
39
35.2
-31.2% kpi/models/paired_data.py
38
24.14
-32.76% kobo/apps/openrosa/apps/viewer/tasks.py
38
41.18
-27.94% kpi/utils/autoname.py
36
24.49
-73.47% kobo/apps/openrosa/apps/logger/import_tools.py
35
52.04
-17.86% kpi/mixins/formpack_xlsform_utils.py
35
18.75
-72.92% kpi/utils/xlsform_preprocessors/koborank_handler.py
34
37.14
-48.57% kpi/utils/cache.py
33
49.02
-32.35% kobo/apps/openrosa/apps/viewer/models/export.py
32
53.92
-31.37% kpi/models/asset_file.py
30
59.68
-24.19% kobo/apps/openrosa/apps/logger/models/attachment.py
29
47.62
-17.26% kobo/apps/openrosa/apps/main/models/meta_data.py
29
47.89
-40.85% kpi/utils/hash.py
29
21.95
-70.73% kpi/utils/xlsform_preprocessors/koboscore_handler.py
29
28.39
-8.75% kpi/views/v2/data.py
28
30.14
-19.18% kobo/apps/openrosa/libs/utils/viewer_tools.py
28
17.07
-68.29% kpi/utils/submission.py
27
15.52
-15.52% kobo/apps/project_ownership/utils.py
27
33.96
-50.94% kpi/fields/file.py
24
33.33
-66.67% kobo/apps/openrosa/libs/utils/decorators.py
24
29.67
-26.37% kobo/apps/openrosa/libs/utils/user_auth.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
43.38
-10.05% kpi/renderers.py
21
71.79
-9.74% kobo/apps/openrosa/apps/logger/models/instance.py
21
55.0
-15.83% kobo/apps/openrosa/libs/utils/middleware.py
21
50.0
-45.65% kpi/serializers/v2/asset_version.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
53.13
-31.25% hub/models/extra_user_detail.py
20
0.0
-68.97% kobo/apps/audit_log/tasks.py
19
74.41
-9.0% kobo/apps/openrosa/apps/logger/models/xform.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
39.73
-7.76% kobo/apps/organizations/views.py
15
31.71
-36.59% kobo/apps/openrosa/apps/logger/xform_fs.py
15
33.33
-55.56% kpi/utils/ssrf.py
14
37.14
-20.0% hub/utils/i18n.py
14
44.0
-56.0% kobo/apps/openrosa/libs/utils/model_tools.py
14
24.44
-37.46% kpi/utils/urls.py
13
54.84
-41.94% kobo/apps/openrosa/libs/authentication.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
43.06
-16.67% kobo/apps/project_ownership/serializers/invite.py
12
22.73
-54.55% kpi/utils/bugfix.py
11
59.76
-13.41% kobo/apps/project_ownership/models/invite.py
11
67.86
-19.64% kpi/context_processors.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
59.42
-14.49% kobo/apps/accounts/models.py
10
60.71
-35.71% kobo/apps/audit_log/utils.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
20.57
-6.38% kobo/apps/stripe/utils/subscription_limits.py
9
35.29
-52.94% kpi/serializers/v1/authorized_application_user.py
9
41.18
-52.94% kpi/utils/viewset_mixins.py
7
41.67
-58.33% kobo/apps/openrosa/apps/logger/utils/attachment.py
7
61.76
-20.59% kobo/apps/storage_backends/base.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
61.11
-38.89% kpi/utils/files.py
7
72.38
-6.67% kpi/utils/object_permission.py
7
71.43
-20.0% kpi/utils/project_views.py
6
30.38
-7.59% kobo/apps/accounts/utils.py
6
56.22
-3.24% kobo/apps/organizations/models.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
42.86
-42.86% kpi/mixins/asset.py
6
22.12
-5.31% kpi/utils/models.py
5
41.79
-7.46% kobo/apps/accounts/signals.py
5
65.91
-7.78% kobo/apps/data_collectors/signals.py
5
33.1
-3.52% kobo/apps/mass_emails/user_queries.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
46.34
-12.2% 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
57.14
-23.81% kpi/fields/writable_json.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
50.0
-10.53% kobo/apps/organizations/utils.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
16.1% kobo/apps/openrosa/apps/api/viewsets/xform_submission_api.py
3
80.0
-20.0% kobo/apps/openrosa/apps/viewer/signals.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
91.3
-8.7% kobo/apps/project_ownership/views/invite.py
2
66.67
-2.56% kpi/authentication.py
2
87.2
-1.6% kpi/exceptions.py
2
64.52
-6.45% kpi/mixins/standardize_searchable_field.py
2
96.36
-3.64% kpi/mixins/xls_exportable.py
2
90.0
-10.0% kpi/utils/absolute_paths.py
1
44.44
-5.56% kobo/apps/accounts/templatetags/get_provider_appname.py
1
88.24
-5.88% kobo/apps/audit_log/middleware.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
93.33
4.44% kobo/apps/openrosa/libs/renderers/renderers.py
1
68.75
31.25% kobo/apps/openrosa/libs/utils/string.py
1
57.89
-2.63% kpi/db_routers.py
1
79.49
-2.56% kpi/deployment_backends/kc_access/storage.py
1
96.67
-3.33% kpi/fields/kpi_uid.py
1
87.1
-3.23% kpi/fields/lazy_default_jsonb.py
Jobs
ID Job ID Ran Files Coverage
1 38914364267.1 16 Oct 2026 02:19PM UTC 910
43.71
2 38914364267.2 16 Oct 2026 02:20PM UTC 910
49.86
3 38914364267.3 16 Oct 2026 02:22PM UTC 912
44.99
4 38914364267.4 16 Oct 2026 02:23PM UTC 913
67.73
5 38914364267.5 16 Oct 2026 02:23PM UTC 912
54.03
6 38914364267.6 16 Oct 2026 02:24PM UTC 912
51.11
7 38914364267.7 16 Oct 2026 02:24PM UTC 912
59.49
8 38914364267.8 16 Oct 2026 02:25PM UTC 910
58.42
9 38914364267.9 16 Oct 2026 02:27PM UTC 915
70.13
10 38914364267.10 16 Oct 2026 02:34PM UTC 910
52.8
Source Files on build 38914364267
  • Tree
  • List 915
  • Changed 11
  • Source Changed 0
  • Coverage Changed 11
Coverage βˆ† File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 8dceaedf on github
  • Prev Build on release/2.026.37 (#38784352033)
  • Next Build on release/2.026.37 (#38919606156)
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