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

kobotoolbox / kpi / 25747273888
82%
master: 76%

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 12 May 2026 04:24PM UTC
Jobs 10
Files 912
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

12 May 2026 04:17PM UTC coverage: 82.179% (+0.008%) from 82.171%
25747273888

push

github

web-flow
fix(exports): prevent simultaneous identical exports DEV-2021 (#7028)

### đŸ“Ŗ Summary
Identical duplicate API export requests are now intercepted and
deduplicated. Instead of creating a new background Celery task, the API
queries for an identical running export task belonging to the same user
and returns it seamlessly to the frontend.

### 📖 Description
Previously, if the frontend (or a script) blindly retried this POST
request with the exact same JSON payload before the first export
finished, the system would make another background Celery task with the
same parameters. The new implementation within
`ExportTaskSerializer.create()` fixes this by first checking the
database for any active SubmissionExportTask belonging to the current
user that has an identical data payload (ensuring the configurations
like fields, group_sep, type, etc., match exactly). If a matching task
is found that is still in a CREATED or PROCESSING state, the serializer
bypasses database creation and returns the existing task. This allows
the frontend to continue polling the original task gracefully without
duplicating the task and wasting resources.


### 👀 Preview steps

1. â„šī¸ have an account and a project
2. Simulate a long export by adding `time.sleep(30)` to the method
`SubmissionExportTask,_run_task` at
`/kpi/kpi/models/import_export_task.py`
3. Export the project data
4. within 30 seconds, duplicate your browser tab and export the data
again with the same export configuration
5. 🔴 [on main] notice that this creates a duplicated export task
6. đŸŸĸ [on PR] notice that this doesn't create a duplicated export task

8980 of 12047 branches covered (74.54%)

16 of 37 new or added lines in 2 files covered. (43.24%)

1635 existing lines in 100 files now uncovered.

29661 of 36093 relevant lines covered (82.18%)

5.78 hits per line

Uncovered Changes

Lines Coverage ∆ File
20
59.32
-6.72% kpi/views/v2/export_task.py
1
77.87
-3.31% kpi/models/import_export_task.py

Coverage Regressions

Lines Coverage ∆ File
94
28.28
-31.65% kpi/views/v2/data.py
87
29.29
-62.14% kpi/serializers/v2/asset_file.py
81
0.0
-93.1% kobo/apps/stripe/serializers.py
75
0.0
-41.9% kobo/apps/stripe/views.py
72
49.02
-17.56% kobo/apps/audit_log/models.py
63
0.0
-51.64% kobo/apps/stripe/models.py
60
26.05
-50.42% kobo/apps/stripe/utils/subscription_limits.py
57
27.68
-50.89% kpi/utils/models.py
56
61.5
-26.29% kpi/permissions.py
55
61.11
-9.55% kpi/serializers/v2/asset.py
50
54.46
-24.75% kpi/filters.py
39
27.13
-30.23% kobo/apps/trash_bin/utils/trash.py
37
40.69
-6.1% kpi/deployment_backends/openrosa_backend.py
36
20.21
-38.3% kobo/apps/stripe/utils/billing_dates.py
33
21.8
-24.81% kobo/apps/subsequences/models.py
31
37.21
-18.02% kpi/serializers/current_user.py
27
36.36
-49.09% kpi/views/v1/export_task.py
26
40.48
-20.63% kobo/apps/openrosa/apps/logger/signals.py
25
62.75
-7.0% kpi/views/v2/asset.py
24
65.01
-5.96% kpi/deployment_backends/base_backend.py
23
64.76
-21.9% kpi/utils/object_permission.py
22
50.98
-43.14% kpi/serializers/v2/asset_snapshot.py
22
55.56
-40.74% kpi/serializers/v2/permission.py
21
48.84
-48.84% kobo/apps/trash_bin/models/project.py
20
77.87
-3.31% kpi/models/import_export_task.py
19
0.0
-65.52% kobo/apps/stripe/admin.py
19
42.5
-47.5% kpi/views/v1/import_task.py
19
49.25
-28.36% kpi/views/v2/user.py
18
42.33
-8.37% kpi/renderers.py
17
26.4
-4.78% kpi/serializers/v2/asset_permission_assignment.py
16
55.81
-37.21% kpi/backends.py
16
43.7
-11.85% kpi/views/v2/asset_snapshot.py
14
25.0
-12.96% kobo/apps/openrosa/apps/logger/utils/instance.py
14
31.82
-31.82% kobo/apps/stripe/utils/limit_enforcement.py
14
30.43
-60.87% kpi/utils/private_storage.py
13
49.47
-13.68% kpi/views/v2/asset_permission_assignment.py
12
35.0
-60.0% kobo/apps/stripe/utils/import_management.py
12
90.24
-2.17% kpi/models/asset.py
12
75.0
-10.34% kpi/models/asset_snapshot.py
11
78.57
-13.1% kobo/apps/audit_log/base_views.py
11
78.16
-12.64% kobo/apps/audit_log/signals.py
11
0.0
-44.0% kobo/apps/stripe/signals.py
11
28.57
-52.38% kobo/apps/trash_bin/utils/signals.py
11
44.12
-32.35% kpi/utils/rename_xls_sheet.py
11
75.0
-21.15% kpi/views/v2/asset_file.py
10
85.29
-9.8% kpi/models/asset_file.py
10
78.85
-19.23% kpi/serializers/v2/user.py
10
47.69
-15.38% kpi/utils/hash.py
10
57.14
-35.71% kpi/views/v1/asset.py
9
77.73
-3.52% kobo/apps/openrosa/apps/logger/xform_instance_parser.py
9
41.18
-52.94% kpi/utils/viewset_mixins.py
8
0.0
-100.0% kobo/apps/stripe/urls.py
8
52.56
-10.26% kpi/authentication.py
7
0.0
-100.0% kobo/apps/stripe/apps.py
7
37.6
-2.89% kobo/apps/subsequences/actions/base.py
7
52.38
-33.33% kpi/serializers/v2/reports.py
7
71.71
-3.41% kpi/utils/mongo_helper.py
7
57.0
-3.5% kpi/utils/xml.py
7
63.33
-23.33% kpi/views/v2/asset_version.py
6
0.0
-37.5% kobo/apps/stripe/utils/view_utils.py
6
65.87
-4.76% kpi/utils/autoname.py
5
57.14
-17.86% kobo/apps/subsequences/utils/supplement_data.py
5
62.07
-5.75% kpi/tasks.py
5
40.0
-50.0% kpi/utils/fuzzy_int.py
5
86.21
-3.45% kpi/utils/query_parser/query_parser.py
5
44.44
-55.56% kpi/views/v1/submission.py
5
73.91
-21.74% kpi/views/v2/user_asset_subscription.py
4
32.0
-16.0% kobo/apps/openrosa/apps/logger/utils/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
3
44.57
-0.56% kobo/apps/openrosa/libs/utils/logger_tools.py
3
61.21
-1.82% kobo/apps/organizations/models.py
3
60.53
-7.89% kobo/apps/organizations/utils.py
3
70.0
-30.0% kpi/fields/serializer_method_file.py
3
57.14
-42.86% kpi/views/v1/asset_version.py
3
84.21
-15.79% kpi/views/v2/permission.py
2
75.0
-1.02% kobo/apps/openrosa/apps/logger/models/instance.py
2
66.67
-13.33% kobo/apps/openrosa/apps/viewer/signals.py
2
60.0
-20.0% kpi/mixins/mfa.py
2
31.62
0.0% kpi/serializers/v2/export_task.py
2
96.55
-2.3% kpi/utils/asset_content_analyzer.py
2
85.92
-2.82% kpi/utils/sluggify.py
1
75.0
-25.0% kobo/apps/audit_log/mixins.py
1
90.0
-10.0% kobo/apps/audit_log/utils.py
1
83.67
-2.04% kobo/apps/openrosa/apps/logger/exceptions.py
1
40.85
-1.41% kobo/apps/organizations/admin/organization.py
1
92.31
-7.69% kobo/apps/user_reports/utils/migrations.py
1
75.0
-25.0% kpi/fields/read_only.py
1
80.95
-4.76% kpi/fields/writable_json.py
1
94.15
-0.28% kpi/mixins/object_permission.py
1
66.67
-8.33% kpi/mixins/validation_password_permission.py
1
91.3
-4.35% kpi/serializers/v2/asset_version.py
1
75.0
-4.17% kpi/urls/__init__.py
1
85.71
-1.43% kpi/utils/cache.py
1
75.0
-25.0% kpi/utils/gravatar_url.py
1
96.67
-3.33% kpi/utils/project_views.py
1
94.12
-5.88% kpi/utils/strings.py
1
61.9
-2.38% kpi/utils/urls.py
1
55.56
-2.22% kpi/views/current_user.py
1
59.32
-6.72% kpi/views/v2/export_task.py
Jobs
ID Job ID Ran Files Coverage
1 25747273888.1 12 May 2026 04:24PM UTC 908
54.29
2 25747273888.2 12 May 2026 04:26PM UTC 908
52.93
3 25747273888.3 12 May 2026 04:26PM UTC 910
54.27
4 25747273888.4 12 May 2026 04:28PM UTC 908
60.2
5 25747273888.5 12 May 2026 04:28PM UTC 910
65.97
6 25747273888.6 12 May 2026 04:28PM UTC 912
68.2
7 25747273888.7 12 May 2026 04:28PM UTC 910
53.88
8 25747273888.8 12 May 2026 04:44PM UTC 910
61.33
9 25747273888.9 12 May 2026 04:45PM UTC 910
55.54
10 25747273888.10 12 May 2026 04:46PM UTC 908
52.66
Source Files on build 25747273888
  • Tree
  • List 912
  • Changed 5
  • Source Changed 0
  • Coverage Changed 5
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • e5dc6ae3 on github
  • Prev Build on release/2.026.13 (#25515796297)
  • Next Build on release/2.026.13 (#25751890029)
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