Release Notes - version 2.023.37

Hello everyone,

We’re pleased to announce the upcoming release of the following:

  • KPI version 2.023.37
  • KoboCAT version 2.023.37
  • Pyxform version 1.9.0, unchanged from the previous release
  • Enketo Express version 6.0.0 with additions, unchanged from the previous release.

These were deployed to

  • at approximately 19:00 UTC on Wednesday, 20 September 2023, and
  • (formerly at approximately 20:20 UTC on Thursday, 21 September 2023.

New languages

KoboToolbox now has user interface support for 7 new languages:

  • Bengali
  • Burmese/Myanmar
  • Indonesian
  • Lingala
  • Nepali
  • Nyanja/Chewa
  • Thai
  • Vietnamese

Support was added in kpi#4610, kpi#4459, kpi#4486, and kpi#4444. Additionally, kpi#4624 fixes an issue where the user interface language would incorrectly fall back to English.

Improved projects list

The list of projects has been totally revamped for better filtering and ordering, customization of displayed columns, and the ability to perform bulk actions that affect multiple projects at once: kpi#4240, kpi#4404, kpi#4219, kpi#4580, kpi#4529, kpi#4502, kpi#4408, kpi#4402, kpi#4409, kpi#4383, kpi#4382, kpi#4386, kpi#4310.

Notifications when exceeding limits

We’ve taken the guesswork out of monitoring your KoboToolbox usage and will now alert you when you’ve exceeded any of your account limits: kpi#4571, kobocat#889.

New features for self hosters

If you administer your own instance of KoboToolbox, it’s now possible for you to:

Removal of the legacy UI

On 14 June 2021, we announced:

  • that the legacy (KoboCAT) user interface would no longer be supported,
  • that the legacy user interface would be removed after “a few more months”, and
  • that form uploads were only supported through the regular interface from that point forward.

Now that more than two years have passed, this release removes the legacy user interface entirely and removes various obsolete endpoints related to it. These changes were implemented in kpi#4516, kobocat#892, and kobocat#885.

If you are a developer, please note that this release also disables uploading XLSForms directly to the legacy v1 API, as projects created this way would be inaccessible from any user interface. Please update your integrations to use the v2 API. This change only affects uploading XLSForms, not retrieving data, which we still support with the v1 API—although you should likewise future-proof your code by migrating to the v2 API as soon as possible.

Other fixes and improvements

PR Description
kpi#4522, kpi#4518 Improve redeployment logic
Always update “Date deployed” when “REDEPLOY” is clicked, even if the form version is the same (i.e. the content has not been changed). Other things about the project may have changed, e.g. form media files.
kpi#4559 Hide meta/rootUuid from table view
This field is not ready for general use yet, but curious people have discovered it.

When (if) it comes back, it should be positioned at the end of the table.
kpi#4472 Clarify the error message when REST Services attempts to send a submission that has been deleted.
kpi#4501 Add usage section to user settings menu
This allows users to view their account submission, storage, transcription minutes, and translation minutes usage.
kpi#4286 Project Summary Details improvement
Merges together two boxes of information on project from Project Summary route. Adds few missing pieces of information to it too.
formpack#315 Handle Excel limits: URLs, cell content, and worksheet boundaries
formpack#316 Speed up the import of XLSForms, especially when many blank columns are present
kpi#4647 Fix CSP problem with language picker on login/signup page

Of interest to self hosters

PR Description
kpi#4613 Fix inability to edit in-app messages in Django Admin
kpi#4582 Update CSP settings for Google Analytics 4
kpi#4549 Allow default MFA help text to be translated along with the rest of the application’s translatable strings
kpi#4460 Add Redis status checks to service health endpoint
Add cache, broker, and session Redis checks on service_health endpoint.
kpi#4508 Allow setting SSO config fully in env vars and support multiple public OIDC providers
Adds front-end support for multiple OIDC SSO providers.
kpi#4435 Add filtering by date joined on the user detail report for superusers
kpi#4441 Fix spacing for customizable email template
Fix the registration email template spacing
kpi#4637 Allow gif and webp extensions to be uploaded in markdown editor
Validation check is based on the content type. Allowed content types are:

- image/jpeg
- image/png
- image/svg+xml
- image/gif
- image/webp
kobocat#895 Retain counts for deleted forms in DailyXFormSubmissionCounter

Of interest to developers

PR Description
kpi#4628 Align language selector dropdown with form beneath it
kpi#4606 Use fuzzy integer for tests which assert of number of queries
Make the number of queries assertions a little bit less strict when running unit tests
kpi#4609 Make language selector available in all templates
kpi#4579 Update TextBox component
Update looks of TextBox component and cleanup its usage.
kpi#4601 Update copy/styling for usage limit banners and modals
Changed the text and styling of usage limit notifications for public servers.
kpi#4617 Add notes to PR template
kpi#4603 Add support for old KoBoCAT domain name
kpi#4602 Update formpack requirement
kpi#4578 Usage limits setting
kpi#4593 Fix incorrect labels in static project metadata list
kpi#4590 Code refactoring to get translated utilities at the same place
kpi#4483 Use only one markdown dependency for markdown fields in Django Admin
Replace django-markitup with markdownx everywhere.
kpi#4575 Support alias t() for gettext and gettext_lazy
Extract strings used with t() (and nt() for plural) alias(es) instead of expected Django alias: _()
kpi#4568 Remove dead KOBOFORM_INTERNAL_URL setting
kpi#4570 Mass user email script using Amazon SES
Added a script to send broadcast emails to users using Amazon SES.
kpi#4541 Use python3 for npm copy-fonts command
kpi#4535 Typescriptize MainHeader component
Internal code improvements.
kpi#4548 Resolve conflicts and api changes from react-router-6-13 branch
kpi#4561 Usage limits 2fa fixes
Small changes to how MFA configuration is sent to the browser.
kpi#4560 Support Django Constance settings with translatable strings
Add a wrapper class to be used python objects such as dict or list with translatable strings
kpi#4550 Clean up the environment (API endpoint)
kpi#4552 Remove unused variable report__base
kpi#4505 Upgrade React Router to 6.14.2 and use upstream usePrompt
kpi#4547 Bump pip-tools version to 7.x.x
Fixes broken GitHub CI Python unit tests because of conflicting version of pip and pip-tools.
kpi#4538 Improve fetch api handler to reject non-ok responses
Make Update Password Form use more detailed error messages.
kpi#4506 Updating usage endpoints for organizations and subscriptions
Updated api/v2/service_usage to account for organizations and subscriptions.
kpi#4531 Rename the default plan
kpi#4517 Remove build frontend code in pytest CI step
kpi#4512 Split out PasswordUpdateComponent
Code cleanup.
kpi#4450 split top tabs from formViewTabs file and remove x button
With introduction of Project Views, the “x” button on a single project route stopped making sense. It was removed to avoid confusion.
kpi#4526 Redo package-lock
Recreate frontend package-lock file from an earlier version to fix build problems.
kpi#4528 Add private_data field to ExtraUserDetail
Added ‘private_data’ field to the extra user detail model.
kpi#4523 Avoid CharField for dates and use ReadOnlyField instead
kpi#4521 Clarify where (re)deployment writes to database
kpi#4503 Upgrade to Storybook 7
kpi#4520 Get Storybook compatible with TypeScript 5.x
Fixed a compatibility issue between Storybook and TypeScript 5.x.
kpi#4509 Organizations API
Allow creation/updating/deleting of organizations via API.
kpi#4387 Toolchain: Warn about undefined CSS Module classes in TypeScript
Show a warning in your code editor if you use an undefined CSS module class in a TypeScript file.
kpi#4366 Print a warning when used with Node versions other than v16.15.0
Warn in development when running the JavaScript frontend with unsupported Node or NPM version.
kpi#4474 Cleanup password related components
Internal code improvements.
kpi#4457 Drop underscore
Inner cleanup. Removes unnecessary underscore dependency in favor of granular lodash packages.
kpi#4326 Run prettier on projects code
kpi#4634 Fixes annual price showing as a large monthly amount
kobocat#894 Prevent SKIP_HEAVY_MIGRATIONS warning unless running the relevant migrations
Refactors main.0011_drop_old_kpi_tables to not print a heavy migration warning every time Django loads the migration file (e.g. when running ./ migrate for an unrelated app).
kobocat#893 Update populate_xform_submission migration dependencies
Applying logger.0028 before main.0012 (from #885) raises an error (column main_userprofile.validated_password does not exist). This PR updates the dependency list for logger.0028 accordingly.
kobocat#891 Purge non-dict UserProfile.metadata when calculating submission counters
kobocat#886 Code refactoring: Use default_storage instead of get_storage_class()()
Django provides a default_storage variable which exactly what get_storage_class()() is doing.
kobocat#890 Revise line endings and comments in #889
kobocat#888 Bump pip-tools version to 7.x.x
Fixes broken GitHub CI Python unit tests because of conflicting version of pip and pip-tools.
kobocat#869 Improve XML parsing with defusedxml
Switch to defusedxml instead of the standard xml library for parsing
formpack#310 Clean up unused and badly formatted code
kpi#4635 Account for null XForm instances in service_usage endpoint
Fix /api/v2/service_usage/ calculating NLP and submission counts incorrectly.
kpi#4636 Use NLPUsageCounter date field to fix User Statistics report
Fix the superusers User statistics report
kpi#4644 Replace curl to bash with Nodesource Debian package
Removes a 60-second delay caused by Nodesource’s deprecation of their curl to bash installation method.
kpi#4640 Stripe checkout now collects billing address info.