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

kobotoolbox / kpi / 28770625340
81%
master: 76%

Build:
Build:
LAST BUILD BRANCH: dependabot/github_actions/actions-deps-2d1112a488
DEFAULT BRANCH: master
Ran 06 Jul 2026 05:51AM UTC
Jobs 10
Files 892
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

06 Jul 2026 05:46AM UTC coverage: 81.481% (+0.04%) from 81.443%
28770625340

push

github

web-flow
fix(auth): handle user names from IdP and metadata refactor DEV-2394 (#7215)

### 📣 Summary
Map standard SCIM name attributes (givenName, familyName, and formatted)
natively to Kobo user fields (User.first_name, User.last_name, and
ExtraUserDetail.data['name']) during SCIM provisioning.

### 📖 Description
Previously, Kobo's SCIM implementation did not natively capture standard
name payload attributes from the IdP when creating or updating users.
This resulted in new users appearing with empty full names inside the
Kobo frontend. This PR resolves the issue by intercepting the standard
SCIM core schema attributes for names and mapping them to their
appropriate Kobo storage locations:

* `name.givenName` → `User.first_name`
* `name.familyName` → `User.last_name`
* `name.formatted` → `ExtraUserDetail.data['name']`

- Refactored the core extraction logic inside
kobo/apps/kobo_scim/utils.py. Created a helper function
`get_scim_value()` that parses both nested JSON dictionaries and SCIM
extension URN paths
- Unified Metadata Application: Updated `apply_scim_user_metadata()` to
natively process standard SCIM core fields alongside the configurable
custom metadata mappings (`USER_METADATA_FIELDS`). Because this utility
handles all mapping, POST, PUT, and PATCH API requests automatically
receive this behavior without duplicating code in the view layer
- Updated `ScimUserSerializer.get_name()` to fetch the formatted name
from ExtraUserDetail so the SCIM API returns the correct data. It safely
falls back to concatenating first_name and last_name if formatted is
omitted

### 👀 Preview steps
1. Simulate the IdP pushing a brand-new user with a full `name` payload.

```bash
curl -X POST http://kf.local.kbtdev.org/scim/v2/<IDP_SLUG>/Users \
  -H "Authorization: Bearer <SCIM_API_KEY>" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "userName": "curltestuser",
    "active": true,
    "emails": [
  ... (continued)

9263 of 12594 branches covered (73.55%)

3 of 75 new or added lines in 4 files covered. (4.0%)

1395 existing lines in 72 files now uncovered.

30228 of 37098 relevant lines covered (81.48%)

5.52 hits per line

Uncovered Changes

Lines Coverage ∆ File
62
8.73
-0.17% kobo/apps/kobo_scim/utils.py
5
62.69
-5.06% kobo/apps/kobo_scim/serializers.py
5
26.23
-0.06% kobo/apps/kobo_scim/views.py

Coverage Regressions

Lines Coverage ∆ File
133
36.93
-43.46% kpi/views/v2/data.py
97
29.35
-48.26% kobo/apps/project_ownership/models/transfer.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
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
52
42.86
-49.52% kpi/views/v2/environment.py
44
20.21
-46.81% kobo/apps/stripe/utils/billing_dates.py
41
45.06
-9.43% kobo/apps/audit_log/models.py
40
61.89
-10.81% kpi/views/v2/asset.py
38
34.52
-45.24% kobo/apps/audit_log/base_views.py
38
49.47
-40.0% kpi/views/v2/asset_permission_assignment.py
27
0.0
-72.97% kobo/apps/accounts/adapter.py
27
16.67
-18.0% kobo/apps/project_ownership/utils.py
25
74.76
-24.27% kpi/utils/usage_calculator.py
21
0.0
-84.0% kobo/apps/stripe/signals.py
20
52.38
-31.75% hub/models/extra_user_detail.py
20
0.0
-68.97% kobo/apps/audit_log/tasks.py
20
43.7
-14.81% kpi/views/v2/asset_snapshot.py
19
0.0
-65.52% kobo/apps/stripe/admin.py
17
46.99
-10.24% kobo/apps/organizations/views.py
16
60.0
-11.43% kobo/apps/audit_log/signals.py
16
84.8
-2.93% kobo/apps/openrosa/libs/utils/logger_tools.py
16
31.82
-36.36% kobo/apps/stripe/utils/limit_enforcement.py
16
59.32
-27.12% kpi/views/v2/export_task.py
16
34.55
-14.55% kpi/views/v2/paired_data.py
13
37.14
-18.57% hub/utils/i18n.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
51.06
-25.53% kpi/views/v2/import_task.py
10
60.71
-35.71% kobo/apps/audit_log/utils.py
10
66.2
-14.08% kobo/apps/project_ownership/models/invite.py
9
57.58
-5.45% kobo/apps/organizations/models.py
9
0.0
-29.03% kobo/apps/stripe/utils/manual_subscription.py
9
79.17
-18.75% kpi/views/v2/asset_file.py
8
0.0
-100.0% kobo/apps/stripe/urls.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
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
61.9
-14.29% kpi/utils/urls.py
5
30.0
-7.14% kobo/apps/organizations/permissions.py
5
47.22
-13.89% kobo/apps/organizations/tasks.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
3
65.79
-7.89% kobo/apps/data_collectors/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
78.57
-10.71% kpi/utils/submission.py
3
30.67
-4.0% kpi/utils/two_database_configuration_checker.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.17
-2.41% kpi/utils/storage.py
2
75.0
-16.67% kpi/views/v2/open_rosa.py
2
88.24
-11.76% kpi/views/v2/service_usage.py
1
44.44
-5.56% kobo/apps/accounts/templatetags/get_provider_appname.py
1
62.69
-5.06% kobo/apps/kobo_scim/serializers.py
1
8.73
-0.17% kobo/apps/kobo_scim/utils.py
1
26.23
-0.06% kobo/apps/kobo_scim/views.py
1
86.11
-2.78% kobo/apps/openrosa/apps/logger/fields.py
1
92.31
-7.69% kobo/apps/user_reports/utils/migrations.py
1
72.73
-4.55% kpi/urls/__init__.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
Jobs
ID Job ID Ran Files Coverage
1 28770625340.1 06 Jul 2026 05:51AM UTC 888
49.64
2 28770625340.2 06 Jul 2026 05:51AM UTC 888
44.47
3 28770625340.3 06 Jul 2026 05:52AM UTC 888
52.99
4 28770625340.4 06 Jul 2026 05:52AM UTC 890
45.84
5 28770625340.5 06 Jul 2026 05:52AM UTC 890
50.98
6 28770625340.6 06 Jul 2026 05:53AM UTC 890
54.26
7 28770625340.7 06 Jul 2026 05:54AM UTC 888
58.98
8 28770625340.8 06 Jul 2026 05:54AM UTC 890
66.68
9 28770625340.9 06 Jul 2026 05:56AM UTC 890
60.14
10 28770625340.10 06 Jul 2026 05:56AM UTC 892
69.0
Source Files on build 28770625340
  • Tree
  • List 892
  • Changed 4
  • Source Changed 0
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • 1ffdfc29 on github
  • Prev Build on main (#28667492961)
  • Next Build on main (#28864857429)
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