What's changed
Features (3)
-
dataTable: display verification column (#6822)
Display verification value in Data Table and Single Submission Modal.
-
metadata: add custom django admin form for ExtraProjectMetadata (#6801)
Adds an interface in the Django admin for superusers to easily define
and manage custom project metadata fields. -
stripe: automated Stripe manual invoicing setup from Django admin (#7053)
This PR automates the initial setup for manual invoicing by allowing the
product team to create a Stripe customer and a baseline "community plan"
subscription directly from theOrganizationadmin panel.Currently, setting up manual invoicing requires the product team to
manually create customers and subscriptions in the Stripe dashboard,
which is time-consuming and prone to data entry errors.
Bug Fixes (13)
-
admin: render constance list/dict fields as valid JSON in admin (b1f4781)
-
constance: clear stale Redis cache and fix provision_server JSON parsing (e58e946)
-
constance:
JsonSchemaFormField.clean()must return parsed object (#6968)Saving certain admin settings (MFA help text, password guidance,
user/project metadata fields) via the Django admin could cause crashes
for end users, such as a broken MFA login flow or broken user profile
pages. -
constance: repair migration 0020 for constance 4 envelope format (#6973)
Follow-up to #6968. Migration
0020_fix_constance_json_field_corruption
was silently skipping all records modified by Constance own migration
and not repairing corrupted constance values, causing a 500 error on
/environment/. -
debug-toolbar: handle import error for debug toolbar in development settings (#6970)
-
docker: compile translations at build time (#6852)
-
exports: prevent simultaneous identical exports (#7028)
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.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. -
languages: allow imports of large language files (#6849)
Fix an error when importing a large language file into Django admin.
-
projects: allow admin to delete a single project (#6842)
Fixes an issue where the admin of an organization cannot delete one
single project (deleting multiple was still possible). -
qual: allow empty answers to single-select questions (#6850)
Treat no response selected as a legitimate LLM answer to a select one
question.Previously, if the LLM did not return a selection for a select one
question, it was treated as an error. This PR treats those responses as
legitimate. -
superuserStats: fix mixed-type Concat error in reports , (#7060)
Admin report generation was failing with a Django ORM error, preventing
CSV exports from being downloaded. -
migration conflict (9864b38)
-
avoid 500 error when debugtool bar is not installed yet (3672515)
Continous Integration (1)
- releases: avoid race conditions (#6841)
Build & Dependencies (1)
- locale: delete obsolete submodule logic (#6845)
Testing (1)
- provision_server: update assertions to expect parsed JSON objects (e82e9a7)
Refactor (3)
Styling (1)
- apply linter and formatter (#6819)
Internal only — no user-facing changes.
Applies linter and formatter fixes accumulated from the Django 4.2→5.2
and constance 3→4 upgrade commits. No logic changes.
Chores (14)
-
deps: remove django-reversion package (#6820)
django-reversion was still listed as a dependency despite no longer
being actively used, leaving orphaned tables and dead code in the
project.django-reversion was removed from active use some time ago (the FK from
AssetVersionwas dropped in migration 0069), but the Python package,
app registration, and a long-running migration referencing it were never
cleaned up. This removes everything while keeping the underlying
database tables intact for now, then permanently drops them via
dedicated migrations. -
deps: upgrade Python to 3.12 (#6793)
Upgrades the backend runtime to Python 3.12 .
-
deps: upgrade Django 5.1 → 5.2 (038ae5d)
-
deps: unpin and bump pip dependencies for Django 5.2 (#6917)
-
locale: move submodule into parent module (#6840)
-
upgrade Django from 4.2 to 5.0 (12724fd)
-
upgrade Django from 5.0 to 5.1 (d465915)
-
upgrade Django from 5.1 to 5.2 and constance from 3.x to 4.x (c5b0f68)
-
remove custom constance DatabaseBackend fixed upstream in v4 (dc23024)
-
upgrade django-redis to 6.0.0 (a8487fb)
-
bump django-digest and python-digest to latest commits (8887aad)
-
update OpenRosa OpenAPI schema (022b188)
-
upgrade Django to 5.2 (#6818)
Internal upgrade — no user-facing changes.
Django 4.2 reached end-of-life. This upgrades the stack from Django 4.2
to 5.2 (LTS) in three steps (4.2→5.0→5.1→5.2), upgrades
django-constancefrom 3.x to 4.x.The constance 4 upgrade is the most impactful change: it replaces the
pickle-based DB backend with a JSON codec. Any existing pickle-stored
values are automatically converted by the0003_drop_picklemigration
on first deploy.👷 Description for instance maintainers
Django 5.2 (LTS) replaces 4.2 (EOL). Run
./scripts/migrate.shon first
deploy — theconstance.0003_drop_picklemigration will convert any
remaining pickle values in the DB to JSON automatically. -
bump formpack version (#7018)
Bump formpack version to support Python 3.12
Full Changelog: https://github.com/kobotoolbox/kpi/compare/2.026.12i..2.026.13