What's Changed
- Revert "feat(raven)!: sync channel membership from LMS rules" by @raizasafeel in #2720
- feat(raven)!: sync channel membership from LMS rules (backport #2706) by @mergify[bot] in #2723
- fix!: backport develop onto main-hotfix by @raizasafeel in #2824
- fix!: backport develop onto version-15-hotfix by @raizasafeel in #2821
- fix: keep students off assignment list pages after redirect (backport #2774) by @mergify[bot] in #2842
- fix(security): require quiz access to check an answer (backport #2818) by @mergify[bot] in #2866
- fix: sanitise JSON-shaped rich text on save (backport #2816) by @mergify[bot] in #2868
- fix(permissions)!: scope LMS Coupon to the courses and batches it discounts (backport #2815) by @mergify[bot] in #2867
- fix(quiz): render schedule badges as the true instant (backport #2835) by @mergify[bot] in #2869
- fix(security): cap how far an uploaded archive may expand (backport #2830) by @mergify[bot] in #2870
- fix(security): lock enrollment course, member and batch after insert (backport #2832) by @mergify[bot] in #2871
- fix(security): serve only the statistics charts from get_chart_data (backport #2828) by @mergify[bot] in #2872
- fix(security): check progress against the lesson's own course (backport #2833) by @mergify[bot] in #2873
- fix(security): scope batch authoring and lesson moves to the owning resource (backport #2831) by @mergify[bot] in #2874
- fix(perms): vouch lesson media on the lesson its owner created (backport #2827) by @mergify[bot] in #2875
- fix(security): only attach files the user uploaded for the document (backport #2834) by @mergify[bot] in #2876
- fix: let evaluators and creators save batch/course meta tags (backport #2836) by @mergify[bot] in #2877
- fix: secure send_confirmation_email against untrusted payload (backport #2642) by @mergify[bot] in #2881
- fix(signup): make the user category placeholder read as a prompt (backport #2810) by @mergify[bot] in #2878
- fix: put the cursor in Title when adding a chapter (backport #2851) by @mergify[bot] in #2880
- fix(batch): scope who can enroll without payment (backport #2847) by @raizasafeel in #2882
- fix: keep public and private course assets apart on import (backport #2825) by @mergify[bot] in #2884
- fix(security): keep scorm package deletion inside the chapter's own package (backport #2829) by @mergify[bot] in #2885
- fix(raven): migrate Raven conditions stored against the old rule vocabulary (backport #2837) by @mergify[bot] in #2886
- fix(badges): restrict who can assign a badge (backport #2846) by @mergify[bot] in #2890
- fix: scope batch evaluator writes on LMS Certificate (backport #2817) by @mergify[bot] in #2889
- fix(perms): put a question's explanation fields behind permlevel 1 (backport #2844) by @mergify[bot] in #2888
- feat(permissions)!: register the assessment permission pair (backport #2826) by @mergify[bot] in #2887
- fix(settings): link self-hosted sites to the Payments repo, not the marketplace (backport #2704) by @mergify[bot] in #2892
- perf: index the columns permission query conditions filter on (backport #2843) by @mergify[bot] in #2893
- feat(batch): let Course Creators manage the batches they are tagged on (backport #2845) by @mergify[bot] in #2894
- fix(import): limit what a course archive can create (backport #2895) by @mergify[bot] in #2901
- Fix 'User Category' select styling on signup form (backport #2906) by @mergify[bot] in #2908
- Revert "chore: update POT file (backport #2913)" by @raizasafeel in #2920
- fix: show configured limit for oversized lesson uploads (backport #2898) by @mergify[bot] in #2909
- fix: reject duplicate instructors in batches and courses (backport #2917) by @mergify[bot] in #2919
- fix: open course editor tab from getting started (backport #2763) by @mergify[bot] in #2930
- fix: limit onboarding lookups to managers and whitelist the batch one (backport #2929) by @mergify[bot] in #2935
- fix: inverted discount calculation for fixed amount coupons (backport #2896) by @mergify[bot] in #2931
- fix: assign the course owner as instructor in memory (backport #2688) by @mergify[bot] in #2932
- fix: polish save tooltip, preview badge and lesson title focus ring (backport #2916) by @mergify[bot] in #2934
- fix: assessment placement scope and settings review findings (backport #2918) by @mergify[bot] in #2933
- fix: scope evaluation edits and show saved assignment work to graders (backport #2954) by @raizasafeel in #2957
- fix(certificate): a learner reads and prints their certificate, and cannot change it (backport #2943) by @mergify[bot] in #2960
- feat(telemetry): send each step a site takes to Pulse (backport #2936) by @mergify[bot] in #2959
- fix(enrollment): limit enrolments and lesson notes to the people they belong to (backport #2942) by @mergify[bot] in #2961
- fix(courses): accept only the filters the course and batch lists offer (backport #2963) by @mergify[bot] in #2966
- fix: limit moderator access to user accounts (backport #2971) by @pateljannat in #2978
- fix(lesson): clean all lesson content on save, and keep it out of print (backport #2969) by @mergify[bot] in #2974
- fix(live-class): keep learners' emails private on invites, and retry invites Google fails (backport #2928) by @pateljannat in #2980
- fix(live-class): keep the start link for the staff who run the class (backport #2967) by @mergify[bot] in #2975
- fix(live-class): use only the batch's or your own conferencing account, and let only instructors schedule (backport #2970) by @pateljannat in #2982
- fix(live-class): retry invites while the calendar does not push (backport #2941) by @mergify[bot] in #2977
- fix: show the server's message when a course import fails (backport #2689) by @mergify[bot] in #2989
- fix(profile): refuse a first name of only spaces (backport #2944) by @mergify[bot] in #2988
- fix(courses): let enrolled students open unpublished courses (backport #2972) by @mergify[bot] in #2986
- fix: scope evaluation edits and show saved assignment work to graders (backport #2954) by @mergify[bot] in #2990
- fix(batch): limit restricted-batch self-enrollment to that batch's staff (backport #2947) by @mergify[bot] in #2992
- fix: export only course files the exporter may read (backport #2948) by @mergify[bot] in #2993
- fix(quiz): reject repeated questions in a quiz submission (backport #2945) by @mergify[bot] in #2994
- fix: escape the invite code on the sign-up page (backport #2949) by @mergify[bot] in #2995
- fix(quiz): serve private question images like lesson media (backport #2864) by @mergify[bot] in #2996
- feat: create a new lesson only once its title is typed (backport #2852) by @mergify[bot] in #2991
- fix: nine small bugs surfaced by the test cleanup (backport #2968) by @mergify[bot] in #2999
- fix: keep closed jobs and unpublished drafts out of guest reads (backport #2946) by @mergify[bot] in #2997
- feat: make course and batch creation easier to find (backport #2983) by @mergify[bot] in #2985
- fix: course ZIP import and lesson file types (backport #3002) by @pateljannat in #3004
- build: migrate to vite 8 (backport #2984) by @mergify[bot] in #3003
- fix: course ZIP re-upload, chart ranges and guest access for statistics and jobs (backport #3060) by @mergify[bot] in #3061
- fix: mark the invoicing consent checkbox as required (backport #3052) by @mergify[bot] in #3058
- fix: award badges to owner and skip manual ones on save (backport #3049) by @mergify[bot] in #3057
- fix: keep the settings dialog content within its width (backport #3048) by @mergify[bot] in #3056
- fix: let quizzes without questions count as passed (backport #3053) by @mergify[bot] in #3059
- fix: hide lesson progress for guests and explain locked lessons (backport #3036) by @mergify[bot] in #3055
- fix: job logo fallback and relative times in the site timezone (backport #3037) by @mergify[bot] in #3054
- fix: store course reviews as plain text and print them as text (backport #3069) by @pateljannat in #3076
- fix: fit the new course form, allow beautifulsoup4 4.15, and let Mergify open conflicting backports (backport #3075) by @mergify[bot] in #3078
- fix: open the newest question, show lesson tabs on first load, and publish releases to the marketplace (backport #3077) by @mergify[bot] in #3080
- feat(api): paging, missing inputs and fixes for scripts that use the API (backport #3062) by @pateljannat in #3082
- feat: add the frappe-learning agent skill, and let frappectl reach Learning methods (backport #3079) by @mergify[bot] in #3081
- fix: batch enroll button, reason when closed, and login redirect (backport #3035) by @mergify[bot] in #3088
- fix: fetch batch courses once the batch name is known (backport #3040) by @mergify[bot] in #3090
- fix: count only course lessons and cap progress at 100 (backport #3042) by @mergify[bot] in #3091
- fix: floor quiz submission score at zero (backport #3043) by @mergify[bot] in #3092
- fix: compare batch dates with getdate (backport #3044) by @mergify[bot] in #3093
- fix: return no results when the search index is missing (backport #3050) by @mergify[bot] in #3096
- fix: translate assessment type labels (backport #3045) by @mergify[bot] in #3094
- fix(programs): keep child rows and unsaved state on program save (backport #2937) by @mergify[bot] in #3084
- fix: send no caller another user's email (backport #2950) by @mergify[bot] in #3086
- fix: enrol program learners through the program's member table (backport #2940) by @mergify[bot] in #3085
- fix: mark required sign-up fields (backport #3051) by @mergify[bot] in #3097
- fix: check required fields before creating a record (backport #3047) by @mergify[bot] in #3095
- fix: batch page not-found state and Published badge for managers only (backport #3034) by @mergify[bot] in #3087
- fix: course page progress and certificate PDFs without letter head (backport #3039) by @mergify[bot] in #3089
- fix: pass create_lms_certificate's target to get_mapped_doc as a doc (backport #3103) by @mergify[bot] in #3105
- fix: keep stored file bytes intact on frappe version-16 (backport #3104) by @mergify[bot] in #3108
- fix(quiz): disambiguate option correctness and explanation labels in LMS Question (backport #3074) by @mergify[bot] in #3110
- fix: course outline fields, Getting started for moderators and the first-course flow (backport #3100) by @mergify[bot] in #3114
- fix: send the quiz unload beacon's CSRF token in the body (backport #3109) by @mergify[bot] in #3111
- fix(quiz): include CSRF token in unload submit beacon (backport #3005) by @mergify[bot] in #3112
- fix: batch progress, activity heatmap, POST-only actions and evaluation bookings (backport #3115) by @mergify[bot] in #3116
- fix(frontend): use the rebuilt import wizard, which frappe version-16 now ships by @pateljannat in #3123
- fix(frontend): open the data import on frappe version-15 and version-16 by @pateljannat in #3131
- fix(frontend): open the data import on frappe version-15 and version-16 by @pateljannat in #3132
- fix: scope access on assessments, certificates, programs, discussions and mentions (backport #3125) by @mergify[bot] in #3126
- fix: scope mentions, lesson embeds and SCORM files (backport #3135) by @mergify[bot] in #3148
- fix(search): let frappe build and schedule the learning index (backport #3149) by @mergify[bot] in #3151
- fix: show a neutral note for unknown content blocks (backport #3041) by @mergify[bot] in #3158
- fix(deps): replace vulnerable markdown and lxml with frappe's markdown2 (backport #3119) by @mergify[bot] in #3160
- fix: verify Razorpay orders and charge GST by billing address (backport #3136) by @mergify[bot] in #3164
- fix: scope evaluator access to their batches' quizzes (backport #3134) by @mergify[bot] in #3163
- fix: scope batch announcements and records filed by learners (backport #3137) by @mergify[bot] in #3165
- fix(batches): show students active batches, not only upcoming (backport #3120) by @mergify[bot] in #3161
- fix: quiz access message, card enroll message and upcoming batches for students (backport #3169) by @mergify[bot] in #3170
- feat: redesign assessment blocks and render them inline in lessons (backport #2823) by @mergify[bot] in #3167
- feat: preview assessment blocks as summary cards in the lesson editor (backport #2838) by @mergify[bot] in #3168
- feat(quiz): quiz sharing, proctored attempt and result improvements (backport #2907) by @mergify[bot] in #3166
- fix: disable batch Save until the settings change, as on courses (backport #3181) by @mergify[bot] in #3188
- fix: stop a scroll swipe from reordering the course outline on touch (backport #3182) by @mergify[bot] in #3187
- fix: prevent duplicate course certificates from concurrent requests (backport #3122) by @mergify[bot] in #3185
- fix: record exercise results only from the grading endpoint (backport #3128) by @mergify[bot] in #3184
- fix: evaluator save and currency picker access (backport #3038) by @mergify[bot] in #3186
- feat: redesign evaluator availability as a weekly hours table (backport #3139) by @mergify[bot] in #3183
- fix: lesson videos with non-Latin file names, same-day class reminders and OAuth sign-in (backport #3195) by @mergify[bot] in #3199
- fix: say when a search or filter matched nothing (backport #3046) by @mergify[bot] in #3205
- feat: helpful empty states across lists, dashboards and batch tabs, and a day-1 email for new trial sites (backport #3201) by @mergify[bot] in #3202
- fix(quiz): truncate list titles and shorten length errors (backport #3189) by @mergify[bot] in #3193
- feat: enforce completion and passing per item, close video skip gaps (backport #3155) by @mergify[bot] in #3211
- fix(quiz): don't lose a submit pending when the page closes (backport #3194) by @mergify[bot] in #3209
- feat: enroll many students at once from course and batch dashboards (backport #3154) by @mergify[bot] in #3210
Full Changelog: v2.63.0...v15.0.0