github kobotoolbox/kpi 2.026.13

5 hours ago

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 the Organization admin 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)
  • assetQuickActions: migrate out of allAssets (#6814)
  • surveyCompanionStore: tsify (#6854)
  • remove to_python_object wrapper, constance 4 returns Python objects (0db4fb9)
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
    AssetVersion was 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-constance from 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 the 0003_drop_pickle migration
    on first deploy.

    👷 Description for instance maintainers

    Django 5.2 (LTS) replaces 4.2 (EOL). Run ./scripts/migrate.sh on first
    deploy — the constance.0003_drop_pickle migration 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

Don't miss a new kpi release

NewReleases is sending notifications on new releases.