Skip to content

Commit f2b7b51

Browse files
authored
Merge pull request #14359 from marcellamaki/0.19.2-into-develop
0.19.2 into develop
2 parents 4b01e69 + 80d0468 commit f2b7b51

File tree

1,124 files changed

+53491
-34964
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,124 files changed

+53491
-34964
lines changed

.github/githubUtils.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ async function generateAssetComment(github, context) {
109109
text += `\n| ${readableName} | [${artifact.name}](${repoHtmlUrl}/suites/${checkSuiteNumber}/artifacts/${artifact.id.toString()}) |`
110110
}
111111
}
112+
113+
const screenshotArtifact = artifacts.find(
114+
(artifact) => artifact.name === 'smoke_test_screenshot' && !artifact.expired
115+
)
116+
if (screenshotArtifact) {
117+
const screenshotUrl = `${repoHtmlUrl}/suites/${checkSuiteNumber}/artifacts/${screenshotArtifact.id.toString()}`
118+
text += `\n\n<details>\n<summary>Smoke test screenshot</summary>\n\n[Download screenshot](${screenshotUrl})\n\n</details>`
119+
}
120+
112121
return text
113122
}
114123

.github/workflows/i18n-upload.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
run: sudo apt-get update && sudo apt-get install -y gettext
3939

4040
- name: Install Python dependencies
41-
run: pip install -r requirements/base.txt
41+
run: pip install . -r requirements/base.txt
4242

4343
- name: Install JavaScript dependencies
4444
run: pnpm install --frozen-lockfile

.github/workflows/pr_build_kolibri.yml

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,51 @@ jobs:
5555
apk:
5656
name: Build APK file
5757
needs: whl
58-
uses: learningequality/kolibri-installer-android/.github/workflows/build_apk.yml@v0.1.6
58+
uses: learningequality/kolibri-installer-android/.github/workflows/build_apk.yml@v0.1.7
5959
with:
6060
tar-file-name: ${{ needs.whl.outputs.tar-file-name }}
61-
ref: v0.1.6
61+
ref: v0.1.7
6262
zip:
6363
name: Build Raspberry Pi Image
6464
needs: deb
6565
uses: learningequality/kolibri-image-pi/.github/workflows/build_img.yml@v1.0.0
6666
with:
6767
deb-file-name: ${{ needs.deb.outputs.deb-file-name }}
6868
ref: v1.0.0
69+
browser_smoke_test:
70+
name: Browser smoke test
71+
needs: whl
72+
runs-on: ubuntu-latest
73+
timeout-minutes: 10
74+
steps:
75+
- uses: actions/checkout@v6
76+
- name: Install Python
77+
uses: actions/setup-python@v6
78+
with:
79+
python-version: '3.12'
80+
- uses: actions/download-artifact@v7
81+
with:
82+
name: ${{ needs.whl.outputs.whl-file-name }}
83+
path: dist
84+
- name: Install WHL file
85+
run: pip install dist/${{ needs.whl.outputs.whl-file-name }}
86+
- name: Install Playwright
87+
run: |
88+
pip install "playwright<2"
89+
playwright install --with-deps chromium
90+
- name: Run browser smoke test
91+
env:
92+
KOLIBRI_HOME: ${{ runner.temp }}/kolibri_home
93+
SCREENSHOT_PATH: ${{ runner.temp }}/smoke_test_screenshot.png
94+
working-directory: ${{ runner.temp }}
95+
run: python ${{ github.workspace }}/integration_testing/smoke_test.py
96+
- name: Upload screenshot
97+
if: always()
98+
uses: actions/upload-artifact@v6
99+
with:
100+
name: smoke_test_screenshot
101+
path: ${{ runner.temp }}/smoke_test_screenshot.png
102+
if-no-files-found: ignore
69103
test_whl_file:
70104
name: Test WHL file
71105
needs: whl

