Releases: learningequality/kolibri
v0.19.2
What's Changed
This patch release includes foundational work for the upcoming Courses feature, improvements to sync reliability and content handling, continued Python 2.7 cleanup, and various bug fixes across the platform. It also migrates the JavaScript package manager from yarn to pnpm and adds several new developer tooling improvements.
Added
Courses Feature (Foundational)
Initial implementation of the Courses feature, including backend models, API endpoints, frontend views, and assignment workflows.
List of supporting PRs
- Courses frontend setup by @AlexVelezLl in #14077
- Add sync operations and filter utilities for classroom partitioning by @bjester in #14070
- Create courses models and viewset by @AlexVelezLl in #14091
- Add select courses and recipients subpages by @AlexVelezLl in #14103
- Add Course Session Context to Progress Tracking by @LianaHarris360 in #14116
- Learn Course Assignments API Endpoints by @LianaHarris360 in #14113
- Add UnitTestAssignment model for managing pre/post tests in course units by @AllanOXDi in #14115
- Implement Course list data loading and display by @AllanOXDi in #14114
- ResourceLayout component architecture for course content display by @rtibbles in #14109
- Add API endpoints for activating/closing quizzes & returning active quiz by @AllanOXDi in #14121
- Course Preview by @nucleogenesis in #14117
- Add course unit view by @AlexVelezLl in #14128
- Course unit view 2 by @AlexVelezLl in #14145
- Course welcome view by @LianaHarris360 in #14146
- Course cards homepage by @marcellamaki in #14122
- Add confirmation modal to prevent accidental closure of Course Assignment Side Panel by @LianaHarris360 in #14150
- Pre/Post-Tests Activation UI by @nucleogenesis in #14147
- Implement new deserialization logic according to sync_filter by @ozer550 in #14148
- Fix The 'Recipients' drop-down to show groups list by @AllanOXDi in #14156
- Fixes TypeError on clicking 'Select recipients' from the course details page by @AllanOXDi in #14160
Developer Tooling
- Migrate from yarn to pnpm by @rtibbles in #14086
- Add ESLint rule to prevent RTL-breaking inline styles by @rtibbles in #14093
- Add linting to prevent non-scoped lodash/dateFn imports by @rtibbles in #14125
- Add browser smoke test to PR build workflow by @rtibbles in #14153
- Add AI agent documentation and multi-agent isolation support by @rtibbles in #14144
- Add documentation indicating that APIs are internal by @rtibbles in #14090
Changed
Performance & Build
List of supporting PRs
Tech debt / refactors
List of supporting PRs
- Replace CSS Variables in favor of theme variable for CSS styling by @AllanOXDi in #14089
- Restore frontend linting and fix issues that happened in the interim by @rtibbles in #14126
- Removes residue style overrides prop code by @akolson in #14112
- Clean up localeCompare usage for proper internationalization (fixes #3888) by @rtibbles in #14087
- Slim down agents.md with progressive disclosure and moving more into Claude.md by @rtibbles in #14164
- Update ignores for worktrees and JetBrains features by @bjester in #14162
Python 2.7 Cleanup
List of supporting PRs
- Remove unnecessary UTF-8 coding declarations from Python files by @manocormen in #14215
- Remove explicit object base class from Python classes by @manocormen in #14224
- Clean up outdated Python 2.7 comments and unicode string literals by @curiouscoder-cmd in #14227
- Remove Python 2 compatibility shims by @sharma-anushka in #14226
Fixed
List of supporting PRs
- Fix missing dep in Coach by @nucleogenesis in #14098
- Better handle unclean server shutdown by @rtibbles in #14123
- Prevent traversal of symlinks in node_modules during egg info generation by @rtibbles in #14127
- Reset selection after applying filter by @AllanOXDi in #13880
- Retry peeruserimport task on Database or connection errors by @AlexVelezLl in #13821
- Better missing resources handling by @akolson in #14201
- Unprovisioned URL Redirect (+ remove dead code) by @nucleogenesis in #14200
- Remove no longer needed overflow: unset by @AlexVelezLl in #14202
- Prevent double scrollbar in side panel modal by @AllanOXDi in #14228
- Fix flaky Python tests: ordering, network mocking, and missing request mocks by @rtibblesbot in #14177
- Fix invocations of i18n commands and ignores by @rtibbles in #14247
- Fixes notification for no resources on the device being shown when no exercises exist by @akolson in #14288
- Migrate from tibdex/github-app-token to actions/create-github-app-token by @rtibblesbot in #14206
- Install kolibri in i18n-upload workflow by @rtibbles in #14239
- [Bugfix] Change user by @nucleogenesis in #14320
- Test and fix regression that prevented copying of default database. by @rtibbles in #14328
Internationalization
List of supporting PRs
- Update translations from Crowdin for release-v0.19.x by @learning-equality-bot[bot] in #14249
New Contributors
- @rtibblesbot made their first contribution in #14177
- @manocormen made their first contribution in #14215
Full Changelog:
v0.19.1...v0.19.2
v0.19.2-rc1
Since rc0
- [Bugfix] Change user by @nucleogenesis in #14320
- Test and fix regression that prevented copying of default database. by @rtibbles in #14328
What's Changed
This patch release includes foundational work for the upcoming Courses feature, improvements to sync reliability and content handling, continued Python 2.7 cleanup, and various bug fixes across the platform. It also migrates the JavaScript package manager from yarn to pnpm and adds several new developer tooling improvements.
Added
Courses Feature (Foundational)
Initial implementation of the Courses feature, including backend models, API endpoints, frontend views, and assignment workflows.
List of supporting PRs
- Courses frontend setup by @AlexVelezLl in #14077
- Add sync operations and filter utilities for classroom partitioning by @bjester in #14070
- Create courses models and viewset by @AlexVelezLl in #14091
- Add select courses and recipients subpages by @AlexVelezLl in #14103
- Add Course Session Context to Progress Tracking by @LianaHarris360 in #14116
- Learn Course Assignments API Endpoints by @LianaHarris360 in #14113
- Add UnitTestAssignment model for managing pre/post tests in course units by @AllanOXDi in #14115
- Implement Course list data loading and display by @AllanOXDi in #14114
- ResourceLayout component architecture for course content display by @rtibbles in #14109
- Add API endpoints for activating/closing quizzes & returning active quiz by @AllanOXDi in #14121
- Course Preview by @nucleogenesis in #14117
- Add course unit view by @AlexVelezLl in #14128
- Course unit view 2 by @AlexVelezLl in #14145
- Course welcome view by @LianaHarris360 in #14146
- Course cards homepage by @marcellamaki in #14122
- Add confirmation modal to prevent accidental closure of Course Assignment Side Panel by @LianaHarris360 in #14150
- Pre/Post-Tests Activation UI by @nucleogenesis in #14147
- Implement new deserialization logic according to sync_filter by @ozer550 in #14148
- Fix The 'Recipients' drop-down to show groups list by @AllanOXDi in #14156
- Fixes TypeError on clicking 'Select recipients' from the course details page by @AllanOXDi in #14160
Developer Tooling
- Migrate from yarn to pnpm by @rtibbles in #14086
- Add ESLint rule to prevent RTL-breaking inline styles by @rtibbles in #14093
- Add linting to prevent non-scoped lodash/dateFn imports by @rtibbles in #14125
- Add browser smoke test to PR build workflow by @rtibbles in #14153
- Add AI agent documentation and multi-agent isolation support by @rtibbles in #14144
- Add documentation indicating that APIs are internal by @rtibbles in #14090
Changed
Performance & Build
List of supporting PRs
Tech debt / refactors
List of supporting PRs
- Replace CSS Variables in favor of theme variable for CSS styling by @AllanOXDi in #14089
- Restore frontend linting and fix issues that happened in the interim by @rtibbles in #14126
- Removes residue style overrides prop code by @akolson in #14112
- Clean up localeCompare usage for proper internationalization (fixes #3888) by @rtibbles in #14087
- Slim down agents.md with progressive disclosure and moving more into Claude.md by @rtibbles in #14164
- Update ignores for worktrees and JetBrains features by @bjester in #14162
Python 2.7 Cleanup
List of supporting PRs
- Remove unnecessary UTF-8 coding declarations from Python files by @manocormen in #14215
- Remove explicit object base class from Python classes by @manocormen in #14224
- Clean up outdated Python 2.7 comments and unicode string literals by @curiouscoder-cmd in #14227
- Remove Python 2 compatibility shims by @sharma-anushka in #14226
Fixed
List of supporting PRs
- Fix missing dep in Coach by @nucleogenesis in #14098
- Better handle unclean server shutdown by @rtibbles in #14123
- Prevent traversal of symlinks in node_modules during egg info generation by @rtibbles in #14127
- Reset selection after applying filter by @AllanOXDi in #13880
- Retry peeruserimport task on Database or connection errors by @AlexVelezLl in #13821
- Better missing resources handling by @akolson in #14201
- Unprovisioned URL Redirect (+ remove dead code) by @nucleogenesis in #14200
- Remove no longer needed overflow: unset by @AlexVelezLl in #14202
- Prevent double scrollbar in side panel modal by @AllanOXDi in #14228
- Fix flaky Python tests: ordering, network mocking, and missing request mocks by @rtibblesbot in #14177
- Fix invocations of i18n commands and ignores by @rtibbles in #14247
- Fixes notification for no resources on the device being shown when no exercises exist by @akolson in #14288
- Migrate from tibdex/github-app-token to actions/create-github-app-token by @rtibblesbot in #14206
- Install kolibri in i18n-upload workflow by @rtibbles in #14239
Internationalization
List of supporting PRs
- Update translations from Crowdin for release-v0.19.x by @learning-equality-bot[bot] in #14249
New Contributors
- @rtibblesbot made their first contribution in #14177
- @manocormen made their first contribution in #14215
Full Changelog:
v0.19.1...v0.19.2-rc0
v0.19.2-rc0
What's Changed
This patch release includes foundational work for the upcoming Courses feature, improvements to sync reliability and content handling, continued Python 2.7 cleanup, and various bug fixes across the platform. It also migrates the JavaScript package manager from yarn to pnpm and adds several new developer tooling improvements.
Added
Courses Feature (Foundational)
Initial implementation of the Courses feature, including backend models, API endpoints, frontend views, and assignment workflows.
List of supporting PRs
- Courses frontend setup by @AlexVelezLl in #14077
- Add sync operations and filter utilities for classroom partitioning by @bjester in #14070
- Create courses models and viewset by @AlexVelezLl in #14091
- Add select courses and recipients subpages by @AlexVelezLl in #14103
- Add Course Session Context to Progress Tracking by @LianaHarris360 in #14116
- Learn Course Assignments API Endpoints by @LianaHarris360 in #14113
- Add UnitTestAssignment model for managing pre/post tests in course units by @AllanOXDi in #14115
- Implement Course list data loading and display by @AllanOXDi in #14114
- ResourceLayout component architecture for course content display by @rtibbles in #14109
- Add API endpoints for activating/closing quizzes & returning active quiz by @AllanOXDi in #14121
- Course Preview by @nucleogenesis in #14117
- Add course unit view by @AlexVelezLl in #14128
- Course unit view 2 by @AlexVelezLl in #14145
- Course welcome view by @LianaHarris360 in #14146
- Course cards homepage by @marcellamaki in #14122
- Add confirmation modal to prevent accidental closure of Course Assignment Side Panel by @LianaHarris360 in #14150
- Pre/Post-Tests Activation UI by @nucleogenesis in #14147
- Implement new deserialization logic according to sync_filter by @ozer550 in #14148
- Fix The 'Recipients' drop-down to show groups list by @AllanOXDi in #14156
- Fixes TypeError on clicking 'Select recipients' from the course details page by @AllanOXDi in #14160
Developer Tooling
- Migrate from yarn to pnpm by @rtibbles in #14086
- Add ESLint rule to prevent RTL-breaking inline styles by @rtibbles in #14093
- Add linting to prevent non-scoped lodash/dateFn imports by @rtibbles in #14125
- Add browser smoke test to PR build workflow by @rtibbles in #14153
- Add AI agent documentation and multi-agent isolation support by @rtibbles in #14144
- Add documentation indicating that APIs are internal by @rtibbles in #14090
Changed
Performance & Build
List of supporting PRs
Tech debt / refactors
List of supporting PRs
- Replace CSS Variables in favor of theme variable for CSS styling by @AllanOXDi in #14089
- Restore frontend linting and fix issues that happened in the interim by @rtibbles in #14126
- Removes residue style overrides prop code by @akolson in #14112
- Clean up localeCompare usage for proper internationalization (fixes #3888) by @rtibbles in #14087
- Slim down agents.md with progressive disclosure and moving more into Claude.md by @rtibbles in #14164
- Update ignores for worktrees and JetBrains features by @bjester in #14162
Python 2.7 Cleanup
List of supporting PRs
- Remove unnecessary UTF-8 coding declarations from Python files by @manocormen in #14215
- Remove explicit object base class from Python classes by @manocormen in #14224
- Clean up outdated Python 2.7 comments and unicode string literals by @curiouscoder-cmd in #14227
- Remove Python 2 compatibility shims by @sharma-anushka in #14226
Fixed
List of supporting PRs
- Fix missing dep in Coach by @nucleogenesis in #14098
- Better handle unclean server shutdown by @rtibbles in #14123
- Prevent traversal of symlinks in node_modules during egg info generation by @rtibbles in #14127
- Reset selection after applying filter by @AllanOXDi in #13880
- Retry peeruserimport task on Database or connection errors by @AlexVelezLl in #13821
- Better missing resources handling by @akolson in #14201
- Unprovisioned URL Redirect (+ remove dead code) by @nucleogenesis in #14200
- Remove no longer needed overflow: unset by @AlexVelezLl in #14202
- Prevent double scrollbar in side panel modal by @AllanOXDi in #14228
- Fix flaky Python tests: ordering, network mocking, and missing request mocks by @rtibblesbot in #14177
- Fix invocations of i18n commands and ignores by @rtibbles in #14247
- Fixes notification for no resources on the device being shown when no exercises exist by @akolson in #14288
- Migrate from tibdex/github-app-token to actions/create-github-app-token by @rtibblesbot in #14206
- Install kolibri in i18n-upload workflow by @rtibbles in #14239
Internationalization
List of supporting PRs
- Update translations from Crowdin for release-v0.19.x by @learning-equality-bot[bot] in #14249
New Contributors
- @rtibblesbot made their first contribution in #14177
- @manocormen made their first contribution in #14215
Full Changelog:
v0.19.1...v0.19.2-rc0
v0.19.2-beta0
QA Guidance — v0.19.2-beta0
This PR is included in the "bug fixes" section below, but note that - "#14201 Better missing resources handling in quiz editing" was not QA'd so should be given particular attention.
0. Refactored Learner Home Page Cards
This was QA'd recently so no need to retest it - but please note that bugs found in previous QA are not addressed here in case you come across them again.
1. Sync & Classroom Partitioning
What to test: Sync between devices — especially single-user devices (SoUD) syncing with full-facility servers. Import and export of facility data. Any workflows where user data (like created_by or assigned_by fields) references users that may not exist on the local device.
What to look for: Sync failures or hangs, data missing after sync, user references showing as blank or causing errors, unexpected data deletion on SoUD devices after syncing with a full-facility server.
2. Font Hashing & CSS/Browser Compatibility
What to test: Verify that all fonts load correctly across different browsers — especially older browsers. Check that text renders properly in all supported languages, including RTL scripts. Test content rendering in kolibri-zip (H5P, HTML5 apps) — particularly content that uses CSS @import statements. Verify SafeHTML content (tables, images) renders with correct theme colors.
What to look for: Missing or broken fonts, text appearing in a fallback/system font, flash of unstyled text, stale cached fonts not updating after upgrade, CSS files failing to load (404s), broken styling inside zipped HTML5 content, SafeHTML tables or images losing their themed colors.
3. Internationalization — Sorting
What to test: Anywhere lists of items are sorted alphabetically — user lists in Facility management, group lists in Coach, side navigation entries, learner/group selectors when assigning content or quizzes. Test with non-English languages, especially languages with accented characters or non-Latin scripts.
What to look for: Items appearing in the wrong sort order, items not resorting when switching languages, JavaScript errors when sorting empty or undefined lists.
4. Bug Fixes
What to test:
- Facility management: Select some users, then apply a filter — verify the selection is cleared and doesn't carry over.
- Unprovisioned device: Navigate directly to any Kolibri URL (e.g.
/learn,/facility) on a device that hasn't been set up — verify you're redirected to the setup wizard. - Quiz editing: Create or edit a quiz that references content that has since been deleted or is unavailable — verify the UI handles it gracefully.
- Exam page: Open a quiz as a learner and interact with the KSelect dropdown — verify no scrolling issues or clipped dropdowns.
What to look for: Stale user selections persisting after filtering, being able to access plugin pages on an unprovisioned device, crashes or blank screens when quiz content is missing, dropdown menus being clipped or causing page scroll issues on the exam page.
5. Task System / Import Retry
What to test: User import during the setup wizard — especially importing users from another Kolibri device or a CSV file. Try importing large numbers of users. Test what happens when the source device is unreachable mid-import or when the connection is flaky. Test navigating back during an import. Also test general task behavior (channel imports, exports) since the underlying job storage was migrated from SQLAlchemy to Django.
What to look for: Import tasks failing and not retrying, imports silently losing users, the setup wizard allowing you to navigate back during an active import, duplicate users appearing after a retry, tasks getting stuck in a pending/running state, any errors referencing the jobs database or missing tables.
What's Changed
- Courses frontend setup by @AlexVelezLl in #14077
- Add sync operations and filter utilities for classroom partitioning by @bjester in #14070
- Create courses models and viewset by @AlexVelezLl in #14091
- Migrate from yarn to pnpm by @rtibbles in #14086
- Fix missing dep in Coach by @nucleogenesis in #14098
- Replace CSS Variables in favor of theme variable for css styling by @AllanOXDi in #14089
- Add select courses and recipients subpages by @AlexVelezLl in #14103
- Add Course Session Context to Progress Tracking by @LianaHarris360 in #14116
- Learn Course Assignments API Endpoints by @LianaHarris360 in #14113
- Add UnitTestAssignment model for managing pre/post tests in course units by @AllanOXDi in #14115
- Implement Course list data loading and display by @AllanOXDi in #14114
- Restore frontend linting and fix issues that happened in the interim by @rtibbles in #14126
- ResourceLayout component architecture for course content display by @rtibbles in #14109
- Prevent traversal of symlinks in node_modules during egg info generation. by @rtibbles in #14127
- Add API endpoints for activating/closing quizzes & returning active quiz by @AllanOXDi in #14121
- Better handle unclean server shutdown by @rtibbles in #14123
- Add linting to prevent non-scoped lodash/dateFn imports. by @rtibbles in #14125
- Course Preview by @nucleogenesis in #14117
- Removes residue style overrides prop code by @akolson in #14112
- Bump version from 0.19.1 to 0.19.2 by @rtibbles in #14136
- Add course unit view by @AlexVelezLl in #14128
- Update kolibri-zip with support for css import statements, fix browser compatibility by @rtibbles in #14085
- Add AI agent documentation and multi-agent isolation support by @rtibbles in #14144
- Fix The 'Recipients' drop-down to show groups list by @AllanOXDi in #14156
- Update ignores for worktrees and JetBrains features by @bjester in #14162
- Fixes TypeError on clicking 'Select recipients' from the course details page. by @AllanOXDi in #14160
- Fix flaky Python tests: ordering, network mocking, and missing request mocks by @rtibblesbot in #14177
- Slim down agents.md with progressive disclosure and moving more into Claude.md by @rtibbles in #14164
- Add confirmation modal to prevent accidental closure of Course Assignment Side Panel by @LianaHarris360 in #14150
- Course welcome view by @LianaHarris360 in #14146
- Migrate from tibdex/github-app-token to actions/create-github-app-token by @rtibblesbot in #14206
- Implement new deseralization logic according to sync_filter by @ozer550 in #14148
- Course unit view 2 by @AlexVelezLl in #14145
- Remove unnecessary UTF-8 coding declarations from Python files by @manocormen in #14215
- Remove explicit object base class from Python classes by @manocormen in #14224
- Add documentation indicating that APIs are internal by @rtibbles in #14090
- Clean up outdated Python 2.7 comments and unicode string literals by @curiouscoder-cmd in #14227
- Remove no longer needed overflow: unset by @AlexVelezLl in #14202
- Add hashing to font CSS and WOFF generation by @rtibbles in #14088
- Remove Python 2 compatibility shims by @sharma-anushka in #14226
- Clean up localeCompare usage for proper internationalization (fixes #3888) by @rtibbles in #14087
- Reset selection after applying filter by @AllanOXDi in #13880
- Retry peeruserimport task on Database or connection errors by @AlexVelezLl in #13821
- Better missing resources handling by @akolson in #14201
- Unprovisioned URL Redirect (+ remove dead code) by @nucleogenesis in #14200
- Install kolibri in i18n-upload workflow by @rtibbles in https://github.com/learningequality/koli...
0.19.2-alpha0
Overview
This is an UNSTABLE pre-release for preliminary testing of initial workflows for a feature-flagged pilot of Courses in Kolibri. Core aspects of the Course experience have not yet been implemented. Some data is also not yet present and displayed. Please see Product Issue: Courses are discoverable within downloaded channels, and coaches can preview them and assign them to learners for a general overview of the scope of the workflow.
What's Changed
QA review list: Foundational work for Courses in Kolibri pilot
Course management page
- "Courses" page appears at the same level as Lessons and Quizzes in Coach navigation
- Verify coaches can view all assigned courses on this page
- Verify coaches can manage course visibility from this page
Not present: Other columns beyond visibility toggle within Courses main page table (i.e. status, learners, mastery)
Course assignment workflow
Previewing/selecting course
- Clicking to assign a course opens the side panel workflow (same pattern as lessons/quizzes)
- Only one course can be selected at a time (radio buttons, no multi-select)
- Clicking on the course card opens a course preview (further details below)
- The side panel and cards use existing routing, focus trapping, and card a11y patterns
Learner assignment
- The course can be assigned in the same manner as lessons and quizzes: entire class, existing groups, or adhoc groups of learners
Note: the assignment confirmation via signing in as the learner workflow is not yet completed and not in scope of this alpha release
Course Preview
- Condensed course information preview displays in the sidebar using an accordion layout
- Each accordion is one UNIT
- With the accordion OPEN, the coach can preview the LESSONS in the unit. (note: the Figma spec is a bit misleading here. there will not be single resources i.e. a PDF or video at the preview level)
- The Unit accordion has a title, and each lesson has a lesson icon, title, and the number of resources in that lesson
- Coaches cannot preview pre-test or post-test questions, or specific resources from within the side panel
- The header section of the course preview page has the title, thumbnail, description, as well as the number of units and resources
- Icon buttons for "expand all" and "collapse all" units are functional
NOTE: the accordions in the course preview and in the learner/group selection does not match exactly the Figma. I vetoed the design changes that Tomiwa tried to sneak in at the last moment 😅
Particular areas to QA and other notes:
- I already suspect (from my own updating the channel just now) that we are not doing a good job handling things on the course list page when the course is deleted from the device via channel management. Can we stress-test this a bit? (learner considerations to come later)
- We haven't explicitly prevented the same course from being added multiple times and to the same group(s) of learners or class. Yet to be determined if we might change this.
- The "preview" option in the dropdown menu on the courses list main page leads nowhere, and the "edit" should be updated to lead to recipients, not the course selection page. Tracked here
PRs
- Courses frontend setup by @AlexVelezLl in #14077
- Add sync operations and filter utilities for classroom partitioning by @bjester in #14070
- Create courses models and viewset by @AlexVelezLl in #14091
- Migrate from yarn to pnpm by @rtibbles in #14086
- Fix missing dep in Coach by @nucleogenesis in #14098
- Replace CSS Variables in favor of theme variable for css styling by @AllanOXDi in #14089
- Add select courses and recipients subpages by @AlexVelezLl in #14103
- Add Course Session Context to Progress Tracking by @LianaHarris360 in #14116
- Learn Course Assignments API Endpoints by @LianaHarris360 in #14113
- Add UnitTestAssignment model for managing pre/post tests in course units by @AllanOXDi in #14115
- Implement Course list data loading and display by @AllanOXDi in #14114
- Restore frontend linting and fix issues that happened in the interim by @rtibbles in #14126
- ResourceLayout component architecture for course content display by @rtibbles in #14109
- Prevent traversal of symlinks in node_modules during egg info generation. by @rtibbles in #14127
- Add API endpoints for activating/closing quizzes & returning active quiz by @AllanOXDi in #14121
- Better handle unclean server shutdown by @rtibbles in #14123
- Add linting to prevent non-scoped lodash/dateFn imports. by @rtibbles in #14125
- Course Preview by @nucleogenesis in #14117
Full Changelog: v0.19.1...0.19.2-alpha0
v0.19.1
What's Changed
This release includes HTML5 Article Renderer improvements, performance optimizations including a ~25% reduction in JS bundle size, and foundational work for upcoming features. We also addressed some tech debt and continued cleaning up Python 2.7 compatibility code with great help from the community.
Added
Content & Rendering
- Adds polyfill for to ensure browser compatibility in HTML5 Article Renderer by @AllanOXDi in #13951
- [HTML5 Article Renderer] Refactor Table Implementation by @AllanOXDi in #14002
- Implements simple scroll progress tracking for safe html5 renderer by @akolson in #13983
- Add modality field to ContentNode by @AlexVelezLl in #14042
- Add modality filter query param in Content API by @nucleogenesis in #14058
Courses Feature (Foundational)
- Add initial core courses Django app files by @LianaHarris360 in #14066
- Add courses_exist to the coach's plugin_data by @AlexVelezLl in #14068
Developer Tooling
- Add ESLint rule to validate translator key destructuring by @rtibbles in #13932
- LFS File pre-commit check by @rtibbles in #13947
- Add comprehensive documentation for URL namespacing by @rtibbles in #13863
- Add documentation about plugin enabling on pex by @rtibbles in #13948
Changed
Performance & Build
- Reduce JS production build size by ~25% by @rtibbles in #13912
- Update KDS to 5.5.0 by @MisRob in #13999
- Update H5P JavaScript library by @learning-equality-bot[bot] in #13993
- remove varchar_pattern_ops index by @ozer550 in #14076
Tech debt / refactors
- Removes the paginatedListContainerWithBackend by @AllanOXDi in #13871
- Migrate from assets/src to frontend by @rtibbles in #14009
- Update .git-blame-ignore-revs for frontend migration changes by @rtibbles in #14011
Python 2.7 Cleanup
- Remove Python 2.7 legacy: hasattr(output, 'decode') runtime checks by @AadarshM07 in #13915
- Remove Python 2.7: Replace mkdirp() with os.makedirs() by @AadarshM07 in #13927
- Remove Python 2.7 legacy: Simplify OSError/IOError exception by @AadarshM07 in #13943
- Refactor replace replace() with os.replace() by @AadarshM07 in #13949
- Remove Python 2.7 legacy: Remove lru_cache backport by @Prashant-thakur77 in #13952
- Remove Python 2.7 legacy: Update JSONDecodeError exception handling by @Prashant-thakur77 in #13950
- Remove Python 2.7: Simple syntax and import cleanups by @AadarshM07 in #13955
- Update super calls python3 by @Prashant-thakur77 in #13984
- Remove Python 2.7 FileNotFoundError compatibility shims by @rtibbles in #13985
New Contributors
- @AadarshM07 made their first contribution in #13915
- @Prashant-thakur77 made their first contribution in #13952
Full Changelog:
v0.19.0...v0.19.1-rc0
v0.19.1-rc0
What's Changed
This release includes HTML5 Article Renderer improvements, performance optimizations including a ~25% reduction in JS bundle size, and foundational work for upcoming features. We also addressed some tech debt and continued cleaning up Python 2.7 compatibility code with great help from the community.
Added
Content & Rendering
- Adds polyfill for to ensure browser compatibility in HTML5 Article Renderer by @AllanOXDi in #13951
- [HTML5 Article Renderer] Refactor Table Implementation by @AllanOXDi in #14002
- Implements simple scroll progress tracking for safe html5 renderer by @akolson in #13983
- Add modality field to ContentNode by @AlexVelezLl in #14042
- Add modality filter query param in Content API by @nucleogenesis in #14058
Courses Feature (Foundational)
- Add initial core courses Django app files by @LianaHarris360 in #14066
- Add courses_exist to the coach's plugin_data by @AlexVelezLl in #14068
Developer Tooling
- Add ESLint rule to validate translator key destructuring by @rtibbles in #13932
- LFS File pre-commit check by @rtibbles in #13947
- Add comprehensive documentation for URL namespacing by @rtibbles in #13863
- Add documentation about plugin enabling on pex by @rtibbles in #13948
Changed
Performance & Build
- Reduce JS production build size by ~25% by @rtibbles in #13912
- Update KDS to 5.5.0 by @MisRob in #13999
- Update H5P JavaScript library by @learning-equality-bot[bot] in #13993
- remove varchar_pattern_ops index by @ozer550 in #14076
Tech debt / refactors
- Removes the paginatedListContainerWithBackend by @AllanOXDi in #13871
- Migrate from assets/src to frontend by @rtibbles in #14009
- Update .git-blame-ignore-revs for frontend migration changes by @rtibbles in #14011
Python 2.7 Cleanup
- Remove Python 2.7 legacy: hasattr(output, 'decode') runtime checks by @AadarshM07 in #13915
- Remove Python 2.7: Replace mkdirp() with os.makedirs() by @AadarshM07 in #13927
- Remove Python 2.7 legacy: Simplify OSError/IOError exception by @AadarshM07 in #13943
- Refactor replace replace() with os.replace() by @AadarshM07 in #13949
- Remove Python 2.7 legacy: Remove lru_cache backport by @Prashant-thakur77 in #13952
- Remove Python 2.7 legacy: Update JSONDecodeError exception handling by @Prashant-thakur77 in #13950
- Remove Python 2.7: Simple syntax and import cleanups by @AadarshM07 in #13955
- Update super calls python3 by @Prashant-thakur77 in #13984
- Remove Python 2.7 FileNotFoundError compatibility shims by @rtibbles in #13985
New Contributors
- @AadarshM07 made their first contribution in #13915
- @Prashant-thakur77 made their first contribution in #13952
Full Changelog:
v0.19.0...v0.19.1-rc0
v0.19.1-beta0
QA Guidance
1. All Content Viewers
What to test: Every content type renderer (HTML5, H5P, BloomPUB, video, audio, PDF, ePub, Perseus, slideshow, QTI)
What to look for: JavaScript errors, broken interactions, content failing to load, performance differences
Why: Webpack bundling changes re-enabled Terser mangling and changed how core-js polyfills are loaded in the sandbox. These affect all compiled JavaScript.
- 6a4c0c4 - Webpack bundle size optimizations (mangling re-enabled)
- de9ac92 - Fix core-js duplication in viewer bundles
- 54eb476 - H5P JavaScript library update
2. Application Startup & Navigation
What to test: Initial page load, navigation menu population
What to look for: Delayed or missing navigation items, flash of untranslated content, race conditions on slow connections
Why: i18n setup is now async with lazy-loaded locale data. Navigation component registration is deferred until i18n completes. This changes the timing of when the app becomes fully interactive.
- 2eb1fba - Lazy load all intl and vue-intl locale files, defer nav component registration
3. Internationalization Across the App
What to test: Non-English languages, RTL languages, language switching
What to look for: Missing translations, layout breaks in RTL, errors when switching languages
Why: The entire i18n initialization flow was refactored from synchronous to asynchronous. Any code that assumed translations were immediately available could break.
- 2eb1fba - Lazy load all intl and vue-intl locale files
4. Channel Import
What to test: Import channels from various sources
What to look for: Import failures, missing metadata post-import
Why: Channel import now includes modality annotation step. The annotation uses options__contains JSON string matching.
- 3458d8f - Annotate modality field on upgrade and channel import flows
v0.19.0
High level overview
Release 0.19.0 updates user management capabilities to make it easier for administrators to manage user accounts. The changes reduce the number of repetitive tasks required for class enrollment and unenrollment of learners, and general account management. This makes both setting up new programs and and year-over-year user management simpler and more efficient.
Added
New Feature: User Management
Administrators can now perform actions on multiple users at once, reducing the time needed to manage users at scale. Key workflows include:
- Bulk user selection and actions: Allows admins to select multiple users and apply actions to all of them at once, including enrollment, removal from classes, and deletion
- Copy classes: Admins can now copy classes of learners and coaches
- Learner-only device management: Allow admins to remove learner-only devices users from a device and import them outside of the setup wizard workflow
- Improved user creation workflow Admins can now enroll a user in one or more classes during user account creation
List of supporting PRs
- [WIP] Added Sorting facility to Users KTable by @BabyElias in #13393
- Implement all_objects manager class in FacilityUser by @ozer550 in #13433
- Bulk User Management strings by @nucleogenesis in #13424
- Selectable list by @AlexVelezLl in #13460
- Implement soft delete users in bulk by @ozer550 in #13483
- Bulk User: Strings fixes w/ ICU + add Class copy strings by @nucleogenesis in #13466
- Insert checkbox column in Facility > Users KTable to allow user selection by @AllanOXDi in #13479
- Improved Object Validations with New ValidateObject by @Abhishek-Punhani in #13301
- Deleted facilityuser viewset by @AlexVelezLl in #13502
- Update Fundamental routing & data architecture for users page by @LianaHarris360 in #13515
- Manage users in LOD by @AlexVelezLl in #12228
- BUM SidePanel: Implement Enroll (learners) to classes functionality by @LianaHarris360 in #13544
- Introduce copy class functionality by @AllanOXDi in #13517
- BUM: Improved user creation by @AlexVelezLl in #13538
- Setup bulk user action buttons on the Facility Users page by @AllanOXDi in #13513
- Implement repeating cleanup task for hard-deleting expired soft-deleted FacilityUsers by @ozer550 in #13591
- Disable class copy submission if class name is empty by @LianaHarris360 in #13607
- Remove class title in favour of class name in class copy form by @AllanOXDi in #13617
- sorts class names in the dropdown menu alphabetically by @AllanOXDi in #13616
- Add user type column to csv logs export by @AlexVelezLl in #13624
- [BUM] Add filters side panel by @AlexVelezLl in #13608
- Implement move to trash side panel by @AlexVelezLl in #13600
- BUM SidePanel: Implement remove users from classes side panel functionality by @LianaHarris360 in #13651
- Add removed users page by @AlexVelezLl in #13650
- Fix error when deleting a single user in UsersTable by @LianaHarris360 in #13655
- BUM SidePanel: Implement Assign (coaches) to classes functionality by @ozer550 in #13614
- Update copy class to include learners and move from SidePanelModal to KModal by @LianaHarris360 in #13665
- Remove white spaces from formfields by @AllanOXDi in #13606
- Refactor undo actions + consistent go back and close confirmation guards by @AlexVelezLl in #13674
- Fix scroll users page by @AlexVelezLl in #13671
- Fix LOD user management server sync interruptions by @LianaHarris360 in #13695
- Move auth methods to the useUser composable by @AlexVelezLl in #13704
- Fixes the remove icon enabled when a super admin is selected by @AllanOXDi in #13700
- Resolve error when re-enrolling the same user in multiple classes by @LianaHarris360 in #13681
- Fixes the deletion of super admin by admin user. by @AllanOXDi in #13666
- Uncenter dropdown options within Users Table by @LianaHarris360 in #13741
- Fix users reload after soft-deleting a user by @AlexVelezLl in #13739
- Update bulk action icons to need only one TAB press for keyboard navigation by @LianaHarris360 in #13755
- Standarize side panels styles by @AlexVelezLl in #13763
- Handle deletion of coach from the assigned classes by @AllanOXDi in #13652
- Fixes selected users clearing before an action is completed by @AllanOXDi in #13701
- Can copy (or rename or delete) on ClassEditPage as well by @nucleogenesis in #13771
- User Table Style Updates by @nucleogenesis in #13743
- Allow class search to match text anywhere in the string by @LianaHarris360 in #13773
- Remove unused modal by @AlexVelezLl in #13788
- Add empty messages on classes lists by @AlexVelezLl in #13785
- [Bulk User]: Handle bad-data errors w/
handleApiError(+ better side panel refresh handling) by @nucleogenesis in #13769 - Filter out soft deleted users from lessons, quizzes and groups by @AlexVelezLl in #13806
- Prototyping User Table Design Updates by @nucleogenesis in #13808
- [Copy a class]: Use vuex getter for facility-aware redirection by @nucleogenesis in #13858
- [BUM Side Panel]: Fix hidden android side panels by @nucleogenesis in #13855
- have copy learners in copy class workflow set to true by default by @marcellamaki in #13864
- Refactor UsersTableToolbar by @AlexVelezLl in #13862
- Updates empty filter state messaging by @AllanOXDi in #13762
- Manually cherry-picked rebasing of @AllanOXDi 's
filtersupdatebranch #13830 by @nucleogenesis in #13860 - Fixes Bulk User Creation Failed prop console error by @AllanOXDi in #13830
- Fix CopyClassModal handle removed coaches by @nucleogenesis in #13879
- Robustly clear sessions on user deletion to cause immediate logout by @rtibbles in #13757
Noteworthy technical updates include upgrading to Node.js v20, upgrading to Morango for improved sync reliability, implementing SQLite transaction improvements for better performance, and adding Django-silk support for development performance profiling.
Other technical additions include upgrading Morango for improved sync performance, implementing load testing framework for learner interactions, and finalizing JS package renaming and migration in the packages directory.
List of supporting PRs
Changed
Code cleanup and refactoring.
v0.19.0-rc1
0.19.0
High level overview
Release 0.19.0 updates user management capabilities that make it easier for administrators to manage users. The changes reduce the number of repetitive tasks required for class enrollment and unenrollment of learners, and general user account management. This makes both setting up new programs and and year-over-year user management simpler and more efficient.
Additionally, this release upgrades to node v20.
Added
New Feature: Bulk User Management
Administrators can now perform actions on multiple users at once, reducing the time needed to manage users at scale. Key workflows include:
- Bulk user selection and actions: Allows admins to select multiple users and apply actions to all of them at once, including enrollment, removal from classes, and deletion
- Copy classes: Admins can now copy classes of learners and coaches
- Learner-only device management: Allow admins to remove learner-only devices users from a device and import them outside of the setup wizard workflow
- Improved user creation workflow Admins can now enroll a user in one or more classes during user account creation
List of supporting PRs
- [WIP] Added Sorting facility to Users KTable by @BabyElias in #13393
- Implement all_objects manager class in FacilityUser by @ozer550 in #13433
- Bulk User Management strings by @nucleogenesis in #13424
- Selectable list by @AlexVelezLl in #13460
- Implement soft delete users in bulk by @ozer550 in #13483
- Bulk User: Strings fixes w/ ICU + add Class copy strings by @nucleogenesis in #13466
- Insert checkbox column in Facility > Users KTable to allow user selection by @AllanOXDi in #13479
- Improved Object Validations with New ValidateObject by @Abhishek-Punhani in #13301
- Deleted facilityuser viewset by @AlexVelezLl in #13502
- Update Fundamental routing & data architecture for users page by @LianaHarris360 in #13515
- Manage users in LOD by @AlexVelezLl in #12228
- BUM SidePanel: Implement Enroll (learners) to classes functionality by @LianaHarris360 in #13544
- Introduce copy class functionality by @AllanOXDi in #13517
- BUM: Improved user creation by @AlexVelezLl in #13538
- Setup bulk user action buttons on the Facility Users page by @AllanOXDi in #13513
- Implement repeating cleanup task for hard-deleting expired soft-deleted FacilityUsers by @ozer550 in #13591
- Disable class copy submission if class name is empty by @LianaHarris360 in #13607
- Remove class title in favour of class name in class copy form by @AllanOXDi in #13617
- sorts class names in the dropdown menu alphabetically by @AllanOXDi in #13616
- Add user type column to csv logs export by @AlexVelezLl in #13624
- [BUM] Add filters side panel by @AlexVelezLl in #13608
- Implement move to trash side panel by @AlexVelezLl in #13600
- BUM SidePanel: Implement remove users from classes side panel functionality by @LianaHarris360 in #13651
- Add removed users page by @AlexVelezLl in #13650
- Fix error when deleting a single user in UsersTable by @LianaHarris360 in #13655
- BUM SidePanel: Implement Assign (coaches) to classes functionality by @ozer550 in #13614
- Update copy class to include learners and move from SidePanelModal to KModal by @LianaHarris360 in #13665
- Remove white spaces from formfields by @AllanOXDi in #13606
- Refactor undo actions + consistent go back and close confirmation guards by @AlexVelezLl in #13674
- Fix scroll users page by @AlexVelezLl in #13671
- Fix LOD user management server sync interruptions by @LianaHarris360 in #13695
- Move auth methods to the useUser composable by @AlexVelezLl in #13704
- Fixes the remove icon enabled when a super admin is selected by @AllanOXDi in #13700
- Resolve error when re-enrolling the same user in multiple classes by @LianaHarris360 in #13681
- Fixes the deletion of super admin by admin user. by @AllanOXDi in #13666
- Uncenter dropdown options within Users Table by @LianaHarris360 in #13741
- Fix users reload after soft-deleting a user by @AlexVelezLl in #13739
- Update bulk action icons to need only one TAB press for keyboard navigation by @LianaHarris360 in #13755
- Standarize side panels styles by @AlexVelezLl in #13763
- Handle deletion of coach from the assigned classes by @AllanOXDi in #13652
- Fixes selected users clearing before an action is completed by @AllanOXDi in #13701
- Can copy (or rename or delete) on ClassEditPage as well by @nucleogenesis in #13771
- User Table Style Updates by @nucleogenesis in #13743
- Allow class search to match text anywhere in the string by @LianaHarris360 in #13773
- Remove unused modal by @AlexVelezLl in #13788
- Add empty messages on classes lists by @AlexVelezLl in #13785
- [Bulk User]: Handle bad-data errors w/
handleApiError(+ better side panel refresh handling) by @nucleogenesis in #13769 - Filter out soft deleted users from lessons, quizzes and groups by @AlexVelezLl in #13806
- Prototyping User Table Design Updates by @nucleogenesis in #13808
- [Copy a class]: Use vuex getter for facility-aware redirection by @nucleogenesis in #13858
- [BUM Side Panel]: Fix hidden android side panels by @nucleogenesis in #13855
- have copy learners in copy class workflow set to true by default by @marcellamaki in #13864
- Refactor UsersTableToolbar by @AlexVelezLl in #13862
- Updates empty filter state messaging by @AllanOXDi in #13762
- Manually cherry-picked rebasing of @AllanOXDi 's
filtersupdatebranch #13830 by @nucleogenesis in #13860 - Fixes Bulk User Creation Failed prop console error by @AllanOXDi in #13830
- Fix CopyClassModal handle removed coaches by @nucleogenesis in #13879
- Robustly clear sessions on user deletion to cause immediate logout by @rtibbles in #13757
Noteworthy technical updates include upgrading to Node.js v20, upgrading to Morango for improved sync reliability, implementing SQLite transaction improvements for better performance, and adding Django-silk support for development performance profiling.
Other technical additions include upgrading Morango for improved sync performance, implementing load testing framework for learner interactions, and finalizing JS package renaming and migration in the packages directory.
List of supporting PRs
Changed
- BREAKING CHANGE - Node.js has been upgraded from v18 to v20.
Additional changes are code cleanup and non-breaking refactoring.
Supporting PRs
- Upgrade Node.js from v18 to v20 by @rtibbles in #13531
- Remove vestigial is_facility_user flag in favour of standard Django user properties by @rtibbles in https://github.com/lear...