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

kobotoolbox / kpi / 26242541573
82%
master: 76%

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 21 May 2026 05:39PM UTC
Jobs 10
Files 916
Run time 4min
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

21 May 2026 05:35PM UTC coverage: 82.036% (-0.005%) from 82.041%
26242541573

push

github

web-flow
fix(languages): correct Orval-generated types for language services fields and LanguagesListParams DEV-2142 DEV-2143 (#7067)

### 📣 Summary
This PR corrects two OpenAPI schema inaccuracies in the language
endpoints that caused incorrect Orval-generated TypeScript types for the
frontend.

### 📖 Description
This PR addresses two schema issues reported by the frontend against the
language API endpoints.

**Issue 1: Incorrect schema for `transcription_services` /
`translation_services` on the retrieve endpoint**

The list (`/api/v2/languages/`) and retrieve
(`/api/v2/languages/{code}/`) endpoints return different shapes for the
services fields, but both serializers were annotated with the same
`@extend_schema_field(ServicesField)`, causing drf-spectacular to emit
one schema for both, which matched only the list endpoint. This led
Orval to generate an incorrect array type for the retrieve endpoint's
response.

This is resolved by introducing a dedicated `ServicesDetailField` marker
class and a corresponding `ServicesDetailFieldExtension` that emits the
correct nested-object schema (`{ [serviceCode]: { [regionCode]: string }
}`).

`LanguageSerializer` (retrieve) is updated to use `ServicesDetailField`,
while `LanguageListSerializer` (list) continues to use the existing
`ServicesField`.

**Issue 2: Missing `q` query parameter in `LanguagesListParams`**

The `LanguageViewSet` relied on `BaseViewSet`'s `SearchFilter` backend
to handle the `q` parameter at runtime, but drf-spectacular requires
explicit `OpenApiParameter` declarations to include query params in the
schema. As a result, `q` was absent from the generated
`LanguagesListParams` type, forcing the frontend to cast hook calls with
`as any`. This is resolved by adding an explicit
`OpenApiParameter(name='q', ...)` declaration to the `list` action
schema, consistent with the pattern already used in
`TranscriptionServiceViewSet`.

9239 of 12471 branches covered (74.08%)

10 of 11 new or added lines in 4 files covered. (90.91%)

3101 existing lines in 94 files now uncovered.

30551 of 37241 relevant lines covered (82.04%)

5.73 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
81.25
-2.08% kobo/apps/languages/schema_extensions/v2/languages/extensions.py

Coverage Regressions

Lines Coverage ∆ File
321
0.0
-90.68% kobo/apps/openrosa/apps/viewer/pandas_mongo_bridge.py
230
44.51
-42.12% kobo/apps/openrosa/libs/utils/logger_tools.py
215
18.97
-52.96% kobo/apps/openrosa/libs/utils/export_tools.py
206
0.0
-86.19% kobo/apps/openrosa/libs/utils/briefcase_client.py
101
42.11
-53.16% kobo/apps/openrosa/apps/api/viewsets/xform_list_api.py
93
33.96
-58.49% kobo/apps/openrosa/apps/api/permissions.py
87
0.0
-87.88% kobo/apps/openrosa/libs/utils/backup_tools.py
86
28.67
-60.14% kobo/apps/openrosa/apps/viewer/views.py
81
33.11
-53.64% kobo/apps/openrosa/apps/api/viewsets/briefcase_api.py
71
33.62
-61.21% kobo/apps/openrosa/libs/filters.py
66
66.18
-15.94% kobo/apps/audit_log/models.py
66
32.23
-54.55% kobo/apps/openrosa/apps/api/viewsets/data_viewset.py
59
46.96
-51.3% kobo/apps/openrosa/apps/api/viewsets/xform_submission_api.py
58
0.0
-90.63% kobo/apps/openrosa/libs/data/query.py
52
34.81
-32.91% kobo/apps/openrosa/apps/api/viewsets/xform_viewset.py
51
57.87
-20.08% kobo/apps/openrosa/apps/viewer/models/parsed_instance.py
50
0.0
-47.17% kobo/apps/openrosa/apps/logger/tasks.py
49
28.57
-43.75% kobo/apps/openrosa/apps/logger/views.py
48
37.96
-44.44% kobo/apps/openrosa/apps/logger/utils/instance.py
46
54.92
-37.7% kobo/apps/openrosa/libs/serializers/xform_serializer.py
45
55.46
-37.82% kobo/apps/openrosa/apps/logger/models/attachment.py
43
46.1
-15.99% kobo/apps/openrosa/apps/viewer/models/data_dictionary.py
43
23.29
-58.9% kobo/apps/openrosa/libs/utils/image_tools.py
40
0.0
-40.82% kobo/apps/openrosa/apps/viewer/xls_writer.py
39
23.08
-30.0% kobo/apps/openrosa/apps/viewer/tasks.py
37
61.11
-29.37% kobo/apps/openrosa/apps/logger/signals.py
37
32.97
-40.66% kobo/apps/openrosa/libs/serializers/metadata_serializer.py
36
24.49
-73.47% kobo/apps/openrosa/apps/logger/import_tools.py
36
55.29
-42.35% kobo/apps/openrosa/libs/renderers/renderers.py
33
49.51
-32.04% kobo/apps/openrosa/apps/viewer/models/export.py
31
40.48
-18.45% kobo/apps/openrosa/apps/main/models/meta_data.py
30
0.0
-75.0% kobo/apps/openrosa/apps/django_digest_backends/cache.py
29
30.14
-19.86% kobo/apps/openrosa/libs/utils/viewer_tools.py
28
41.27
-44.44% kobo/apps/openrosa/libs/serializers/data_serializer.py
27
34.0
-54.0% kobo/apps/data_collectors/authentication.py
27
49.06
-50.94% kobo/apps/openrosa/libs/serializers/attachment_serializer.py
26
35.71
-61.9% kobo/apps/openrosa/libs/mixins/labels_mixin.py
26
27.78
-72.22% kobo/apps/openrosa/libs/utils/decorators.py
25
51.22
-30.49% kobo/apps/accounts/mfa/views.py
23
0.0
-67.65% kobo/apps/accounts/mfa/adapter.py
20
16.22
-54.05% kobo/apps/openrosa/apps/logger/utils/database_query.py
20
29.67
-21.98% kobo/apps/openrosa/libs/utils/user_auth.py
17
81.25
-6.64% kobo/apps/openrosa/apps/logger/xform_instance_parser.py
16
55.71
-22.86% hub/utils/i18n.py
15
67.74
-24.19% kobo/apps/hook/models/hook.py
15
20.0
-60.0% kobo/apps/openrosa/apps/api/utils/xml.py
15
31.71
-36.59% kobo/apps/openrosa/apps/logger/xform_fs.py
15
41.94
-48.39% kobo/apps/openrosa/libs/authentication.py
15
34.78
-65.22% kobo/apps/openrosa/libs/models/signals.py
14
44.0
-56.0% kobo/apps/openrosa/libs/utils/model_tools.py
13
75.39
-6.81% kobo/apps/openrosa/apps/logger/models/xform.py
12
28.21
-30.77% kobo/apps/accounts/mfa/flows.py
12
76.02
-6.12% kobo/apps/openrosa/apps/logger/models/instance.py
12
48.0
-48.0% kobo/apps/openrosa/apps/logger/utils/attachment.py
12
44.9
-24.49% kobo/apps/openrosa/apps/logger/utils/counters.py
12
70.0
-30.0% kobo/apps/openrosa/libs/serializers/user_profile_serializer.py
11
62.5
-34.38% kobo/apps/openrosa/apps/api/viewsets/attachment_viewset.py
10
58.33
-41.67% kobo/apps/openrosa/apps/api/viewsets/note_viewset.py
9
41.0
-9.0% kobo/apps/accounts/mfa/models.py
9
30.56
-8.33% kobo/apps/openrosa/apps/api/tools.py
9
62.07
-31.03% kobo/apps/openrosa/apps/api/viewsets/metadata_viewset.py
9
57.45
-9.57% kobo/apps/openrosa/libs/utils/middleware.py
8
72.06
-5.88% kobo/apps/audit_log/signals.py
7
31.25
-43.75% kobo/apps/openrosa/libs/utils/string.py
6
66.67
-28.57% kobo/apps/openrosa/apps/api/viewsets/connect_viewset.py
6
69.57
-26.09% kobo/apps/openrosa/libs/permissions.py
6
63.08
-9.23% kpi/utils/hash.py
5
83.64
-9.09% 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
50.0
-50.0% kobo/apps/openrosa/libs/mixins/openrosa_headers_mixin.py
5
66.67
-33.33% kobo/apps/openrosa/libs/serializers/note_serializer.py
4
83.74
-3.25% kobo/apps/accounts/forms.py
4
63.27
-8.16% kobo/apps/hook/views/v2/hook_log.py
4
63.33
-6.67% kobo/apps/openrosa/apps/main/models/user_profile.py
4
45.45
-36.36% kobo/apps/openrosa/koboform/__init__.py
3
59.32
-5.08% kobo/apps/hook/views/v2/hook.py
3
76.6
-6.38% kobo/apps/kobo_auth/models.py
3
80.0
-20.0% kobo/apps/openrosa/apps/viewer/signals.py
3
50.0
-37.5% kobo/apps/openrosa/libs/mixins/anonymous_user_public_forms_mixin.py
3
46.67
-20.0% kobo/apps/openrosa/libs/serializers/tag_list_serializer.py
2
72.97
-5.41% kobo/apps/accounts/adapter.py
2
60.0
-40.0% kobo/apps/audit_log/filters.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
61.54
-15.38% kobo/apps/openrosa/libs/utils/gravatar.py
1
63.64
-9.09% kobo/apps/accounts/mfa/permissions.py
1
94.12
-5.88% kobo/apps/audit_log/middleware.py
1
91.67
-2.78% kobo/apps/audit_log/serializers.py
1
0.0
-100.0% kobo/apps/openrosa/apps/logger/constants.py
1
75.0
-25.0% kobo/apps/openrosa/libs/utils/storage.py
1
63.03
-0.61% kobo/apps/organizations/models.py
Jobs
ID Job ID Ran Files Coverage
1 26242541573.1 21 May 2026 05:39PM UTC 912
52.0
2 26242541573.2 21 May 2026 05:40PM UTC 912
53.64
3 26242541573.3 21 May 2026 05:41PM UTC 914
53.23
4 26242541573.4 21 May 2026 05:41PM UTC 914
54.89
5 26242541573.5 21 May 2026 05:42PM UTC 912
59.46
6 26242541573.6 21 May 2026 05:42PM UTC 912
52.26
7 26242541573.7 21 May 2026 05:42PM UTC 914
66.11
8 26242541573.8 21 May 2026 05:43PM UTC 914
53.6
9 26242541573.9 21 May 2026 05:44PM UTC 914
60.59
10 26242541573.10 21 May 2026 05:46PM UTC 916
68.41
Source Files on build 26242541573
  • Tree
  • List 916
  • Changed 7
  • Source Changed 0
  • Coverage Changed 7
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 807c05d2 on github
  • Prev Build on main (#26237509050)
  • Next Build on main (#26248733935)
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