Hello everyone,
We’re pleased to announce the 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
- kf.kobotoolbox.org at approximately 19:00 UTC on Wednesday, 20 September 2023, and
- eu.kobotoolbox.org (formerly kobo.humanitarianresponse.info) at approximately 20:20 UTC on Thursday, 21 September 2023.
New languages
KoboToolbox now has user interface support for 8 new languages:
- Bengali
- Burmese/Myanmar
- Indonesian
- Lingala
- Nepali
- Nyanja/Chewa
- Thai
- Vietnamese
Support was added in kpi#4610, kpi#4459, kpi#4486, kpi#4444, and kpi#4649. 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:
- Add a footer message (e.g. a disclaimer) to all forms in Enketo: kpi#4587, kpi#4484, kobocat#882.
- Configure password complexity requirements for users: kpi#4475, kpi#4573, kpi#4574, kpi#4563, kpi#4558, kpi#4540, kpi#4482, kpi#4533, kobocat#887, kpi#4536.
- Customize the metadata fields for users and projects by changing and translating the labels, controlling which fields are required, and hiding unneeded fields: kpi#4596, kpi#4586, kpi#4591, kpi#4581, kpi#4497, kpi#4527, kpi#4576, kpi#4569.
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 editorValidation 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.xFixes 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 buttonWith 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 ./manage.py 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.See https://github.com/django/django/blob/3.2/django/core/files/storage.py#L362-L367 |
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 packageRemoves 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. |