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

kobotoolbox / kpi / 28599329881
81%
master: 76%

Build:
Build:
LAST BUILD BRANCH: dependabot/github_actions/actions-deps-2d1112a488
DEFAULT BRANCH: master
Ran 02 Jul 2026 02:54PM 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

02 Jul 2026 02:50PM UTC coverage: 81.434% (-0.005%) from 81.439%
28599329881

push

github

web-flow
refactor(projectSettings): tsify DEV-2214 (#7190)

### đŸ—’ī¸ Checklist

1. [x] run linter locally
2. [x] update developer docs (API, README, inline, etc.), if any
3. [x] for user-facing doc changes create a Zulip thread at `#Support
Docs Updates`, if any
4. [x] draft PR with a title `<type>(<scope>)<!>: <title> DEV-1234`
5. [x] assign yourself, tag PR: at least `Front end` and/or `Back end`
or `workflow`
6. [x] fill in the template below and delete template comments
7. [x] review thyself: read the diff and repro the preview as written
8. [x] open PR & confirm that CI passes & request reviewers, if needed
9. [x] act on any greptile review below a 5/5 score or leave comment
explaining why you won't
10. [ ] delete this checklist section from the final squash commit
before merging

### 💭 Notes

Changes here:
- **projectSettings.tsx**: Migrated from JavaScript to TypeScript
  - Added interfaces
  - Tried to keep type casting minimal (no `any` 👍)
- Dynamic field assignment now uses a switch statement to avoid casting
`as any`
  
- **mixins.tsx**: Added type definitions for the legacy mixins (we're
still using react-mixin for now)
  - Created DmixProps, DmixState, and DmixContext interfaces
- All mixin methods have explicit `this` parameter typing so TypeScript
understands what props/state are available at runtime
  - Both contextRouter and dmix mixins now have full type signatures

No functional changes - everything works the same, just with
compile-time type safety.

### 👀 Preview steps

1. â„šī¸ Have a project
2. Open the project and go to Settings tab
3. Try editing different fields and saving:
   - Project name
   - Description  
   - Sector/Country
4. đŸŸĸ Everything should save normally
5. If you have a deployed project, try archiving and unarchiving it from
settings
6. đŸŸĸ Should work exactly like the main branch

Nothing should break since this is (almost) purely internal TypeScript
changes.

---------

Co-authored-by: James Kiger <68701146+jamesrkiger@users.n... (continued)

9258 of 12599 branches covered (73.48%)

30212 of 37100 relevant lines covered (81.43%)

5.52 hits per line

Coverage Regressions

Lines Coverage ∆ File
226
26.4
-63.48% kpi/serializers/v2/asset_permission_assignment.py
189
47.45
-31.14% kpi/deployment_backends/openrosa_backend.py
189
64.26
-29.62% kpi/serializers/v2/asset.py
185
14.34
-66.31% kobo/apps/subsequences/tasks.py
165
30.61
-56.12% kobo/apps/subsequences/models.py
157
36.93
-51.31% kpi/views/v2/data.py
150
28.85
-57.69% kobo/apps/subsequences/serializers.py
126
19.9
-64.29% kobo/apps/subsequences/utils/versioning.py
116
54.48
-26.67% kobo/apps/audit_log/models.py
107
15.7
-47.98% kobo/apps/superuser_stats/tasks.py
98
61.89
-26.49% kpi/views/v2/asset.py
87
29.29
-62.14% kpi/serializers/v2/asset_file.py
86
26.12
-64.18% kobo/apps/trash_bin/utils/trash.py
71
20.58
-29.22% kobo/apps/subsequences/integrations/google/google_translate.py
70
37.21
-40.7% kpi/serializers/current_user.py
66
31.62
-56.41% kpi/serializers/v2/export_task.py
66
26.85
-61.11% kpi/serializers/v2/paired_data.py
63
66.91
-15.56% kpi/deployment_backends/base_backend.py
63
34.55
-57.27% kpi/views/v2/paired_data.py
62
19.77
-24.03% kobo/apps/subsequences/integrations/google/google_transcribe.py
56
27.68
-50.0% kpi/utils/models.py
53
42.86
-50.48% kpi/views/v2/environment.py
50
74.42
-23.26% kpi/permissions.py
47
56.81
-22.07% kpi/filters.py
44
52.58
-45.36% kobo/apps/subsequences/views.py
44
78.29
-7.24% kpi/models/import_export_task.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
52.56
-19.07% kpi/renderers.py
41
43.7
-30.37% kpi/views/v2/asset_snapshot.py
38
45.6
-30.4% kobo/apps/project_views/views.py
33
66.4
-26.4% kpi/models/paired_data.py
32
34.67
-21.33% kobo/apps/project_ownership/utils.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
27
83.0
-13.5% kpi/utils/xml.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
25
74.76
-24.27% kpi/utils/usage_calculator.py
24
27.63
-31.58% kobo/apps/subsequences/integrations/google/rate_limit.py
24
71.43
-28.57% kpi/serializers/v2/service_usage.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
50.98
-43.14% kpi/serializers/v2/asset_snapshot.py
22
55.56
-40.74% kpi/serializers/v2/permission.py
21
77.61
-10.45% kobo/apps/project_ownership/models/transfer.py
21
48.84
-48.84% kobo/apps/trash_bin/models/project.py
21
69.23
-26.92% kpi/authentication.py
21
38.33
-35.0% kpi/serializers/v2/asset_export_settings.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
48.65
-48.65% kpi/views/v2/attachment_audio_duration.py
17
17.76
-15.89% kobo/apps/subsequences/actions/mixins.py
17
44.12
-50.0% kpi/utils/rename_xls_sheet.py
16
55.71
-22.86% hub/utils/i18n.py
16
32.0
-64.0% kobo/apps/openrosa/apps/logger/utils/attachment.py
16
35.57
-6.32% kobo/apps/subsequences/actions/base.py
16
55.81
-37.21% kpi/backends.py
16
75.0
-13.79% kpi/models/asset_snapshot.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
14
85.29
-13.73% kpi/models/asset_file.py
14
75.94
-10.53% kpi/paginators.py
13
27.87
-10.66% kobo/apps/project_ownership/tasks.py
13
45.71
-37.14% kobo/apps/user_reports/seralizers.py
13
40.0
-43.33% kpi/serializers/v2/asset_counts.py
13
79.05
-12.38% kpi/utils/object_permission.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
43.48
-52.17% kobo/apps/subsequences/throttling.py
12
57.14
-42.86% kobo/apps/subsequences/utils/supplement_data.py
12
91.56
-2.11% kpi/models/asset.py
11
70.18
-19.3% kpi/utils/mailer.py
10
79.76
-11.9% kobo/apps/audit_log/base_views.py
10
71.43
-7.14% kobo/apps/audit_log/signals.py
10
44.0
-40.0% kobo/apps/stripe/signals.py
10
39.58
-20.83% kobo/apps/subsequences/prompts.py
10
33.33
-37.04% kpi/mixins/audio_transcoding.py
10
78.85
-19.23% kpi/serializers/v2/user.py
10
47.69
-15.38% kpi/utils/hash.py
10
63.33
-33.33% kpi/views/v2/asset_version.py
9
41.0
-9.0% kobo/apps/accounts/mfa/models.py
9
77.07
-4.39% kpi/utils/mongo_helper.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
58.51
-8.51% kobo/apps/stripe/utils/billing_dates.py
8
77.78
-8.08% kpi/password_validation.py
8
85.71
-11.43% kpi/utils/cache.py
7
81.08
-18.92% kobo/apps/project_views/serializers.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
92.92
-1.91% kpi/mixins/object_permission.py
7
52.94
-41.18% kpi/serializers/v2/reports.py
7
61.9
-16.67% kpi/utils/urls.py
7
74.07
-25.93% kpi/views/v2/attachment_delete.py
7
75.86
-24.14% kpi/views/v2/tag.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
80.0
-20.0% kpi/serializers/v2/tag.py
6
65.87
-4.76% kpi/utils/autoname.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
62.07
-5.75% kpi/tasks.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
83.74
-3.25% kobo/apps/accounts/forms.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
78.4
-3.2% kobo/apps/stripe/utils/subscription_limits.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
70.05
-2.03% kpi/mixins/formpack_xlsform_utils.py
4
76.19
-19.05% kpi/serializers/v2/user_asset_subscription.py
4
20.0
-80.0% kpi/utils/placeholders.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
75.0
-25.0% kobo/apps/superuser_stats/admin.py
3
86.27
-5.88% kpi/context_processors.py
3
87.61
-2.65% kpi/exceptions.py
3
70.0
-30.0% kpi/fields/serializer_method_file.py
3
80.95
-14.29% kpi/fields/writable_json.py
3
80.0
-20.0% kpi/serializers/v2/attachment_audio_duration.py
3
78.57
-10.71% kpi/utils/submission.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
72.97
-5.41% kobo/apps/accounts/adapter.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
87.73
-0.37% kobo/apps/openrosa/libs/utils/logger_tools.py
2
42.86
-28.57% kobo/apps/subsequences/utils/time.py
2
60.26
-2.56% kpi/deployment_backends/kc_access/utils.py
2
66.67
-16.67% kpi/mixins/validation_password_permission.py
2
96.3
-3.7% kpi/mixins/xls_exportable.py
2
92.73
-3.64% kpi/signals.py
2
96.55
-2.3% kpi/utils/asset_content_analyzer.py
2
91.43
-5.71% kpi/utils/project_views.py
2
85.92
-2.82% kpi/utils/sluggify.py
2
42.17
-2.41% kpi/utils/storage.py
2
88.24
-11.76% kpi/views/v2/service_usage.py
1
63.64
-9.09% kobo/apps/accounts/mfa/permissions.py
1
94.12
-5.88% kobo/apps/audit_log/middleware.py
1
76.6
-2.13% kobo/apps/kobo_auth/models.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
63.03
-0.61% kobo/apps/organizations/models.py
1
84.27
-1.12% kobo/apps/reports/report_data.py
1
70.73
-2.44% kpi/admin.py
1
96.67
-3.33% kpi/fields/kpi_uid.py
1
75.0
-25.0% kpi/fields/read_only.py
1
82.61
-4.35% kpi/fields/relative_prefix_hyperlinked_related.py
1
90.0
-10.0% kpi/mixins/mfa.py
1
91.3
-4.35% kpi/serializers/v2/asset_version.py
1
62.5
-12.5% kpi/utils/datetime.py
1
93.94
-1.01% kpi/utils/django_orm_helper.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
94.12
-5.88% kpi/utils/strings.py
1
84.62
-7.69% kpi/versioning.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 28599329881.1 02 Jul 2026 02:54PM UTC 888
44.45
2 28599329881.2 02 Jul 2026 02:55PM UTC 888
52.97
3 28599329881.3 02 Jul 2026 02:55PM UTC 888
49.63
4 28599329881.4 02 Jul 2026 02:56PM UTC 890
45.81
5 28599329881.5 02 Jul 2026 02:56PM UTC 890
50.96
6 28599329881.6 02 Jul 2026 02:57PM UTC 890
54.24
7 28599329881.7 02 Jul 2026 02:58PM UTC 888
58.95
8 28599329881.8 02 Jul 2026 02:58PM UTC 890
66.64
9 28599329881.9 02 Jul 2026 03:00PM UTC 892
68.95
10 28599329881.10 02 Jul 2026 03:00PM UTC 890
60.11
Source Files on build 28599329881
  • Tree
  • List 892
  • Changed 1
  • Source Changed 0
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 3ac9386a on github
  • Prev Build on main (#28597602232)
  • Next Build on main (#28599388330)
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