[DO NOT MERGE]: unstable to hotfixes, Q1 major release#5750
Draft
marcellamaki wants to merge 770 commits intohotfixesfrom
Draft
[DO NOT MERGE]: unstable to hotfixes, Q1 major release#5750marcellamaki wants to merge 770 commits intohotfixesfrom
marcellamaki wants to merge 770 commits intohotfixesfrom
Conversation
Bumps [jsonschema](https://github.com/python-jsonschema/jsonschema) from 4.25.1 to 4.26.0. - [Release notes](https://github.com/python-jsonschema/jsonschema/releases) - [Changelog](https://github.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst) - [Commits](python-jsonschema/jsonschema@v4.25.1...v4.26.0) --- updated-dependencies: - dependency-name: jsonschema dependency-version: 4.26.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [packaging](https://github.com/pypa/packaging) from 25.0 to 26.0. - [Release notes](https://github.com/pypa/packaging/releases) - [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst) - [Commits](pypa/packaging@25.0...26.0) --- updated-dependencies: - dependency-name: packaging dependency-version: '26.0' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
…lVersion-objects-and-database Remove channelVersion object and database with version "next" when stale
Add Notifications page
Migrate to uv and fix dependency issues
Bumps the babel group with 4 updates: [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core), [@babel/plugin-syntax-import-assertions](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-syntax-import-assertions), [@babel/plugin-transform-runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime) and [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env). Updates `@babel/core` from 7.28.5 to 7.29.0 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.0/packages/babel-core) Updates `@babel/plugin-syntax-import-assertions` from 7.27.1 to 7.28.6 - [Release notes](https://github.com/babel/babel/releases) - [Commits](https://github.com/babel/babel/commits/v7.28.6/packages/babel-plugin-syntax-import-assertions) Updates `@babel/plugin-transform-runtime` from 7.28.5 to 7.29.0 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.0/packages/babel-plugin-transform-runtime) Updates `@babel/preset-env` from 7.28.5 to 7.29.0 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.0/packages/babel-preset-env) --- updated-dependencies: - dependency-name: "@babel/core" dependency-version: 7.29.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel - dependency-name: "@babel/plugin-syntax-import-assertions" dependency-version: 7.28.6 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel - dependency-name: "@babel/plugin-transform-runtime" dependency-version: 7.29.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel - dependency-name: "@babel/preset-env" dependency-version: 7.29.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: babel ... Signed-off-by: dependabot[bot] <support@github.com>
Approve unrs-resolver build used by jest
Loosen the snapshot condition in ChannelVersion.save() to also fire when version is None (draft rows), so every draft publish captures the current channel name, description, thumbnail encoding, tagline, and language on the draft ChannelVersion. Repeated draft publishes always reflect the latest channel state. Tests cover: first draft publish populates all four snapshot fields, and a second draft publish after mutating channel metadata (including language change from "en" to "fr") refreshes all four fields on the existing row. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: populate channel snapshot fields on draft ChannelVersion during draft publish
Propagate is_draft_version from create_content_database into map_channel_to_kolibri_channel so the exported content DB records version=0 for draft publishes instead of channel.version + 1. Kolibri's version-upgrade logic replaces any DB whose version is lower than the incoming version, so version=0 ensures any real publish (version >= 1) will always supersede a draft. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix: write version=0 in ChannelMetadata for draft publishes
This includes: - Updated translation files (.po and .json) - Compiled Django messages (.mo files) - Updated frontend i18n files
Update translations from Crowdin for unstable
Add guards for channel version computed values
…ging draft publishing.
…shable-changes Robust solution for filtering unpublishable changes on frontend
Revert "Temporarily hide draft button."
Fix lookup not finding draft tokens
This includes: - Updated translation files (.po and .json) - Compiled Django messages (.mo files) - Updated frontend i18n files
Update translations from Crowdin for unstable
…ri to avoid issues with autoformatting of downloaded i18n files.
Exclude po and json files from end-of-file-fixer hook
This was referenced Apr 28, 2026
…5860) * Remap Unit extra_fields.options node IDs when copying via copy_node When a Unit topic (UNIT modality) is cloned, lesson node IDs and pre/post test node IDs in extra_fields.options are rewritten to the IDs of their copies. Entries whose source nodes were not part of the copy operation (e.g. excluded via excluded_descendants) are dropped. Adds _remap_unit_options() static helper on CustomContentNodeTreeManager, calls it in _recurse_to_create_tree() for the deep-copy path and in _copy() for the shallow-copy path. _deep_copy() and _copy() now return (nodes, source_copy_id_map) so the map is available to callers; copy_node() unwraps the tuple and returns only the node list. * Test Unit extra_fields.options remapping across copy paths Adds UnitCopyExtraFieldsTestCase covering: - lesson_objectives keys remapped to cloned lesson PKs (deep and shallow) - pre_test/post_test values remapped to cloned node PKs (deep and shallow) - excluded lesson entry dropped from cloned Unit's lesson_objectives - excluded Unit: copy succeeds with no remap error (deep and shallow) - resource excluded inside lesson: lesson entry preserved (deep and shallow) - assessment_objectives, learning_objectives, completion_criteria unchanged - standalone Unit copy remaps its lesson children correctly - extra_fields on Course and Lesson topics is copied verbatim * Remove pre/post test remapping — Unit options contain no such node-ID keys The pre_test/post_test entries in a Unit's options are assessment items on the Unit node itself, not separate ContentNode IDs. Remove the dead code in _remap_unit_options() and the fantasy test coverage that accompanied it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test: drop test_standalone_unit_copy_remaps_lesson_children Reviewer noted this test is redundant — the same behaviour is already exercised by the deep/shallow copy integration tests for Unit nodes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…n/ajv-8.18.0 chore(deps): bump ajv from 8.17.1 to 8.18.0
Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 5 to 6.0.3. - [Release notes](https://github.com/pnpm/action-setup/releases) - [Commits](pnpm/action-setup@v5...v6.0.3) --- updated-dependencies: - dependency-name: pnpm/action-setup dependency-version: 6.0.3 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
Bumps [pytest-django](https://github.com/pytest-dev/pytest-django) from 4.11.1 to 4.12.0. - [Release notes](https://github.com/pytest-dev/pytest-django/releases) - [Changelog](https://github.com/pytest-dev/pytest-django/blob/main/docs/changelog.rst) - [Commits](pytest-dev/pytest-django@v4.11.1...v4.12.0) --- updated-dependencies: - dependency-name: pytest-django dependency-version: 4.12.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
…ons/pnpm/action-setup-6.0.3 chore(deps): bump pnpm/action-setup from 5 to 6.0.3
…jango-4.12.0 chore(deps-dev): bump pytest-django from 4.11.1 to 4.12.0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
!IMPORTANT!
ensure_versioned_databases_existandcreate_channel_versionsmigration commands should be added to Makefile's deploy-migrate command just before merging this PR.update hotfixes to have production database
Summary
…
Vuetify → KDS Migration
Tracking issue: #5060
This overview sets the scope of regression testing needed before release. The refactoring work replaces Vuetify components with Kolibri Design System (KDS) components across Studio. For each workflow, we're primarily focused on interactions and functionality — making sure nothing broke in the migration. Some minor visual differences are expected and noted below.
For detailed context on any specific change, issue links are included per section. When in doubt about whether something is a regression or an intentional change, check the linked issues.
General notes:
unstable/settings)We're regression testing all 3 tabs. The priority is interactions and functionality.
What changed: Page layout, offline alert bar, and several components across the Account and Storage tabs were migrated from Vuetify to KDS.
Account tab:
Storage tab:
General:
Visual differences: Modals (e.g., "About licenses", "Request more space") will look slightly different from production due to KDS styling. Functionality is the priority.
Related issues: #5061, #5062, #5063, #5064, #5080, #5081, #5082, #5092, #5095, #5123, #5127, #5132
/channels)Several distinct sub-areas were touched here. Test each sub-area as a workflow.
What changed: Channel cards across all channel listing views, channel detail pages, channel collections, the Content Library, error pages, and several modals were all migrated.
2a. Channel listing views (My Channels, Starred, View-only)
Related issues: #5218, #5219, #5227, #5524, #5525
2b. Channel detail page
Visual differences: Modals on the channel detail page (e.g., unsaved changes) will look slightly different.
Related issues: #5217, #5474, #5484, #5485, #5529, #5530
2c. New collection / Unsaved changes
Visual differences: "Unsaved changes" modal will look slightly different from production.
Related issues: #5243, #5244, #5298, #5299
2d. Content Library
Visual differences: "About collections" modal will look slightly different.
Related issues: #5234, #5471, #5502, #5526, #5528
2e. Error pages
Related issues: #5235, #5295, #5296, #5297
The channel editor had the most changes across this migration — many dialogs and action buttons throughout the editing workflow were updated. Test these as you would a normal editing session, but make a point to trigger each dialog.
What changed: Buttons and dialogs throughout the editing workflow — move, upload, questions, import, and several confirmation dialogs.
Organize / Move:
Upload:
Questions:
Content actions:
Related tab:
File preview:
Import from channels:
Navigation / errors:
Visual differences: All dialogs/modals in the channel editor (move, upload, confirm delete, change question type, etc.) will look slightly different from production.
Related issues: #5355, #5375, #5376, #5377, #5378, #5379, #5420, #5421, #5422, #5423, #5442, #5443, #5444, #5470, #5472, #5473
These are the pre-login and account lifecycle pages. Testing is straightforward — confirm all interactive elements function correctly.
What changed: Buttons and links on the sign-in, account created, and account deleted pages; various informative pages.
Related issues: #5352, #5353, #5534, #5631, #5632, #5633, #5636, #5637
/administration)Admin-only pages. Confirm all management actions and their confirmation dialogs work end-to-end.
What changed: Buttons and confirmation dialogs for user and channel management actions; the send email dialog.
Users:
Channels:
Email:
Visual differences: All confirmation dialogs and the send email dialog will look slightly different from production.
Related issues: #5354, #5410, #5411, #5425, #5441
Policy modals
Visual differences: Policy modals will look slightly different from production.
Related issues: #5651
Easy Sharing of Community Channels (ESoCC)
Tracking issue: learningequality/kolibri-ecosystem#42
Overview
This document sets the scope of QA testing for the Easy Sharing of Community Channels feature — a set of new workflows that allow channel editors to submit channels for inclusion in a Community Library, and admins to review and approve those submissions.
The four primary workflows are:
General notes:
unstabletest_dev_featurefeature flag — confirm it is enabled before testing that workflowThis feature focuses on two user types — channel editors (regular Studio users who create and manage channels) and Studio admins (internal Learning Equality staff who review submissions). Since aspects of the workflows are interdependent, setting up two accounts to start may make testing more efficient.
(I tried to test the UX with just one admin account and definitely confused myself 😓 )
You can test draft channel publishing workflow separately (Section 1), since it's pretty self-contained.
Community channels (suggested) testing flow:
(This will probably have to be repeated for several different scenarios such as publishing a channel while a submission is still under review, approving vs. not, etc.)
1. Draft channel publishing
Channel editors can now publish a new version of a channel as a "draft" — this allows the new version to be tested in Kolibri without publishing it as the live version for users. Draft versions get their own token for import into Kolibri.
Note: This workflow requires the
test_dev_featurefeature flag to be enabled.Publishing a draft:
Version history in publish side panel:
After publishing a channel that already has a Community Library submission:
Related issues: #4471, #5172, #5192, #5209, #5460, #5461, #5463, #5567, #5617, #5629
2. Submitting a channel to the Community Library
Channel editors can submit a published channel for inclusion in the Community Library. The submission includes metadata (country, subject), and the system runs a license audit to flag any content that may not be distributable.
Accessing the submission panel:
To test the license audit warning states, you'll need a published channel that contains at least one resource with an "All Rights Reserved" license. Add such a resource, publish the channel, then open the submission panel — the audit should flag it.
Filling out the submission form:
Subsequent submissions and state messaging:
After publishing a channel that already has a Community Library submission:
Deleting a channel that is live in the Community Library:
Related issues: #5159, #5145, #5157, #5158, #5169, #5262, #5448, #5449, #5450, #5451, #5452, #5453, #5459, #5568
3. Admin review and approval workflows
What this is: The admin channels table has been updated to surface Community Library submission status, and a new review flow allows admins to approve, flag, or add notes to submissions.
Admin channels table (
/administration/channels):Community Library details page:
Review side panel:
Related issues: #5173, #5170, #5171, #5191, #5208, #5250, #5251, #5263, #5301, #5302, #5455, #5580, #5581, #5627
4. Channel editor notifications
What this is: When an admin approves or flags a submission, the submitting channel editor receives a notification. A red dot appears on their username and in the sidebar, and a notifications page shows the submission status and any feedback from the admin.
Setup — use separate accounts: This workflow requires actions from two different roles. We recommend testing with two separate browser sessions (or one normal + one incognito window) to avoid confusion:
Trying to do both from the same account makes the UX difficult to follow and can mask issues.
Note: The notifications page shows all submissions across all channels the user is an editor of, and all resolutions (approvals/rejections) for those submissions.
Red dot / notification indicator:
Notification recipients:
Notifications page:
Related issues: #5174, #5456, #5457, #5458
AI usage
Significant Claude help in drafting QA team guidance