.github/workflows/release_kolibri.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,11 @@ jobs:
119119
apk:
120120
name: Build Android APK
121121
needs: whl
122-
uses: learningequality/kolibri-installer-android/.github/workflows/build_apk.yml@v0.1.6
122+
uses: learningequality/kolibri-installer-android/.github/workflows/build_apk.yml@v0.1.7
123123
with:
124124
tar-file-name: ${{ needs.whl.outputs.tar-file-name }}
125125
release: true
126-
ref: v0.1.6
126+
ref: v0.1.7
127127
secrets:
128128
KOLIBRI_ANDROID_APP_PRODUCTION_KEYSTORE: ${{ secrets.KOLIBRI_ANDROID_APP_PRODUCTION_KEYSTORE }}
129129
KOLIBRI_ANDROID_APP_PRODUCTION_KEYSTORE_PASSWORD: ${{ secrets.KOLIBRI_ANDROID_APP_PRODUCTION_KEYSTORE_PASSWORD }}
@@ -248,9 +248,9 @@ jobs:
248248
name: Release Android App
249249
if: ${{ !github.event.release.prerelease }}
250250
needs: [apk, block_release_step]
251-
uses: learningequality/kolibri-installer-android/.github/workflows/release_apk.yml@v0.1.6
251+
uses: learningequality/kolibri-installer-android/.github/workflows/release_apk.yml@v0.1.7
252252
with:
253253
version-code: ${{ needs.apk.outputs.version-code }}
254-
ref: v0.1.6
254+
ref: v0.1.7
255255
secrets:
256256
KOLIBRI_ANDROID_PLAY_STORE_API_SERVICE_ACCOUNT_JSON: ${{ secrets.KOLIBRI_ANDROID_PLAY_STORE_API_SERVICE_ACCOUNT_JSON }}

AGENTS.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,12 @@ pytest kolibri/path/to/test/ # Python (directory)
136136
pytest kolibri/core/auth/test/ -k test_login # Python (filter by name)
137137
pnpm run test-jest -- path/to/file.spec.js # Frontend (single file)
138138
pnpm run test-jest -- --testPathPattern learn # Frontend (filter by pattern)
139-
pre-commit run --all-files # Lint
139+
pre-commit run --all-files # Lint (all files)
140+
pre-commit run --files path/to/File.vue # Lint (specific file)
140141
```
141142

143+
Always use `pre-commit` as the single entry point for linting — do not invoke ESLint or other linters directly.
144+
142145
## Docs Reference
143146

144147
Testing: `docs/testing.rst`, `docs/frontend_architecture/unit_testing.rst`, `docs/backend_architecture/testing.rst` | Frontend arch: `docs/frontend_architecture/` | Backend arch: `docs/backend_architecture/` | i18n: `docs/i18n.rst` | Code quality: `docs/code_quality.rst` | How-tos: `docs/howtos/` | Workflow: `docs/development_workflow.rst` | Multi-agent setup: `docs/howtos/multi_agent_setup.md` | User docs: https://kolibri.readthedocs.io/

CHANGELOG.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,88 @@
33
List of the most important changes for each release.
44

55

6+
## 0.19.2
7+
8+
### High level overview
9+
10+
This release makes some upgrades to the developer experience, fixes various bugs, and includes foundational work for the upcoming courses feature, including API endpoints and frontend architecture for course listing and course session management. We also continued to make progress on cleaning up Python 2.7 compatibility code.
11+
12+
### Added
13+
14+
#### Courses Features (Foundational)
15+
- Courses frontend setup by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/14077
16+
- Create courses models and viewset by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/14091
17+
- Add select courses and recipients subpages by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/14103
18+
- Add Course Session Context to Progress Tracking by @LianaHarris360 in https://github.com/learningequality/kolibri/pull/14116
19+
- Learn Course Assignments API Endpoints by @LianaHarris360 in https://github.com/learningequality/kolibri/pull/14113
20+
- Add UnitTestAssignment model for managing pre/post tests in course units by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14115
21+
- Implement Course list data loading and display by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14114
22+
- ResourceLayout component architecture for course content display by @rtibbles in https://github.com/learningequality/kolibri/pull/14109
23+
- Add API endpoints for activating/closing quizzes & returning active quiz by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14121
24+
- Course Preview by @nucleogenesis in https://github.com/learningequality/kolibri/pull/14117
25+
- Add course unit view by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/14128
26+
- Course unit view 2 by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/14145
27+
- Course welcome view by @LianaHarris360 in https://github.com/learningequality/kolibri/pull/14146
28+
- Course cards homepage by @marcellamaki in https://github.com/learningequality/kolibri/pull/14122
29+
- Pre/Post-Tests Activation UI by @nucleogenesis in https://github.com/learningequality/kolibri/pull/14147
30+
- Add confirmation modal to prevent accidental closure of Course Assignment Side Panel by @LianaHarris360 in https://github.com/learningequality/kolibri/pull/14150
31+
32+
#### Sync & Backend
33+
- Add sync operations and filter utilities for classroom partitioning by @bjester in https://github.com/learningequality/kolibri/pull/14070
34+
- Implement new deserialization logic according to sync_filter by @ozer550 in https://github.com/learningequality/kolibri/pull/14148
35+
36+
#### Developer Tooling
37+
- Add AI agent documentation and multi-agent isolation support by @rtibbles in https://github.com/learningequality/kolibri/pull/14144
38+
- Add documentation indicating that APIs are internal by @rtibbles in https://github.com/learningequality/kolibri/pull/14090
39+
- Add ESLint rule to prevent RTL-breaking inline styles by @rtibbles in https://github.com/learningequality/kolibri/pull/14093
40+
- Add linting to prevent non-scoped lodash/dateFn imports by @rtibbles in https://github.com/learningequality/kolibri/pull/14125
41+
- Add browser smoke test to PR build workflow by @rtibbles in https://github.com/learningequality/kolibri/pull/14153
42+
- Add hashing to font CSS and WOFF generation by @rtibbles in https://github.com/learningequality/kolibri/pull/14088
43+
44+
### Developer-facing improvements
45+
46+
#### Build & Infrastructure
47+
- Migrate from yarn to pnpm by @rtibbles in https://github.com/learningequality/kolibri/pull/14086
48+
- Restore frontend linting and fix issues that happened in the interim by @rtibbles in https://github.com/learningequality/kolibri/pull/14126
49+
- Prevent traversal of symlinks in node_modules during egg info generation by @rtibbles in https://github.com/learningequality/kolibri/pull/14127
50+
- Migrate from tibdex/github-app-token to actions/create-github-app-token by @rtibblesbot in https://github.com/learningequality/kolibri/pull/14206
51+
- Update ignores for worktrees and JetBrains features by @bjester in https://github.com/learningequality/kolibri/pull/14162
52+
- Slim down agents.md with progressive disclosure and moving more into Claude.md by @rtibbles in https://github.com/learningequality/kolibri/pull/14164
53+
- Install kolibri in i18n-upload workflow by @rtibbles in https://github.com/learningequality/kolibri/pull/14239
54+
- Fix invocations of i18n commands and ignores by @rtibbles in https://github.com/learningequality/kolibri/pull/14247
55+
56+
#### Tech debt / refactors
57+
- Replace CSS Variables in favor of theme variable for css styling by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14089
58+
- Removes residue style overrides prop code by @akolson in https://github.com/learningequality/kolibri/pull/14112
59+
- Remove no longer needed overflow: unset by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/14202
60+
- Clean up localeCompare usage for proper internationalization (fixes #3888) by @rtibbles in https://github.com/learningequality/kolibri/pull/14087
61+
- Update kolibri-zip with support for css import statements, fix browser compatibility by @rtibbles in https://github.com/learningequality/kolibri/pull/14085
62+
63+
#### Python 2.7 Cleanup
64+
- Remove unnecessary UTF-8 coding declarations from Python files by @manocormen in https://github.com/learningequality/kolibri/pull/14215
65+
- Remove explicit object base class from Python classes by @manocormen in https://github.com/learningequality/kolibri/pull/14224
66+
- Clean up outdated Python 2.7 comments and unicode string literals by @curiouscoder-cmd in https://github.com/learningequality/kolibri/pull/14227
67+
- Remove Python 2 compatibility shims by @sharma-anushka in https://github.com/learningequality/kolibri/pull/14226
68+
69+
#### Translations
70+
- Update translations from Crowdin for release-v0.19.x by @learning-equality-bot[bot] in https://github.com/learningequality/kolibri/pull/14249
71+
72+
### Fixed
73+
- Better handle unclean server shutdown by @rtibbles in https://github.com/learningequality/kolibri/pull/14123
74+
- Fix missing dep in Coach by @nucleogenesis in https://github.com/learningequality/kolibri/pull/14098
75+
- Fix flaky Python tests: ordering, network mocking, and missing request mocks by @rtibblesbot in https://github.com/learningequality/kolibri/pull/14177
76+
- Fixes notification for no resources on the device being shown when no exercises exist by @akolson in https://github.com/learningequality/kolibri/pull/14288
77+
- "Resume" card display and progress fixes by @marcellamaki in https://github.com/learningequality/kolibri/pull/14289
78+
- Resume pagination fixes by @rtibbles in https://github.com/learningequality/kolibri/pull/14313
79+
- Better missing resources handling by @akolson in https://github.com/learningequality/kolibri/pull/14201
80+
- Unprovisioned URL Redirect (+ remove dead code) by @nucleogenesis in https://github.com/learningequality/kolibri/pull/14200
81+
- Prevent double scrollbar in side panel modal by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14228
82+
- Reset selection after applying filter by @AllanOXDi in https://github.com/learningequality/kolibri/pull/13880
83+
- Retry peeruserimport task on Database or connection errors by @AlexVelezLl in https://github.com/learningequality/kolibri/pull/13821
84+
- Fix The 'Recipients' drop-down to show groups list by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14156
85+
- Fixes TypeError on clicking 'Select recipients' from the course details page by @AllanOXDi in https://github.com/learningequality/kolibri/pull/14160
86+
87+
688
## 0.19.1
789

890
### High level overview

Makefile

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,17 +225,17 @@ i18n-django-compilemessages:
225225
cd kolibri && PYTHONPATH="..:$$PYTHONPATH" python -m kolibri manage compilemessages --skip-update
226226

227227
i18n-upload: i18n-extract
228-
pnpm exec crowdin upload sources -- --branch ${CROWDIN_BRANCH}
228+
pnpm exec crowdin upload sources --branch ${CROWDIN_BRANCH}
229229

230230
i18n-pretranslate:
231-
pnpm exec crowdin pre-translate -- --branch ${CROWDIN_BRANCH} --translate-untranslated-only --method=tm
231+
pnpm exec crowdin pre-translate --branch ${CROWDIN_BRANCH} --translate-untranslated-only --method=tm
232232

233233
i18n-pretranslate-approve-all:
234-
pnpm exec crowdin pre-translate -- --branch ${CROWDIN_BRANCH} --translate-untranslated-only --method=tm --auto-approve-option=all
234+
pnpm exec crowdin pre-translate --branch ${CROWDIN_BRANCH} --translate-untranslated-only --method=tm --auto-approve-option=all
235235

236236
i18n-download-translations: i18n-extract-frontend
237237
touch kolibri/locale/.crowdin-download-marker
238-
pnpm exec crowdin download -- --branch ${CROWDIN_BRANCH}
238+
pnpm exec crowdin download --branch ${CROWDIN_BRANCH}
239239
@if [ -z "$$(find kolibri/locale/*/LC_MESSAGES -type f \( -name '*.po' -o -name '*.csv' \) -newer kolibri/locale/.crowdin-download-marker 2>/dev/null)" ]; then \
240240
echo "❌ ERROR: No translation files were downloaded - Crowdin download may have failed silently"; \
241241
echo "Check the output above for errors during the download process"; \
@@ -245,16 +245,15 @@ i18n-download-translations: i18n-extract-frontend
245245
@echo "✅ Translation files downloaded successfully"
246246
rm -f kolibri/locale/.crowdin-download-marker
247247
python build_tools/i18n/cleanup_unsupported_languages.py
248-
pnpm exec kolibri-tools i18n-code-gen -- --output-dir ./packages/kolibri/utils/internal
248+
pnpm exec kolibri-i18n code-gen --output-dir ./packages/kolibri/utils/internal
249249
$(MAKE) i18n-django-compilemessages
250-
pnpm exec kolibri-tools i18n-create-message-files -- --pluginFile ./build_tools/build_plugins.txt
250+
pnpm exec kolibri-i18n create-message-files --pluginFile ./build_tools/build_plugins.txt --ignore '**/node_modules/!(kolibri-common)/**','**/static/**'
251251

252252
i18n-download-source-fonts:
253253
python build_tools/i18n/fonts.py download-source-fonts
254254

255255
i18n-regenerate-fonts:
256-
python build_tools/i18n/fonts.py generate-full-fonts
257-
python build_tools/i18n/fonts.py generate-subset-fonts
256+
python build_tools/i18n/fonts.py generate-fonts
258257

259258
i18n-download: i18n-download-translations i18n-regenerate-fonts
260259

build_tools/i18n/cleanup_unsupported_languages.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#!/usr/bin/env python
2-
# -*- coding: utf-8 -*-
32
"""
43
Remove locale directories for languages not in language_info.json.
54

0 commit comments

Comments
 (0)